首页 > 技术文章 > IO模型的介绍

tianjianng 2017-10-18 16:07 原文

Stevens 在文章中的一种IO Model:

****blocking IO    #阻塞 IO   (系统调用不返回结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错才返回)

 

****nonblocking IO #非阻塞IO (用户进程其实是需要不断的主动询问kernel数据准备好了没有)

 select/epoll (事件驱动)

优点:能够在等待任务完成的时间里做其它的任务即多个任务同时执行

缺点:1 循环调用recv()  幅度的占用CPU 这也是我们在代码中留一句time.sleep(2) 的原因,否则在低配

主机下极易出现卡机状态   2  任务完成的响应延迟增大了,因为每次都是周期循环这会导致数据吞吐量的降

 

****IO multiplexing  #多路复用IO (进程调用select, 整个进程会被block,同时kernel会‘监视’所有select 

负责的socket,当任何一个socket中的数据准备好了,select 就会返回,这个时候用户进程自动将数据 

从kernel拷贝到用户进程)

结论: select的优势在于可以处理多个索拉,不适用于单个连接

优点:占用资源少,不消耗太多cpu ,同时能够为多客户端提供服务,

缺点:该模型将事件探测和事件响应夹杂在一起,一旦事件响应的执行体庞大,则对整个模型是灾难性的。

 

****signal driven IO # 信号驱动 IO 

 

****asynchronous IO   #异步IO (用户开启进程,一方面立刻开始做其它的事,另一方面,从kernel的

角度当它受到io 后会立刻返回,不会对进程产生任何block,等待数据准备完成将数据拷贝到用户内存

结束后kernel会给用户进程发送一个signal,告诉它完成

 对于network IO 会经历两个阶段:

      1  等待数据准备 (waiting)

      2  拷贝到进程(copy)

区别: blocking vs non-blocking  (前者会一起调用block住对应 的进程直到操作完成

           

推荐阅读