简单来说,阻塞IO和非阻塞IO是什么?

10

你如何向一个普通人解释阻塞IO和非阻塞IO?我发现这些概念在我们许多程序员中并不是很清楚。

3个回答

10

阻塞I/O意味着程序在I/O进行时被暂停执行。因此,程序会等待I/O完成,然后再继续执行。

在非阻塞I/O中,程序可以在I/O操作期间继续执行。


7
当IO操作完成时,通过回调通知用户,这会迫使您以不同的方式设计程序,但会使它们表现更好。 - Vinko Vrsalovic
@Lex,有阻塞和非阻塞操作的示例吗?谢谢。 - Kalanidhi
1
@etc_passwd 在JS中很容易理解;调用alert();是阻塞的,因为执行被暂停直到用户点击OK。AJAX调用是非阻塞的,当HTTP请求正在发送时继续执行。 - user254875486

4
这是一个并发问题。通常情况下,操作系统内核从用户程序接收到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可能仅阻止一个线程时,为多线程程序安排时间表也使问题更加复杂,但这是另一个问题...

0
简单来说,非阻塞 I/O(异步)允许在其执行操作时进行其他操作,而阻塞 I/O 则会阻止其他操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接