IO 模型详解

I/O类型:

        同步和异步

        阻塞和非阻塞

一次read操作两个阶段:用户空间的进程没有权限访问磁盘的,进程发起IO调用

(1)等待数据准备好:内核从磁盘中的数据加载至内核内存

(2)真正IO的阶段:内核内存数据在复制到进程内存(这个是真正执行IO的阶段)

        所以进程需要等待内核到内核内存和内核内存到进程内存的时间

1.同步和异步:synchronous,asyncronnous

关注的是被调用者的消息通知机制,被调用者如何通知调用者,调用者向被调用者进行系统调用函数

同步:调用发出之后不会立即返回,进程会一直询问内核准备好数据没有,但一旦返回,则内核返回最终结果,数据已经从内核内存复制到进程内存了(进程自己去询问内核,直到两阶段都复制完通知进程)没有通知机制

异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理(内核自己都把数据复制完了通知进程数据已经复制完)有通知机

2.阻塞和非阻塞:block,nonblock

关注的是调用者等待被调用者返回调用结果时的状态

阻塞:调用结果返回之前,调用者会被挂起,叫不可中断睡眠,调用者只有在得到返回结果时候才能继续。(两阶段都阻塞)

非阻塞:调用者在结果返回之前不会被挂起,即调用不会阻塞当前进程(第一阶段不阻塞,第二阶段依然阻塞)

 

同步 是进程调用内核,内核从磁盘读取数据存入内核内存这段时间,进程会一直询问内核准备好数据没有,直到全部读进内存准备好了,然后告诉进程来内核内存来复制数据。

异步 是进程调用内核,内核从磁盘读取数据存入内核内存这段时间进程是活动的,不需要等待内核准备好数据,当内核从磁盘数据全部读取,然后通知进程过来复制数据到进程内存,或者通过回调函数来处理。

阻塞 是进程调用内核,内核从磁盘读取数据的这段时间,进程是被挂起的或者叫不可中断睡眠处于等待状态,只有内核告诉进程准备好之后,才会继续够继续工作(比如从内核内存复制数据)

非阻塞 是进程调用内核,内核从磁盘读取数据的这段时间,进程不会被挂起

1 阻塞IO 同步阻塞IO是进程调用内核,内核从磁盘读取数据至内核内存的时候,进程处理等待状态,准备好数据,进程就复活复制数据,第二阶段进程复制数据,进程依然在等待,所以第一第二阶段依然是阻塞的,是同步的IO 

 IO 模型详解

 

 

 2 非阻塞IO          

非阻塞是内核不通知进程,进程会几秒钟询问内核数据准备好了没,时间都花在询问的过程了,叫盲等待,第一段非阻塞,但第二阶段依然是阻塞状态,从内核内存复制到进程内存,进程依然是等待状态处于阻塞状态,所以比起阻塞依然没有太大优势,是同步的IO

  IO 模型详解

优点:能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。
缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。
这会导致整体数据吞吐量的降低。


3 IO多路复用       
IO复用指的是任何一个进程,在某种情况下进程自身只能处理一个IO,但是web是要处理两路IO的,一个是网络IO,另外一个磁盘IO,内核中开发了多路IO或IO复用,进程需要调用IO的时候,都把IO请求交给内核中的select()函数或者poll()函数,最大不能超过1024个,如果超过1024个性能会减少,函数能够处理两个IO,处理网络和磁盘IO
 
IO 模型详解

 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

注意:网络操作、文件操作、终端操作等均属于IO操作,      网络IO中:windows只支持Socket操作,其他系统支持其他网络IO操作,但是无法自动检测 普通文件 自从上次读取之后是否已经变化。  注意1:select函数返回结果中如果有文件可读了,那么进程就可以通过调用accept()或recv()来让kernel将位于内核中准备到的数据copy到用户区。

 

4 异步IO              
 
用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,   
  首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切  
  都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了

五种IO模型的比较

IO 模型详解