Linux I/O模型
I/O:指的是计算机的input和output
Linux 的 I/O
-
磁盘I/O
-
网络I/O : 一切皆文件,本质为对socket文件的读写
磁盘 I/O
-
进程向内核发起系统调用,请求磁盘上的某个资源比如是html文件或者图片,
-
然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,
-
加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。
网络 I/O
网络通信就是网络协议栈到用户空间进程的IO就是网络IO
-
1.用户发送http请求报文到达web服务器网卡
-
2.网卡将收到的请求报文复制到内核空间
-
3.内核空间再把请求复制到用户空间的应用程序
-
4.应用程序分析请求并把请求发送给内核
-
5-6.内核将磁盘上的文件加载到内核空间,
-
7.内核空间将数据复制到用户空间
-
8.用户空间封装响应报文发送给内核空间
-
9.内核空间再通过网卡将响应报文发送出去。
I/O 模型
I/O 模型相关概念:
同步和异步:
关注的是消息的通知机制(调用者和被调用者之间的消息通知关系)
同步:sync
被调用者不提供事件的处理结果。需要调用者主动讯问
A安排B干一件事,B干完了A不问,B就不说
异步:async
被调用者通过状态通知机制主动告诉被调用者自己的状态。
A安排B干一件事,B干完了A不问,B也要主动说。
阻塞和非阻塞:
阻塞:blocking
结果返回前,干不了别的的事。
A找B干活,B没做完之前,A不能做别的事。
非阻塞:noblocking
A找B干活,B没做完,A就去做别的事。
缓冲和缓存
Buffer:
缓冲区,把大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数 --- 写数据到磁盘
例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。
Cacahe:
缓存,为了弥补高速设备和低速设备的鸿沟而引入的中间层,起到加快访问速度的作用。 --- 读数据到内存
例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后CPU再次访问同一个资源,速度会快很多。
网络 I/O 模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
阻塞型(同步阻塞):
程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求
阻塞段:
-
内核将数据从磁盘复制到内核空间
-
内核空间再把数据复制到用户空间
缺点:
一个客户端就会占用一个进程,这个进程完成请求之前会一直处于等待的状态。不能实现高并发。
非阻塞型 I/O 模型:
用户发起IO请求后不等待,而是立即返回,但是会不断询问内核空间是否准备好数据,内核空间准备好数据后,将数据从内核空间复制到用户空间这个阶段会阻塞。
阻塞段:
- 内核空间复制数据到用户空间
问题:
即 “轮询”机制会大量消耗CPU资源,也不适合高并发
多路复用 I/O 型:
通过一个代理程序,用户将这些请求交给代理程序,代理程序集中用户的请求后,统一交给系统内核处理,用户只需要等待代理程序返回结果就行。
三种代理程序:select,poll,epoll
阻塞段:
-
等待代理程序返回请求信息(内核空间是否准备好数据)
-
内核空间数据复制到用户空间
信号驱动式 I/O 模型:
用户发请求后不等待内核准备好数据,而是去做其他的事,内核在数据准备好后,会发送信号通知进程。后面内核再把数据从内核空间拷贝到用户空间。
阻塞段:
内核空间数据复制到用户空间(内存对拷速度比较快)
优点:
让进程做更多的事情,可以提高并发性。
缺点:
信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知
异步 I/O 模型:
进程发起请求后,不等待内核空间准备好数据,内核空间准备好数据,把数据从内核空间拷贝到用户空间后,再通知进程。进程直接处理最终结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了