59

曾几何时,我偶然看到Indy 简介文章,从那时起就无法停止思考阻塞与非阻塞 IO。

寻找一些好的文章来描述阻塞 IO 和非阻塞 IO 的优缺点以及如何在每种情况下设计您的应用程序以获得自然、易于理解和易于维护的代码。
想了解大图...

4

2 回答 2

77

阻塞 IO 意味着给定线程在完全接收到 IO 之前不能再做任何事情(在套接字的情况下,这个等待可能会很长时间)。

非阻塞 IO 意味着一个 IO 请求立即排队并且函数返回。实际的 IO 会在稍后由内核处理。

对于阻塞 IO,您要么需要接受要等待每个 IO 请求,要么需要为每个请求触发一个线程(这将很快变得非常复杂)。

对于非阻塞 IO,您可以发送多个请求,但您需要记住,数据直到某个“稍后”点才可用。检查数据是否实际到达可能是最复杂的部分。

在 99% 的应用程序中,您不需要关心您的 IO 阻塞。但是,有时您需要允许自己发起 IO 请求,然后在返回之前执行其他操作并希望发现 IO 请求已完成的额外性能。

无论如何,只是我的遗憾。

编辑:要回答如何设计用于处理阻塞 IO 的应用程序同时具有良好的性能,协程可能是一个很好的选择。

于 2009-08-06T21:11:29.457 回答
35

正面和负面非常明确:

阻塞 - 线性编程,更容易编码,更少控制。
非阻塞 - 并行编程,更难编码,更多控制。

于 2009-08-06T21:11:23.950 回答