select poll 和 epoll 三组I/O复用系统调用都能够同时监听多个文件描述符。它们将等到由timeout参数指定的超时时间,直到一个或者多个文件描述符上有时间发生时返回,返回值就是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集 最大支持文件描述符数和具体实现等四个方面进一步比较它们的异同,以明确在实际应用中应该选择哪个。

这三组函数都是通过某种结构体变量来告诉内核监听那些文件描述符上的那些事件,并使用该结构体类型的参数来获取内核处理的结果。

select的参数类型是fd_set没有将文件描述符和事件进行绑定,它仅仅是一个文件描述符的集合,因此select需要提供三个这种类型的参数来分别传入和输出可读 可写及异常等事件。这一方面使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这三个fd_set集合。

poll的参数类型pollfd则多少聪明一些。他把文件描述符和事件都定义其中,任何事件都统一处理,从而使得编程接口简洁得多。并且内核每次修改的是pollfd结构体的revent成员,而events成员保持不变,因此下次调用poll时应用程序无需重置pollfd类型的事件集参数。

由于每次select 和poll调用都返回整个用户注册的事件集合,所以应用程序索引就绪文件描述符的事件复杂度为N。epoll则采用与select和poll完全不同的方式来管理用户注册的事件。它在内核中维护一个事件表,并提供一个独立的系统调用epoll_ctl来控制往其中添加 删除 修改事件。这样每次epoll_wait调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读取这些事件。epoll_wait系统调用的events参数仅用户返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度为1。

I/O复用函数的比较相关推荐

  1. scala tail recursive优化,复用函数栈

    在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function c ...

  2. I/O复用函数的使用——epoll

    1.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数.它在实现和使用上与 select.poll 有很大差异.首先,epoll 使用一组函数来完成任务,而不是单个函数.其次, ...

  3. I/O复用函数的使用——select

    I/O 复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要.通常,网络程序在下列情况下需要使用 I/O 复用技术: ◼ TCP 服务器同时要处理监听套接字和连接套接字. ◼ 服务器要同 ...

  4. poll函数_I/O复用 - 三组I/O复用函数的比较

    在之前的文章中 I/O复用 - epoll 和 I/O复用 - select&poll 中我们讨论了三组I/O复用的系统调用,这3组系统调用都能同时监听多个文件描述符.它们将等待由timeou ...

  5. bigdecimal判断等于0_vue2.0源码用到的工具函数,12个简易的复用函数,看看有多简单...

    戎马:https://segmentfault.com/a/1190000019679638 1. 创建一个被冻结的空对象 export const emptyObject = Object.free ...

  6. Linux网络编程——I/O复用函数之epoll

    https://blog.csdn.net/lianghe_work/article/details/46544567 一.epoll概述 epoll 是在 2.6 内核中提出的,是之前的 selec ...

  7. python函数复用_【python学习-4】可复用函数与模块

    1.自定义函数 自定义函数格式如下: def (参数列表):return #!/usr/bin/python#定义函数,打印数字1~5 defprintNum5():#range函数,生成列表集合,有 ...

  8. Linux使用I/O复用函数的超时机制的定时器

    I/O复用超时机制 利用socket的timeout的参数,进行超时设定,这期间也可以处理其他事情.在主循环中,一定要每次都更新超时参数!!! 这是个代码实例: #include <stdio. ...

  9. Linux内核剖析-----IO复用函数epoll内核源码剖析

    本文参考董浩博客 http://donghao.org/uii/   epoll内核实现 (1)内核为epoll做准备工作 这个模块在内核初始化时(操作系统启动)注册了一个新的文件系统,叫" ...

最新文章

  1. 导入Excel和CSV文件
  2. Mysql5.7安装错误处理与主从同步及!
  3. h5页面提示只能在微信浏览器中打开_电子问卷h5怎么做?
  4. 「BZOJ2879」[Noi2012]美食节
  5. RocketMQ Message hasn‘t been sent. Caused by No route info of this topic, Pr
  6. django 钉钉扫码登录
  7. linux keepalived 脚本,Linux下安装Keepalived及原理分析
  8. 从零开始学编程系列汇总
  9. 【IoT】STM32 文件系统 fatfs 移植笔记详解
  10. 基于arduino单片机的室内温度控制
  11. sequencer和driver
  12. Mysql探索之索引详解,又能和面试官互扯了~,java分布式系统面试题
  13. 在Windows7和Ubuntu上编译安装MICO
  14. 人工智能对人类心理学的推进与变革
  15. 人工智能伦理风险治理具有复杂性,尚未形成完善的理论架构和治理体系
  16. C++习题(系统菜单设计)
  17. CF 237A (Cash)
  18. 黑马VUE电商管理后台笔记记录
  19. 直销业务变得简单:WordPress分步指南
  20. 【R语言可视化】-- 柱状图要点一网打尽

热门文章

  1. c++ 暂停功能_2020.10.16撸友简报:NC资本澄清;去嗨皮打赏交易
  2. cover-letter
  3. File Hunter for mac - 丢失文件查找AE脚本
  4. FCPX插件:科幻切割分屏转场效果XEffects Tech Transitions mac版
  5. java win10 通知_如何在Java中创建Windows通知
  6. 数字表达_神奇的数字英语表达一定会让你大吃一惊
  7. STM32H743+CubeMX-移植ThreadX
  8. 浏览器怎么清理缓存_Mac系统浏览器缓存清理工具
  9. [10] ADB 修改设置
  10. php培训js重要么,php何以被戏称为“世界上最好的语言”?请看它与js的对比!...