Linux的IO多路复用

编程知识 更新时间:2023-04-06 12:12:55

 博客主页:🏆看看是李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多路复用

本文发布于:2023-04-06 12:12:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/9890009d6f4ca37edee4ff12d14e2d65.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多路   复用   Linux   IO

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 49458文章数
  • 14阅读数
  • 0评论数