V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ruandao
V2EX  ›  问与答

阻塞 非阻塞 ? IO 模型 请教下

  •  
  •   ruandao · 2019-11-19 09:38:39 +08:00 · 1527 次点击
    这是一个创建于 1857 天前的主题,其中的信息可能已经有所发展或是发生改变。

    等待数据到来 这个 决定了 block / nonblock

    进行数据拷贝 那这个呢?异步 IO 是数据已经拷贝完成的吧?

    nodejs 应该是等数据已经拷贝完成 才调用用户的事件处理函数的吧?

    第 1 条附言  ·  2019-11-21 15:29:08 +08:00
    能这么理解吗?


    同步 我调用你
    异步 你通知我(你调用我)
    阻塞 等待数据 ok,再返回
    非阻塞 不管数据是否 ok,立即返回数据是否 ok
    8 条回复    2019-11-19 16:28:41 +08:00
    wly19960911
        1
    wly19960911  
       2019-11-19 09:42:39 +08:00
    阻塞和非阻塞指的是 work thread,如果是异步阻塞的话,需要更多的 work thread 带来的开销更大,而异步非阻塞能使用少量的 work thread 来排队,而 io 线程交给线程池处理,减少开更多线程的切换开销,适合 IO 密集型而非 计算密集型。
    wly19960911
        2
    wly19960911  
       2019-11-19 09:43:21 +08:00
    @wly19960911 记错单词, 是 worker thread ,工作线程。
    ruandao
        3
    ruandao  
    OP
       2019-11-19 15:08:25 +08:00
    @wly19960911 异步阻塞 要怎么弄? 按下面的描述的话,异步,不存在阻塞的?

    同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起 IO 请求后需要等待或者轮询内核 IO 操作完成后才能继续执行;而异步是指用户线程发起 IO 请求后仍继续执行,当内核 IO 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
    wly19960911
        4
    wly19960911  
       2019-11-19 16:10:23 +08:00
    @ruandao 我可能解释错误了,不好意思,阻塞和非阻塞是相对的,同步代码下面你还是会被阻塞,多线程的某个线程你仍然也会被阻塞,但是多线程仍然是异步。而阻塞和非阻塞是因为非阻塞采用了事件队列进行轮询 / event loop,这种非阻塞式 IO 的模型实现的,将事件拆成回调的形式,等辅助用的 IO 线程结束后,才将回调加入队列里面等待执行,最大程度的减少阻塞和线程切换开销。

    另外你可以认为 worker thread 就是用户线程,通过队列机制,采用回调机制来安排 worker thread 减少开销。再上面的 协程 就是利用回调链,包装一次回调函数,让回调不用写在回调函数里面而是写成链式或者同步的样子( async await )。
    wly19960911
        5
    wly19960911  
       2019-11-19 16:12:45 +08:00
    ”同步和异步是相对的,同步代码下面你还是会被阻塞“ => "阻塞和非阻塞是相对的,同步代码下面你会被阻塞"
    wly19960911
        6
    wly19960911  
       2019-11-19 16:13:39 +08:00
    状态不好,老打错字,忽略下五楼

    ”阻塞和非阻塞是相对的,同步代码下面你还是会被阻塞“ => "同步和异步是相对的,同步代码下面你会被阻塞"
    Raymon111111
        7
    Raymon111111  
       2019-11-19 16:17:37 +08:00
    可以多搜搜, 阻塞 /非阻塞 和 同步 /异步 完全不是一回事, 也不是一个维度的东西.

    比如:

    First Let's talk about IO. When we have slow IO this is most apparent, but IO operations can either be blocking or non-blocking.  This has nothing to do with threads, it has to do with the interface to the operating system.  When I ask the OS for an IO operation I have the choice of waiting for all the data to be ready (blocking), or getting what is available right now and moving on (non-blocking).
    houzhimeng
        8
    houzhimeng  
       2019-11-19 16:28:41 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:38 · PVG 05:38 · LAX 13:38 · JFK 16:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.