图解五种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模型的演变都是针对这两个阶段进行不同改造


2,非阻塞I/O模型

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

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

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


3,I/O多路复用模型

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

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



4,信号驱动I/O模型

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


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


5,异步I/O模型

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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值