当前位置: 首页 > news >正文

select、epoll 的快速核心理解

一、 select

最low的就是在用户代码中自旋实现所有阻塞socket的监听。但是每次判断socket是否产生数据,都涉及到用户态到内核态的切换。 于是select改进:将fd_set传入内核态,由内核判断是否有数据返回

然后最low的只能使用自旋来时刻的去判断socket列表中是否有数据达到。 于是select改进:使用等待队列,让线程在没有资源时park(阻塞),当有数据到达时唤醒select线程,去处理socket。

 缺点:

 二、epoll

epoll是在select出现N多年后才被发明的,是select和poll的增强版本。epoll通过以下一些措施来改进效率。

措施一:功能分离

select低效的原因之一是将“维护等待队列”和“阻塞进程”两个步骤合二为一。如下图所示,每次调用select都需要这两步操作,然而大多数应用场景中,需要监视的socket相对固定,并不需要每次都修改。epoll将这两个操作分开,先用epoll_ctl维护等待队列,再调用epoll_wait阻塞进程。

int s = socket(AF_INET, SOCK_STREAM, 0);   
bind(s, ...)
listen(s, ...)int epfd = epoll_create(...);
epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1){int n = epoll_wait(...)for(接收到数据的socket){//处理}
}

措施二:就绪列表

select低效的另一个原因在于程序不知道哪些socket收到数据,只能一个个遍历。如果内核维护一个“就绪列表”,引用收到数据的socket,就能避免遍历。如下图所示,计算机共有三个socket,收到数据的sock2和sock3被rdlist(就绪列表)所引用。当进程被唤醒后,只要获取rdlist的内容,就能够知道哪些socket收到数据。

三、对比

 

http://www.lryc.cn/news/99236.html

相关文章:

  • HTTP和HTTPS的区别
  • 分布式异步任务处理组件(二)
  • Jenkins 拉取 GitHub 私有仓库失败问题
  • 小程序 多层次对象数组的赋值、动态赋值
  • angular踩坑
  • C#时间轴曲线图形编辑器开发1-基本功能
  • elasticsearch查询操作(DSL语句方式)
  • JavaScript详解
  • 电缆振荡波局部放电检测定位技术
  • AI Chat 设计模式:10. 组合模式
  • 【Nginx12】Nginx学习:HTTP核心模块(九)浏览器缓存与try_files
  • 【1】-Locust性能测试工具介绍与安装
  • 基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)
  • 【已解决】jupyter notebook里已经安装了第三方库,还是提示导入失败
  • Mybatis使用collection映射一对多查询分页问题
  • Linux/Windows路由管理
  • openpnp - 设备矫正的零碎记录
  • Linux内核中的链表、红黑树和KFIFO
  • 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动
  • Android 设备兼容性使用(详细版)
  • React 中的常见 API 和生命周期函数
  • 神经网络中遇到的 python 函数(Pytorch)
  • 分布式事务及解决方案
  • 【宏定义】——编译时校验
  • C#学习系列之System.Windows.Data Error: 40报错
  • 【java安全】RMI
  • rcu链表综合实践
  • odoo16-python框架-动作
  • 微信小程序——同一控件的点击与长按事件共存的解决方案
  • selenium自动化-获取元素属性信息