异步、阻塞、非阻塞、信号驱动、复用的 IO方式理解
首先一点,I/O都有两个必要的过程:
- 等待数据(另一个进程 -> 内核)准备好
- 从内核向进程复制数据
然后借此想象‘请事务繁忙的老板吃饭’,也有两个过程:
- 到机场迎接老板
- 把老板带到餐厅。
以此为情景
阻塞式I/O
请老板吃饭,不能让老板等自己啊。所以一直在机场等着接机,老板一下来,就带着他到餐厅,然后吃饭。(期间自己一直在机场啊,啥都干不了啊😥)
非阻塞式I/O
老板给钱不够,不想一直苦等他。所以可能是每隔一个小时去看一次,老板到了的话,带他去餐厅,然后吃饭;老板要是没到,就回去了呀,泡泡脚看看电影,一个小时后再去看看。(一般到机场都是很远的,所以这一个小时也没能做什么事情)
2021-11-05更:
理解错了,非阻塞I/O并不是自己去看,而是通过系统调用的方式检查数据是否ready(老板是否到达)。
不过同样,CPU 要处理更多的系统调用,因此这种模型的 CPU 利用率比较低。
信号驱动I/O
随便花钱雇一个人在机场监视老板的身影,反正最后只要老板到的时候陪老板就好了。所以商量一下让别人去机场看着,老板到了之后call一下自己,然后火速赶到机场,带老板去餐厅吃饭。(舒服了)
信号复用
又要请老板吃,还有请总裁啊什么巴拉巴拉的。老样子,还是花钱请人来帮忙看老板他们的身影,一旦发现就通知自己,不过这个人深受电影《功夫》的影响,通知你的方式可能是发一个信号弹!!(老大,自己人)
异步I/O
同样是请老板吃饭,不过身份不同了,可能是合作伙伴请客。所以合作伙伴派出了一个小弟在机场等老板,老板到了之后呢,由小弟带领老板到餐厅,然后吃饭。(从头到尾合作伙伴做的事只有派出小弟,然后一直在忙自己的事情了)
看这里,搭配服用效果更佳。
I/O多路复用
主要有select、poll、epoll三种方法。
select 文件描述符使用bitmap保存,一般限制大小为1024;
poll 稍微做了改进,扩大了文件描述符的个数;
epoll 则彻底进行了改进,使用链表+红黑树保存
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15353872.html