Unix网络编程:阻塞、非阻塞、同步io、异步io的区别

在《Unix 网络编程》一书中讲到:在进行读操作的时候,一般要经历两个步骤,分别是内核准备数据(waiting for the data to be ready)和将数据从拷贝到数据区(copying the data from kernel to the process)。然后对应的两个阶段的不同操作形式就出现了五个I/O模型,分别是:

1)阻塞IO(blocking IO),两个阶段全部阻塞。
Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第1张图片

2)非阻塞IO(nonblocking IO),就是在第一个阶段轮询,且第一阶段是非阻塞的,调用recvfrom,会立刻得到返回值或准备好,或错误。

Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第2张图片

3)IO多路复用(IO multiplexing),第一个阶段阻塞于select/poll。

Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第3张图片

4)信号驱动IO(signal-driven IO),我认为epoll应该属于这个范畴。网上有一些博文把信号驱动和IO多路复用整合到一起,两者是共同点也不是共同点,就是说在第一阶段中,IO多路复用是阻塞的,它阻塞在select或poll函数;而信号驱动则是非阻塞的,它只等着第一阶段完成,来接收或信号或回调函数的通知说第一阶段完成,然后进行下一步操作。共同点是这两个IO模型是同时检测多个Socket,只有在这个时候,才有意义。如果仅仅一个Socket或较少Socket,使用这两个IO模型做并发应该不是好的选择。

Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第4张图片

5)异步IO(asynchronous IO),这个模型的话不闭多谈,你觉得呢?就是第一二阶段全部都交给内核搞定,当做完的时候,内核就给这个进程一个通知,再做接下来的事情。

Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第5张图片

6)各种IO一览表

Unix网络编程:阻塞、非阻塞、同步io、异步io的区别_第6张图片

 

理解一下所谓的阻塞与非阻塞。所谓的阻塞就是说在我们调用了一个函数的时候没有立刻返回,非阻塞就是会立刻返回。

网上有个博文举了例子来概括上面的模型(其中将IO多路复用和信号驱动IO归为一类),现引用如下:

有A、B、C、D四个人在钓鱼:

A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;

B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢在鱼没上钩之前,他就随意去玩了,可以玩手机斗地主,但是,他又得是不是地看看是否有鱼上钩,感觉这个人挺累;

C的鱼竿和B差不多,但是呢,他想了一个办法,就是同时放好几根鱼竿,然后守在旁边斗地主,一旦显示有鱼上钩了,他就将对应的鱼竿拉上来,在这里,我觉得显示"某鱼竿有鱼上钩"和显示“有鱼上钩了”的区别应该就是select和epoll的区别吧,不知道对不对,待验证。

D是有钱人,干脆雇个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信。内核挺不容易。

把原文链接放在这里:点击打开链接

记得还有一个例子是讲在饭馆排队等吃饭的,没找到。。。

你可能感兴趣的:(linux,数据结构)