提到I/O模型,会有几个概念:
- 阻塞I/O
- 非阻塞I/O
- 同步I/O
- 异步I/O
这里会有四种组合:
- 同步阻塞I/O
- 同步非阻塞I/O
- 异步阻塞I/O
- 异步非阻塞I/O
在解释这些概念之前首先需要先明确一些问题。
- 对于I/O操作一共参与方除了《应用程序》,《I/O对象,比如file,socket》,还有《操作系统》
在这里需要说明操作系统扮演着很重要的元素。因为很多种实现中需要操作系统作为“中介方”-提供服务。
- 不同操作系统在扮演“中介方”的具体实现上可能有些不同,但是并不影响上述概念。
一个应用发出了一次I/O操作后(read/write),其实接下去有两件事情需要注意:
- 由谁去检查是否可以进行操作了
- 在发出操作至确认可以去操作的那段时间中应用可以做什么
- 如果是应用自己负责去检查(通常是轮训)则是同步的。
- 而如果是系统负责通知(多路复用,信号驱动)则是异步的。
异步模式下:由于检查是否可以进行操作有系统负责了,所以应用便可以选择是在阻塞还是飞阻塞模式下工作了。
这里一个关键问题是系统是如何负责通知应用的,这个与操作系统底层有比较紧密的联系。比如linux提供select和epoll函数,及信号量机制。但是这些还不是真正的异步。
而接下来,无论是linxu还是windows都会支持真正的异步模式,对于java这个特性需要jdk7才能够支持了。

参考帖子:
http://blog.youkuaiyun.com/kangojian/archive/2010/07/03/5710977.aspx
http://www.iteye.com/topic/868702#1847693
http://www.ibm.com/developerworks/cn/linux/l-async/
I/O模型详解
本文深入解析I/O模型中的核心概念,包括阻塞与非阻塞、同步与异步的区别,并探讨了不同操作系统如何处理I/O请求,以及这些机制对应用程序性能的影响。
1419

被折叠的 条评论
为什么被折叠?



