【操作系统】I/O多路复用 select poll epoll
@
I/O模式
- 阻塞I/O
- 非阻塞I/O
- I/O多路复用
- 信号驱动I/O
- 异步I/O
I/O多路复用
I/O 多路复用 相较于多进程多线程技术区别在于一个进程或线程可以处理多个事件。I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知相应的进程/线程进行相应操作
select、poll、epoll都是IO多路复用的机制,它们可以同时监控多个fd的操作
文件描述符(fd):内核利用文件描述符来访问文件。文件描述符是非负整数。打开文件或新建文件时,内核会返回一个文件描述符。
select
将多个fd放到一个文件描述符集合(数组),将其拷贝到内核 bitmap 中同时监视多个fd只要有任何一个数据状态准备就绪了,就将其标记为可读或可写,再接着把整个文件描述符集合拷贝回用户态,用户态还需要通过遍历找到可读或可写的fd,然后对其处理。
缺点:
select这种方式需要进行2次 遍历 文件描述符集合,一次在内核态里,一次在用户态里。- 还会发生2次 拷贝 文件描述符集合,先从用户空间传到内核空间,由内核修改后,再传出到用户空间。
select使⽤固定⻓度的BitsMap表示文件描述符集合,个数是有限制的,最多为 1024 个。
poll
poll 和 select 并没有太大本质区别,只是不再用 BitsMap 来存储所关注的⽂件描述符,而是用动态数组,以链表的形式来组织,不再有最大文件描述符数量的限制。
epoll
epoll 在内核中保存了一份文件描述符集合,底层数据结构是红黑树,增删查时间复杂度都是O(logn),通过对这颗红黑树进行操作,就不需要像select/poll每次操作都从用户态传入整个文件描述符集合到内核态,减少了内核和用户空间的数据拷贝和内存分配
内核不再通过轮询的方式找到就绪的文件描述符,而是通过异步 IO 事件唤醒,将其通过回调函数加入到一个就绪队列中(双向链表),当返回时只返回就绪队列中有I/O事件的文件描述符,所以不需要像select/poll 那样扫描整个集合,大大提高了检测效率。
事件触发模式
epoll 支持两种事件触发模式,分别是 边缘触发 和 水平触发
- 边缘触发(ET)
使用边缘触发模式时,当监控的文件描述符有可读写事件发生时,服务器只会从epoll_wait中苏醒一次。
也就是说每有一个可读写事件发生,服务器就只会苏醒一次,就算一次没有读取完也不会再次苏醒。
因此我们程序要保证⼀次性将内核缓冲区的数据读取完;所以边缘触发模式一般和非阻塞I/O搭配使用
- 水平触发(LT)
使用水平触发模式时,当监控的文件描述符有可读写事件发生时,epoll_wait会通知处理程序去读写,如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么会一直通知你告诉你,直到内核缓冲区读取完
参考
【操作系统】I/O多路复用 select poll epoll的更多相关文章
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- I/O多路复用select/poll/epoll
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...
- I/O多路复用 select poll epoll
I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- 多路复用select poll epoll
I/O 多路复用之select.poll.epoll详解 select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般 ...
- Linux IO多路复用 select/poll/epoll
Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...
随机推荐
- Alamofire-5.0.0 以上报错
摘要 Alamofire 更新到新版本时,遇到了两个错误和一个警告️,所以记录下来它们,以及如何解决它们.给其他出现类似问题的同道一些解决的方向. 今天新开启一个项目,因为网络请求选择 Alamofi ...
- minikube metrics-server HPA 自动扩缩容错误
minikube metrics-server pod 错误 启动 minikube addons enable metrics-server 之后查看 metrics-server pod 会有如下 ...
- 今天使用Bufferedrader ,单缓冲区的数据读取时出现的中文乱码的问题
1.使用这种方式可能出现的中文乱码代码: /** * 第三套********:使用BufferReader,单缓冲区的数据读取和写入(字符输入流) * 读取 */ FileReader frFileR ...
- Pytorch入门中 —— 搭建网络模型
本节内容参照小土堆的pytorch入门视频教程,主要通过查询文档的方式讲解如何搭建卷积神经网络.学习时要学会查询文档,这样会比直接搜索良莠不齐的博客更快.更可靠.讲解的内容主要是pytorch核心包中 ...
- 【模型推理】量化实现分享二:详解 KL 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 K ...
- de1ctf_2019_weapon(爆破_IO_2_1_stdout)
(这是我真正意义上的完完全全自己做的第一道堆题目,虽然花了快三个小时,谨以此篇纪念一下) 题目的例行检查我就不放了,将程序放入ida中 程序的逻辑十分简单,漏洞也非常明显 重点是这个程序没有给我们sh ...
- 去除指定….RemoveMatching…(Power Query 之 M 语言)
表去除指定行: =Table.RemoveMatchingRows( 表, 列表, "指定列") 表中指定列中与列表中相同的行会被去除 表只有一列时,第三参数可以缺省 示例1:&q ...
- 「Python实用秘技03」导出项目的极简环境依赖
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第3期 ...
- CF670A Holidays 题解
Content 假设 \(1\) 年有 \(n\) 天,而每周同样会有 \(5\) 天工作日和 \(2\) 天休假.求一年最小的休假天数和最大休假天数. 数据范围:\(1\leqslant n\leq ...
- docker查看容器元数据、详细信息,查看容器挂载的目录
通过 docker inspect 175f 查看容器元数据 我们启动docker的时候会挂载目录,但是挂载之后 后面就忘了 如何查看挂载的目录位置呢 可以通过 docker inspect a7a6 ...