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 模型:

进程发起请求后,不等待内核空间准备好数据,内核空间准备好数据,把数据从内核空间拷贝到用户空间后,再通知进程。进程直接处理最终结果。
五种IO模型的区别:

 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号