I/O复用模型

来源:互联网 发布:淘宝香港发货是真的吗 编辑:程序博客网 时间:2024/05/29 15:30

I/O复用模型

     首先为什么需要I/O模型呢,因为进程是无法直接操作I/O设备的。其必须通过系统调用请求kernel来协助完成I/O动作。
   而内核会为每个I/O设维护一个buffer。
   对于输入而言,等待数据输入到buffer需要时间的,而从buffer复制数据给进程也需要时间的。
   根据等待的模式不同,I/O分为五类。

一.Blocking I/O(阻塞IO)
二.Nonblocking I/O(非阻塞IO)
三.IO mutiplexing(select和poll) (IO复用)  
四.single driven I/O (SIGIO)(信号驱动的IO)
五.asynchronous I/O (异步IO)

阻塞I/O



阻塞是什么意思呢。一个进程请求了数据文件,这时就向内核提交IO申请,内核去处理这个IO请求,将磁盘上的数据拷贝到buffer中。数据拷贝结束后,内核再从buffer中将数据拷出来给进程,在这个过程中,进程只能做等待不能去做其他的事。直到进程将数据返回。


非阻塞IO




非阻塞IO和阻塞IO有个区别,那就是,阻塞IO在等待数据从磁盘拷入到内核的Buffer中时,他不停的询问数据是否准备好,是否准备好,是否准备好,当数据从磁盘到内核中后就不询问了,当然,这时还需要buffer中的数据再给进程才可以。

IO复用



     IO复用,这个进程请求数据后,在内核从IO上取数据时,这个过程是阻塞的,当数据准备好时,内核返回一个可读条件,进程再次发起一个系统调用,当再次发起系统调用时,又阻塞了。整个过程分为了两段,每段是独立执行的。就是数据从磁盘拷到buffer里,但是我不系统调用,我也不需要阻塞。


信号驱动IO

    

   当进程想要数据了,发起系统调用,调用后不用阻塞,而是由内核返回一个信号处理程序,进程可以再去做其他的事情。内核处理好了,会发一个信号给进程,这时进程再系统调用,然后阻塞。由图可得这是个异步的过程。前半部分不用阻塞,而后半部分需要阻塞。


水平触发:通知不到,不停通知
边沿触发:通知一遍,就不通知了

异步IO



    两个过程都不阻塞。程序可以随意运行。

最后来一个总结。
原创粉丝点击