五种IO模型总结

虾米哥 阅读:427 2021-05-14 10:14:58 评论:0

1、阻塞IO
(1)概念:在内核将数据准备好之前,系统调用会一直等待。所有的套接字,默认情况都是阻塞方式。
(2)阻塞IO的工作流程:
在这里插入图片描述
2、非阻塞IO
(1)概念:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。
(2)非阻塞的工作流程:
在这里插入图片描述
注意:非阻塞IO往往需要程序员以循环的方式反复尝试读写文件描述符,这个过程称为轮询。这个过程对CPU来说是较大的浪费,一般只有在特定的场景下才使用。
3、信号驱动IO
(1)概念:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。
(2)信号驱动IO的工作流程:
在这里插入图片描述
4、IO多路转接
(1)概念:IO多路转接与阻塞IO相似,不同的是IO多路转接能够同时等待多个文件描述符的就绪状态。
(2)IO多路转接的工作流程:
在这里插入图片描述
5、异步IO
(1)概念:由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。
(2)异步IO的工作流程:
在这里插入图片描述
6、小结
(1)任何IO过程中都包含两个步䠫:第一是等待;第二是拷贝。在实际的应用场景中等待消耗的时间往往都远远高于拷贝的时间,所以让IO更高效的最核心办法是减少等待的时间。
(2)网络IO好比钓鱼,钓鱼的人就是一个应用进程,等待鱼上钩就是网络中等待数据准备好的过程,鱼上钩了,把鱼拉上岸就是内核复制数据阶段。
1)阻塞IO模型就好比我们去钓鱼,抛竿之后就一直在岸边等,直到等待鱼上钩,然后再一次抛竿,等待下一条鱼上钩……等待的时候,什么事情也不做。
2)非阻塞IO就好比我们抛竿入水之后就看下鱼漂是否有动静,如果没有鱼上钩,就去干点别的事情,过一会儿又来看看鱼漂是否有鱼上钩。这样往返的检查又离开,直到鱼上钩,再进行处理。
3)信号驱动IO就好比我们给鱼竿上挂一个铃铛,当有鱼上钩的时候,这个铃铛就会被碰响,就把鱼拉上岸来。
4)多路转接IO就好比一个人抛下多根鱼竿,只要其中一根鱼竿有鱼上钩就把它拉上岸来,这样做的好处是减少了等待的时间。
5)异步IO就好比钓鱼人雇了一个人给他钓鱼,等鱼上钩,然后把鱼拉上岸来之后再告诉钓鱼的人。


声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

我的关注

全民解析

搜索
排行榜
关注我们