IO 模型

[b]Unix下可用的5种I/O模型:[/b]
[list]
[*]1、阻塞式IO
[*]2、非阻塞式I/O
[*]3、I/O复用(select和poll)
[*]4、信号驱动式(SIGIO)
[*]5、异步I/O
[/list]
[b]一、阻塞式I/O模型[/b]
难道这个是传说中的一条道跑到黑?

[b]二、非阻塞式I/O模型[/b]
相当于网上订票,不停的刷页面,看有余票没?没有的话不停地刷,刷到有票开始订购。这比喻不知道合适不?
进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要使本线程睡眠,而是返回一次错误。
当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询。应用程序持续轮训内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间。
进程反复调用recvfrom等到返回成功指示。

[b]三、I/O复用模型[/b]
[b]select[/b]和[b]poll[/b]
进程受阻于select调用,等到可能多个socket中的任意一个变为可读。
当返回的套接字可读,我们在调用recvfrom把所读的数据报复制到应用进程缓存区。

[b]四、信号驱动式I/O[/b]
我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们,我们称这种模型为信号驱动式I/O。
我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它读取数据报。

[b]五、异步I/O[/b]
机制是告知内核启动某个操作,并让内核在整个操作完成后通知我们。
这种模型与四信号驱动式的主要区别在于:
信号驱动式是由内核通知我们何时可以启动一个I/O操作。
而异步I/O是由内核通知我们I/O操作何时完成。
[b]阻塞式I/O[/b]
[i]发起——阻塞——>完成[/i]
[b]非阻塞式I/O[/b]
[i]检查、检查...——阻塞——>完成[/i]
[b]I/O复用[/b]
[i]检查——阻塞——>就绪发起——阻塞——>完成[/i]
[b]信号驱动式[/b]
[i]通知发起——阻塞——>完成[/i]
[b]异步I/O[/b]
[i]发起 通知[/i]

可见前四种模式最后都是阻塞的。
[list]
[*]同步I/O操作导致请求进程阻塞,直到I/O操作完成
[*]异步I/O不导致请求进程阻塞
[/list]

参考资料:
UNP 卷1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值