和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

异步、阻塞、非阻塞、信号驱动、复用的 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 则彻底进行了改进,使用链表+红黑树保存

posted @ 2021-09-29 17:41  klaus08  阅读(49)  评论(0编辑  收藏  举报