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

2019-11-19 09:38:39 +08:00
 ruandao

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

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

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

1451 次点击
所在节点    问与答
8 条回复
wly19960911
2019-11-19 09:42:39 +08:00
阻塞和非阻塞指的是 work thread,如果是异步阻塞的话,需要更多的 work thread 带来的开销更大,而异步非阻塞能使用少量的 work thread 来排队,而 io 线程交给线程池处理,减少开更多线程的切换开销,适合 IO 密集型而非 计算密集型。
wly19960911
2019-11-19 09:43:21 +08:00
@wly19960911 记错单词, 是 worker thread ,工作线程。
ruandao
2019-11-19 15:08:25 +08:00
@wly19960911 异步阻塞 要怎么弄? 按下面的描述的话,异步,不存在阻塞的?

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

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

”阻塞和非阻塞是相对的,同步代码下面你还是会被阻塞“ => "同步和异步是相对的,同步代码下面你会被阻塞"
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
2019-11-19 16:28:41 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/620895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX