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就好比钓鱼人雇了一个人给他钓鱼,等鱼上钩,然后把鱼拉上岸来之后再告诉钓鱼的人。
五种IO模型
最新推荐文章于 2024-07-19 17:38:48 发布