2009-09-26 200 views

回答

9

阻塞I/O意味着程序执行在I/O进行时处于暂停状态。所以程序一直等到I/O完成,然后继续执行。 在非阻塞I/O中,程序可以在I/O操作期间继续。

+7

...并通过该通知IO操作完成时回调。这迫使你以不同的方式设计你的程序,但会使它们表现得更好。 – 2009-09-26 08:05:58

+0

@ Lex,阻塞和非阻塞操作的任何示例?谢谢。 – Kalanidhi 2014-01-08 07:15:19

+1

@etc_passwd在JS中很容易理解;对alert();'的调用是阻塞的,因为执行被搁置,直到用户点击OK。 AJAX调用是非阻塞的,在发送HTTP请求时继续执行。 – 2014-01-08 09:31:24

0

只是说..非阻塞I/O(异步)允许进行其他操作,同时完成其东西和阻塞I/O会阻止其他操作

4

这是一个并发性问题。在正常情况下,在OS内核从用户程序接收到I/O操作后,该程序不会再次运行,直到I/O操作完成。其他计划通常在此期间安排。

这解决了很多小问题。例如,程序如何知道有多少字节被读取,除非I/O在read(2)返回时完成?如何在write(2)返回时仍在进行操作的情况下如何重用write(2)缓冲区?显然,真正的异步I/O需要更复杂的接口。

最终可以归结为:

  1. I/O方面同步发生的程序,直到I/O完成
  2. I/O仅仅是通过系统调用计划阻止该程序,并且存在一些通知机制来传达实际结果
  3. 如果I/O操作无法立即完成,那么I/O操作只会失败。在实践中,这是“非阻塞”I/O更常见的用法。

整个问题由工作调度多线程程序时,I/O可以想见阻止只有一个线程而且复杂,但是这是一个不同的问题...