@

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)

最新文章

  1. JAVA学习笔记之static——2016.3.10
  2. 1.初识Linux
  3. php基础19:文件
  4. Upgrading to Java 8——第三章 Optional and Similar Classes
  5. LXC-Linux Containers介绍
  6. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)
  7. <<java 并发编程>>第七章:取消和关闭
  8. wiki oi 3115高精度练习之减法
  9. IE6下完美兼容css3圆角和阴影属性的htc插件PIE.htc
  10. Node.js CVE-2017-1484复现(详细步骤)
  11. Minor GC、Major GC和Full GC之间的区别
  12. SG函数和SG定理
  13. java利用Jsch实现在windows平台远程操作linux服务器
  14. 2553 ACM N皇后 回溯递归
  15. Linux双网卡绑定
  16. Spring3.0学习1.1(模拟spring)
  17. display:table和display:table-cell结合使用
  18. LdA笔记
  19. sql server merge 的用法
  20. Tomcat 用startup.bat启动,卡住解决

热门文章

  1. linux 定时导出sql查询结果文件
  2. 第7章 使用性能利器——Redis
  3. 【Java基础】transient关键字
  4. VectorCAST软件自动化测试方案
  5. 【Linux】【RedHat】下载 安装 注册
  6. python3.6.4 scrapy框架from PIL import Image报错 from . import _imaging as core
  7. Redis操作命令合集
  8. Jenkins凭证管理
  9. shell脚本 Linux系统巡检
  10. 查看MySQL正在执行的线程