@

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. vue-cli4脚手架搭建一

    涉及内容 html  css   javascript   node.js   npm    webpack 2.9.6是常用版本 vue-cli4是基于webpack的 webpack是基于node ...

  2. 解决PLSQL查不到带中文条件的记录

    原因: PLSQL乱码问题皆是ORACLE服务端字符集编码与PLSQL端字符集编码不一致引起.类似乱码问题都可以从编码是否一致上面去考虑. 解决: 1. 查询Oracle服务端字符集编码,获取NLS_ ...

  3. 端口占用,windows下通过命令行查看和关闭端口占用的进程

    1.查找所有端口号对应的PID 端口号:8080 命令:netstat -ano|findstr "8080" 2.找到端口的PID并关闭 PID:1016 命令:taskkill ...

  4. 云服务器ECS部署和卸载RabbitMQ

    云服务器ECS部署RabbitMQ RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,用于在分布式系统中存储转发消息,有良好的易用性.扩展性和高可用性.本文介绍如何通过ECS实例 ...

  5. Hadoop分布式文件系统(HDFS)设计

    Hadoop分布式文件系统是设计初衷是可靠的存储大数据集,并且使应用程序高带宽的流式处理存储的大数据集.在一个成千个server的大集群中,每个server不仅要管理存储的这些数据,而且可以执行应用程 ...

  6. ciscn_2019_ne_5

    首先checksec和查看多少位的程序 可以看到是32位的程序,放入ida中 进入getflag 可以看到strcpy存在栈溢出,所以大体思路就是输入密码进入选择1造成溢出然后进入选择4获取shell ...

  7. epx中设置断掉调试

    以前总听师傅们说,做pwn题,多调试,多调试. 师傅都说用gdb,但是我刚接触linux程序调试的时候用的是pwndbg,后来就用顺手了.但是调试一些简单程序还好,直接用pwndbg打开.但是这年头简 ...

  8. [BUUCTF]PWN——bbys_tu_2016

    bbys_tu_2016 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况,测试时候发现输入长度过长程序会崩溃,猜测输入点存在问题 32位ida载入,检索程序里的 ...

  9. LuoguP7715 「EZEC-10」Shape 题解

    Content 有一个 \(n\times m\) 的网格,网格上的格子被涂成了白色或者黑色. 设两个点 \((x_1,y_1)\) 和 \((x_2,y_2)\),如果以下三个条件均满足: \(1\ ...

  10. tryParse的用法。

    tryParse的用法. int.Parse()是一种类容转换:表示将数字内容的字符串转为int类型.如果字符串为空,则抛出ArgumentNullException异常:如果字符串内容不是数字,则抛 ...