`

IO 模型

    博客分类:
  • Unix
阅读更多
Unix下可用的5种I/O模型:
  • 1、阻塞式IO
  • 2、非阻塞式I/O
  • 3、I/O复用(select和poll)
  • 4、信号驱动式(SIGIO)
  • 5、异步I/O

一、阻塞式I/O模型
难道这个是传说中的一条道跑到黑?

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

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

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

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

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


参考资料:
UNP 卷1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics