博客主页:🏆看看是李XX还是李歘歘 🏆
🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺
💗点关注不迷路,总有一些📖知识点📖是你想要的💗
⛽️今天的内容是 Linux的IO多路复用 ⛽️💻💻💻
五种网络IO:阻塞IO、非阻塞IO、信号驱动IO、多路复用IO和异步IO,今天来聊一下多路复用IO在linux的实现。
I/O多路复用:以较少的代价来同时监听文件描述符,处理多个IO,一旦某个描述符就绪,通知程序进行相应处理,多路复用IO属于同步IO,Linux的IO多路复用实现方式有三种:Select、poll、epoll。
select
需要三个文件描述符集合(可读事件文件描述符集合、可写事件文件描述符集合、异常事件文件描述符集合),可以向文件描述符集合中添加感兴趣的事件,依大遍历所有的文件描述符集合,判断是否有可读、可写、异常事件,如果有事件或超时,返回事件个数(只返回个数),否则阻塞一定时间。
select复用特点如下:
1.实现数据结构:位图,文件描述符个数有限制1024
2.每次调用都需要重新将3个fd集合从用户态拷贝到内核态
3.内核需要遍历所有fd,效率低
poll
用一个文件描述符集合,每次只轮询一个集合,也是返回事件个数(只返回个数),效率比select高。
poll复用特点如下:
1.实现数据结构:链表,文件描述符没有最大限制
2.每次调用都需要将fd集合从用户态拷贝到内核态
3.内核需要遍历所有fd,效率低
epoll
epoll_ct
1.增加监听的fd到红黑树中
2.从红黑树中删除fd
3.修改己经注册的监听事件
epoll_wait
如果就绪队列不为空或超时,拷贝就绪文件描述符到用户空间,结束循环,否则阻塞一段时间继续下一次循环。
调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝,所以不存在拷贝所带来的开销。
epoll复用特点如下:
1.实现数据结构:红黑树,文件描述符没有最大限制
2.只需拷贝一次fd到内核态
3.内核只需判断就绪链表是否为空「当设备就绪后,会通过注册的回调函数自动将就绪文件描述符加入就绪队列」,不需要遍历所有fd,效率高,并把就绪fd拷贝到用户空间。
更多推荐
Linux的IO多路复用
发布评论