首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

图解5种I/O模型

2013-10-08 
图解五种I/O模型原文见 http://www.quora.com/Computer-Programming/How-is-asynchronous-IO-implemented-

图解五种I/O模型

原文见 http://www.quora.com/Computer-Programming/How-is-asynchronous-IO-implemented-in-programming-languages

带下划线的部分是我的理解和译注


有五种I/O模型。

下图针对网络I/O,但磁盘I/O等其它I/O形式都是类似。


1,阻塞I/O模型

请求无法立即完成则保持阻塞。

整个过程分为两个阶段:

阶段一是等待数据就绪,网络I/O的情况就是等待远端数据陆续抵达;磁盘I/O的情况就是等待磁盘数据从磁盘上读取到内核态内存中。

阶段二是数据拷贝,出于系统安全,用户态的程序没有权限直接读取内核态内存,因此内核负责把内核态内存中的数据拷贝一份到用户态内存中。

理解这两个阶段非常重要,后续I/O模型的演变都是针对这两个阶段进行不同改造。

图解5种I/O模型

2,非阻塞I/O模型

请求不会阻塞, 而是立即返回错误码(EWOULDBLOCK) 
(通过调用fcntl,参数置为O_NONBLOCK)

图解5种I/O模型

阶段一频繁轮询的话,也很耗费CPU时间

这种方式对单个I/O请求意义不大,但给I/O多路复用铺平了道路.


3,I/O多路复用模型

调用 select / poll  该方法由一个用户态线程负责轮询多个sockets,直到某个阶段一的数据就绪,再通知实际的用户线程执行阶段二的拷贝.

通过一个专职的用户态线程执行非阻塞I/O轮询,模拟实现了阶段一的异步化

图解5种I/O模型


4,信号驱动I/O模型

阶段一演变为异步,由内核托管,应用程序只需告知内核,当阶段一数据就绪时向应用程序发出 SIGIO信号

图解5种I/O模型

至此为止,前述4种模型的阶段二仍是处于block状态的


5,异步I/O模型

告知内核,当整个过程(包括阶段一和阶段二)全部完成时,通知应用程序来读数据.

图解5种I/O模型

linux3.5已经有针对C的异步I/O API,细节略.


热点排行