linux IO多路复用机制(select、poll、epoll)及5种IO模型
I/O多路复用:监视多个文件描述符(优势),一旦某个描述符就绪,通知程序进行相应处理。Select、poll、epoll本质上都是同步IO(Linux)。
Linux三种多路复用机制:
1.select
Select:需要三个文件描述符集合,可以向文件描述符集合中添加感兴趣的事件,select复用特点如下:
1.文件描述符个数有限制1024 --数据结构:位图
2.每次调用都需要重新将3个fd集合从用户态拷贝到内核态
3.内核需要遍历所有fd,效率低
2.poll
Poll特点:1.文件描述符没有最大限制 --数据结构:链表
2.每次调用都需要将fd集合从用户态拷贝到内核态
3.内核需要遍历所有fd,效率低
3.epoll
epoll:1.文件描述符没有最大限制 --数据结构:红黑树
2.只需拷贝一次fd到内核态
3.内核只需判断就绪链表是否为空,不需要遍历所有fd,效率高,并把就绪fd拷贝到用户空间
select、poll、epoll的触发方式
水平触发:1.读操作
缓冲区不为空,每次返回读就绪
2.写操作
缓冲区不满,每次返回写就绪
边缘触发:1.读操作
读缓冲区数据增加的时候,返回读就绪 --新的IO事件到达
2.写操作
写缓冲区数据减少的时候,返回写就绪 --新的IO事件到达
select、poll、epoll的使用场景:当fd数量较少,且都比较活跃时,使用select或poll可能效率更高,因为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有数据可读时,内核自动将数据拷贝到用户空间(不阻塞用户进程),拷贝完成后向用户进程发送信号。