五种IO模型

柔情痞子 提交于 2019-11-30 19:03:25

IO的产生

  I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分.

  当用户进程调用了recvfrom这个系统调用,就引发了一次IO过程,这个时候的IO就要等待系统去磁盘上将数据读取读来,再拷贝到进程中

在网络情况下,IO通常分为两步

  1.等待系统准备数据

  2.数据从内核中拷贝到进程中

  如果想提高IO的效率,就要减少准备数据的时间.

通常的IO模型分为5种

  1.阻塞IO

  2.非阻塞IO

  3.事件驱动IO

  4.多路复用IO

  5.异步IO

 

1.阻塞IO

  在内核将数据拷贝到进程中之前,整个进程都处在等待状态,就是阻塞IO

  A拿着一支鱼竿在河边钓鱼,并且一直在鱼竿前等,在等的时候不做其他的事情,十分专心。只有鱼上钩的时,才结束掉等的动作,把鱼钓上来。

  

  

2.非阻塞IO

  每次进程询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮寻,减少数据等待的时间,当准备数据时,进程是在非阻塞状态的,可以去做一些其他操作.

  B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等),但B在做这些事情的时候,每隔一个固定的时间检查鱼是否上钩。一旦检查到有鱼上钩,就停下手中的事情,把鱼钓上来。

  这样的轮询机制对cpu开销很大,只有在特定场景下才推荐使用.

  

3.事件驱动IO

  事件驱动IO模型,应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据报。

  C也在河边钓鱼,但与A、B不同的是,C比较聪明,他给鱼竿上挂一个铃铛,当有鱼上钩的时候,这个铃铛就会被碰响,C就会将鱼钓上来。

  

4.多路复用IO

  IO多路复用是多了一个select函数,select函数有一个参数是文件描述符集合,对这些文件描述符进行循环监听,当某个文件描述符就绪时,就对这个文件描述符进行处理。

  其中,select只负责等,recvfrom只负责拷贝,IO多路转接是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO的高。

  D同样也在河边钓鱼,但是D生活水平比较好,D拿了很多的鱼竿,一次性有很多鱼竿在等,D不断的查看每个鱼竿是否有鱼上钩。增加了效率,减少了等待的时间。

  

 

5.异步IO

  当应用程序调用aio_read时,内核一方面去取数据报内容返回,另一方面将程序控制权还给应用进程,应用进程继续处理其他事情,是一种非阻塞的状态。

  当内核中有数据报就绪时,由内核将数据报拷贝到应用程序中,返回aio_read中定义好的函数处理程序。

  E也想钓鱼,但E有事情,于是他雇来了F,让F帮他等待鱼上钩,一旦有鱼上钩,F就打电话给E,E就会将鱼钓上去。

  

  很少有linux系统支持异步IO,在windows系统中的IOCP就是使用的异步IO模型

  

  可以看出,阻塞程度:阻塞IO>非阻塞IO>多路转接IO>信号驱动IO>异步IO,效率是由低到高的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!