linux IO多路复用机制(select、poll、epoll)及5种IO模型

I/O多路复用监视多个文件描述符(优势,一旦某个描述符就绪,通知程序进行相应处理。Selectpollepoll本质上都是同步IO(Linux)

Linux三种多路复用机制:

1.select


Select:需要三个文件描述符集合,可以向文件描述符集合中添加感兴趣的事件,select复用特点如下:

              1.文件描述符个数有限制1024       --数据结构:位图

            2.每次调用都需要重新将3fd集合从用户态拷贝到内核态

           3.内核需要遍历所有fd,效率低

2.poll


Poll特点1.文件描述符没有最大限制    --数据结构:链表

                2.每次调用都需要将fd集合从用户态拷贝到内核态

               3.内核需要遍历所有fd,效率低

3.epoll


epoll1.文件描述符没有最大限制      --数据结构:红黑树

      2.只需拷贝一次fd到内核态

      3.内核只需判断就绪链表是否为空,不需要遍历所有fd,效率高,并把就fd拷贝到用户空间

select、poll、epoll的触发方式

  1.selectpoll只支持水平触发
  2. Epoll支持两种触发模式,即水平触发和边缘触发            

                     水平触发1.读操作

                                          缓冲区不为空,每次返回读就绪

                                       2.写操作

                                         缓冲区不满,每次返回写就绪

                   边缘触发1.读操作

                                        读缓冲区数据增加的时候,返回读就绪      --新的IO事件到达

                                     2.写操作

                                        写缓冲区数据减少的时候,返回写就绪      --新的IO事件到达

  

 select、poll、epoll的使用场景fd数量较少,且都比较活跃时,使用selectpoll可能效率更高,因为epoll有多次的回调函数。


Linux五种IO模型:

1.阻塞IO:当kernel没有数据可读时,io调用一直阻塞,直到kernel有数据时,将数据kernel拷贝到用户空间,io调用才返回。

2.非阻塞IO:当kernel无数据可读时,io操作立即返回,当有数据可读时,将数据从kernel拷贝到用户空间才返回(拷贝过程仍然阻塞)。但需要用户进程轮询内核,直到读取到数据。

3.IO多路复用:监控多个文件描述符,将多个IO阻塞复用到一个select的阻塞上。

4.信号驱动IO:内核在描述符就绪时发送SIGIO信号,通过注册的信号处理程序读取数据。

5.异步IO:发出异步IO后,IO操作立即返回,当kernel有数据可读时,内核自动将数据拷贝到用户空间(不阻塞用户进程),拷贝完成后向用户进程发送信号。


猜你喜欢

转载自blog.csdn.net/gaibian_one/article/details/77949686