用故事讲解四种主要的IO模型

沉静

今天小明入职的第一天,由于事情不多,下班的时候小明早早地就准备走了。

没想到公司所在的楼层人也太多了,所有人必须排队一个一个的上电梯,电梯满了之后,剩下的人就得在楼道里干等着,虽然可以刷刷手机,但是等待的时间还是挺无聊的。

画外音:公司所在楼层代表服务器,小明和同事代表服务器需要传送的数据,而电梯代表公司的 I/O 端口。小明和同事排队等电梯,是一种同步阻塞模型(Blocking I/O)。

第二天,小明觉得等电梯的时间也太无聊了,而且现在是夏天,天气热起来一群人挤在楼道里,也太难受了。

为了充分利用自己的时间,快下班的时候,小明决定找个能看到楼道的地方,带上自己的笔记本,时不时地扫一眼楼道,看看电梯有没有到,人多的时候,就干脆继续工作下,修修福报,早日成为福娃。虽然时不时地扫楼道,挺消耗眼力,但是想到能继续做下还没做完地工作,小明感觉很欣慰。

画外音:不去等待 I/O 响应,而是不断轮询数据是否已经准备好。这就是同步非阻塞(None Bloking I/O)。

第三天,小明觉得自己搬着电脑到楼道边上也太 2 了,公司的妹子们路过的时候,总觉得他有点傻傻的。而且小明才发现公司后门那里也有电梯,虽然人也不少,但是多一个选择总归不错。更重要的,小明发现电梯间里都有监控,随即想到,我干脆找 IT 部门申请下监控的读取权限,开发一个自动识别软件!

申请监控权限可不容易,需要公司层面的支持,好在互联网公司的领导比较人性化,同意了小明的要求。而且作为 Xinux 集团的公司,提供了更强的 epoll 接口,能够安全的读取公司的电梯间监控信息。本着能够充分利用公司的电梯资源目的,领导就让小明放手去做了。

经过一个星期的努力,小明终于完成了这个软件,现在可以直接联通公司的监控数据,将所有电梯间的监控展示在一个页面上,然后还可以通过图像识别,来精准监控多个电梯是否到达,小明现在可以一眼就能看到多个电梯是否到了!

画外音:多路复用 I/O 模型(I/O multiplexing)与前面的 NIO 模型,是相似的。不过可以利用操作系统提供的能力,通过一次 select/epoll 系统调用,就查询到可以读写的一个甚至成百上千的网络连接。相比 NIO 模型,节省了系统的资源。

经过了很长一段时间,这个监控软件运行地很好。同事们都对这个软件赞不绝口。可是小明可不满足,因为现在是互联网时代,随着 5G 的到来,马上万物互联都不是太大的问题了。听说隔壁家 Xindows 集团早就实现了智能电梯了,可不是嘛,小明所在的公司的在电梯厂商的一波营销之下,采购了智能电梯,每台电梯都可以通过 Wifi 连接到公司的网络当中。甚至可以通过接口进行一定的编程。

小明马上盯准了这个接口。如果能够将每个人的微信注册到电梯的控制系统当中,通过预约排队的方式来安排好每个人下楼的时间,当到了时间之后,电梯可以通过微信提醒的方式发送通知,岂不是再也不用每天下班盯着软件看电梯了!

经过一段时间的努力,终于完成了,这下各个同事彻底解放双手,每天下电梯的时间按照微信的通知来就行了,美滋滋。

画外音:异步IO模型(Asynchronous I/O),通过回调的方式,彻底解放了用户线程的等待问题

后记:小明在领导的指示下,“为了不断改善电梯的使用体验”。终于,公司的每个同事都发现自己的下班时间越来越晚……

阅读 264

沉静技术派
一名程序员的技术分享

在因准备面试复习知识的时候,发现很多原理都是生活中现象的体现,随即想到如果能用生活中的例子来讲技术原理是不是更容易理解?将来会考虑往这个方向去写一些文章。也算是致敬刘欣老师。

64 声望
3 粉丝
0 条评论

在因准备面试复习知识的时候,发现很多原理都是生活中现象的体现,随即想到如果能用生活中的例子来讲技术原理是不是更容易理解?将来会考虑往这个方向去写一些文章。也算是致敬刘欣老师。

64 声望
3 粉丝
宣传栏