【问题标题】:What is in simple words blocking IO and non-blocking IO?什么是阻塞 IO 和非阻塞 IO?
【发布时间】:2009-09-26 07:59:20
【问题描述】:

你会如何解释一个关于阻塞 IO 和非阻塞 IO 的简单凡人?我发现我们很多程序员对这些概念都不是很清楚。

【问题讨论】:

    标签: io


    【解决方案1】:

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

    【讨论】:

    • ... 并在 IO 操作完成时通过回调通知。这会迫使您以不同的方式设计程序,但会使它们的性能更好。
    • @Lex,有阻塞和非阻塞操作的例子吗?谢谢。
    • @etc_passwd 在 JS 中很容易理解;对alert(); 的调用被阻塞,因为执行被搁置,直到用户单击确定。 AJAX 调用是非阻塞的,在发送 HTTP 请求时继续执行。
    【解决方案2】:

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

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

    最终归结为:

    1. I/O 与程序同步发生,通过阻塞程序直到 I/O 完成
    2. I/O 仅由系统调用调度,并且存在一些通知机制来传达实际结果
    3. 如果不能立即完成,I/O 操作就会失败,这是一种妥协。这是实践中“非阻塞”I/O 的更常见用法。

    此外,当 I/O 可能只阻塞一个线程时,调度多线程程序的努力使整个问题变得复杂,但这是一个不同的问题......

    【讨论】:

      【解决方案3】:

      简单地说..非阻塞 i/o(异步)允许在它做它的事情时执行其他操作,而阻塞 i/o 会阻塞其他操作

      【讨论】:

        猜你喜欢
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2019-09-04
        相关资源
        最近更新 更多