Unix-IO-同步,异步,阻塞,非阻塞-笔记篇

错误的四个象限分类

正统的五种unix-io模型

Blocking IO Model
Unblocking IO Model


IO Multiplexing Model


Asynchronous I/O

图片来自netty权威指南

小结

之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。

synchronous IO:当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。
asynchronous IO:则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

一个恰当的比喻(没有第四种)

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

参考:

https://blog.csdn.net/historyasamirror/article/details/5778378
https://www.zhihu.com/question/19732473
https://www.ibm.com/developerworks/cn/linux/l-async/index.html

posted @ 2019-08-12 09:50 聚变归来 阅读(...) 评论(...) 编辑 收藏