@

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会通知处理程序去读写,如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么会一直通知你告诉你,直到内核缓冲区读取完

参考

彻底搞懂IO多路复用 (qq.com)

【操作系统】I/O多路复用 select poll epoll的更多相关文章

  1. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  2. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  3. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

  4. Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程

    1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...

  5. I/O多路复用select/poll/epoll

    前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...

  6. I/O多路复用 select poll epoll

    I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...

  7. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  8. 多路复用select poll epoll

    I/O 多路复用之select.poll.epoll详解 select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般 ...

  9. Linux IO多路复用 select/poll/epoll

    Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...

随机推荐

  1. 虚机扩大容量与vm减少所占容量

    Linux的虚拟机碎片整理 sudo dd if=/dev/zero of=/free bs=1M sudo rm -f /free 镜像压缩 移动镜像 VBoxManage internalcomm ...

  2. Spring boot 数据源配置。

    配置文件 : spring boot  配置文件 有两种形式 ,一种是properties文件.一种是yml文件.案列使用properties文件. 数据源的默认配置 : spring boot 约定 ...

  3. 如何简单的理解LSTM——其实没有那么复杂(转载)

    转载地址:https://www.jianshu.com/p/4b4701beba92 1.循环神经网络 人类针对每个问题的思考,一般不会是完全的从头开始思考.正如当你阅读这篇译文的时候,你会根据已经 ...

  4. linux 让.net 控制台后台运行

    命令     nohup 你的shell命令  & 例如    nohup dotnet  MQTTClient.dll & 输入完成后,终端会有提示 这时再按下回车 回到shell命 ...

  5. inndy_rop

    又学习到了一个新知识 拿到题目例行检查,发现是32位的程序,放入ida中 进入main看到了一个overflow函数进入查看 存在明显的栈溢出,看到题目知道要用rop来做,但是完全没有思路, 后来发现 ...

  6. [BUUCTF]PWN——[ZJCTF 2019]EasyHeap

    [ZJCTF 2019]EasyHeap 附件 步骤: 例行检查,64位程序 试运行一下看看程序大概执行的情况,经典的堆块的菜单 64位ida载入,首先检索字符串,发现了读出flag的函数 看一下每个 ...

  7. Table.Range保留中间指定的….Range/Middle(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  8. Frequency函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  9. 教会你彻底解决android studio c/c++ jni代码无法跳转

    时不时总会遇到原来c c++ jni代码跳转很欢乐,突然也不知道咋滴了build也能build成功,运行也能正常运行,就是代码不能跳转了,首先来科普下一些背景知识. 如果让代码跳转起来,大概需要做哪些 ...

  10. 手动上下eureka上面服务

    手动下eureka curl -X PUT http://eureka.xxx.xxx.com/eureka/apps/VIDEO-API/111.111.111.111:test-api:0000/ ...