有些人认为异步就是非阻塞,同步就是阻塞。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先 限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。
本文最重要的参考文献是Richard Stevens的“UNIX®
Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O
Models ”,Stevens在这节中详细说明了各种IO的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。
Stevens在文章中一共比较了五种IO
Model:
blocking IO
nonblocking IO
IO multiplexing
signal driven IO
asynchronous IO
由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。
举几个不是很恰当的例子来说明这四个IO
Model:
有A,B,C,D四个人在钓鱼:
A(阻塞)用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;
B(非阻塞)的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;
C(IO复用)用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;
A,B,C都属于同步IO。
D(异步IO)是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信。
本文通过类比的方式解释了阻塞IO、非阻塞IO、IO复用及异步IO的概念,并结合Richard Stevens著作中的内容,详细阐述了它们在Linux环境下网络IO的应用。

被折叠的 条评论
为什么被折叠?



