网络编程io总结区分。阻塞,非阻塞,异步,同步

来源:互联网 发布:淘宝视频拍摄设备 编辑:程序博客网 时间:2024/05/16 03:52

借鉴提炼自http://blog.csdn.net/historyasamirror/article/details/5778378

在网络编程中,肯定会有读写io的问题。这时候就会有了五种io模型。取自unix network  programing

五种模型分别是,阻塞,非阻塞,io多路复用(select poll epoll),信号驱动,异步。

这五种有时候容易出现混乱。网上博客写的也比较晦涩,不过看那本书里的图形倒是很有趣很清晰。源自于文末的博客。



在io处理中有两个重要步骤,1,提出io需求,等待内核准备好。2,从内核传送数据回来。从内核拷贝回进程。

这时候两步,区分出了五种io区别。

1.阻塞,在1,2时都是在等待内核返回,函数就停在那了。用的都是recvfrom系统调用。


2.非阻塞,在1,时候立马返回一个错误值,这样时不时的去循环查询,直到,返回ok,之后再处理2。


3.io多路复用,在1,的时候调用了select,poll,epoll等函数,这时候就是交给他们处理了。合理后调用recvfrom处理2.这里调用了两个系统调用。


4.信号驱动,这个用的比较少了。不多说了。

5.异步,在1,的时候每一步都有一个返回。而到2处理完直接返回。





同步异步,同步是指进程阻塞直到io操作完成,而异步是立马完成,这儿的io操作是recvfrom系统调用。

阻塞非阻塞关键看调用者也就是左边是否立马得到结果。同步异步考虑的是双方的关系。阻塞非阻塞是我这个请求者的状态。而同步异步是双方的沟通方式。

比如买书,阻塞非阻塞,阻塞是一定要等到最后好的结果。非阻塞是立马得到结果无论好坏。而同步异步则是两边的沟通方式,一直在这等着结果,还是有结果后打电话通知?



这篇博客还有一段例子很不错。分别总结了1,2,3,5四种例子。生动形象。

最后,再举几个不是很恰当的例子来说明这四个IO Model:
有A,B,C,D四个人在钓鱼:
A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;
B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;
C用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;
D是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信。

0 0