问答题 请分别说明阻塞(blocking)和非阻塞(non-blocking)I/O应该使用的基本情形。为什么不可以只实现非阻塞I/O,而且使用非阻塞I/O来实现阻塞I/O?
【正确答案】
【答案解析】一般说来,阻塞I/O比较适合于只是等待某个特殊事件的过程。例如磁盘、磁带和键盘的读操作,没有从这些设备中获得足够的信息就无法进行下一个步骤。
倘若I/O来自多个设备源,而且I/O到达的次序是不确定的时候,非阻塞I/O就非常有效。例如,网络服务器需要读取来自网络的多个请求;窗口管理器既可以读取键盘输入又可以获得鼠标输入等等。
如果只实现非阻塞I/O,那么在需要阻塞I/O时应用程序则需“忙”等待。
注: (1)阻塞I/O和非阻塞I/O分别称为同步I/O和异步I/O,它们是操作系统提供给上层应用的两种I/O接口方式。必须与程序控制I/O、中断驱动I/O、DMA I/O等方式区分开来,后者是操作系统与设备之间的接口。
(2)异步I/O通常出现在一些管理程序中,比如web服务器。操作系统的I/O管理程序也通常使用异步I/O,比如copy命令。操作系统利用I/0缓冲和异步I/O使得源设备和目标设备全速运转。
(3)非阻塞对于程序员来说比较复杂,因为程序员必须在I/O发生时进行异步汇聚(asynchronous rendezvous),利用语言特征和操作系统的例程完成I/O与处理机的协调。这也是操作系统提供同步I/O接口的必要性,即它可以简化编程逻辑。