IO多路复用

来源:互联网 发布:linux rpm包下载网站 编辑:程序博客网 时间:2024/06/01 07:19
IO多路复用技术

什么叫IO多路复用?
在了解IO多路复用之前我们先来了解一下阻塞IO和非阻塞IO

什么是程序的阻塞呢?

举个简单的例子,我们要买网络编程一本书,打电话问书店老板,老板的回复是等待一下,他去找书,这个时候我们就只能

拿着电话静静的等,直到老板找到这本书。

什么是程序的非阻塞呢?

还是上面的例子,我们要买网络编程这本书,打电话给老板,老板的回复是他去找书,这个时候情况就不同了,

我们隔一会再给老板打电话问他找到了没有 ,如果老板回复没有找到,我们过一会再打电话询问,直到老板回复找到了。

通过上面的例子我们来总结一下
阻塞IO:当请求的数据没有到来时,程序会一直阻塞在这里,等待数据的到来。
非阻塞IO:当请求的数据没有到来时,会返回一个数据没准备好的结果,然后采用轮询的方式继续询问,直到数据准备好。
阻塞IO和非阻塞IO图解如下:


阻塞IO存在的问题是,当数据没有到来时,程序会一直阻塞,什么事情也做不了。

非阻塞IO虽然会及时返回一个结果,但是需要不停地轮询IO请求的状态。


这个时候我们引入了IO多路复用

在上面买书的例子基础上,我们不需要再持续等待,也不需要不断地给老板打电话询问,我们有了一个收件箱

这个收件箱里面有我们请求的信息,我们只需要监听这个收件箱,当老板找到书时我们就会收到信息。

IO多路复用技术分为:select、poll、epoll


select原理

收件箱就好比引入的一个中间人物,我们不需要自己去监听轮询数据是否准备好,我们只需要创建一个select监听队列,把我们需要

监听的IO事件(文件描述符)放进该队列中,让它去帮助我们监听数据的准备状态,当有数据请求时我们再去处理。但是select存在
一些问题,当监听到有IO事件发生时,我们并不知道具体是哪个文件描述符,这个时候我们需要轮询所有文件描述符,确定是某一个
流准备好了,然后对其进行IO操作。所以select就具有O(n)的复杂度,当处理的流越多时,轮询时间就越长。

epoll原理:

epoll和select相似,但不同之处在于epoll会在监听的时候确定是哪个流发生了什么IO事件,避免了select中的轮询,它的时间复杂度

O(1),大大的提高了效率。

select和epoll对比

对比一下我们可以看到,select只是能知道有几个文件描述符发生了IO事件,但是他并不能知道是哪几个,发生了什么IO时间,但是epoll就能
定位到确定的几个流,并且知道发生了什么IO事件,相比一下epoll比select要高效许多,可以说epoll是牺牲空间节省时间的思想。
那么问题来了,为什么叫做IO多路复用呢?
首先select和epoll也是一种阻塞式的模型,然后因为传统阻塞IO同一时间只是对一个针对某一个IO进行的,而IO多路复用是同一时间针对多个IO。
原创粉丝点击