[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
[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