首页 > 其他分享 >select/poll/epoll

select/poll/epoll

时间:2024-02-26 15:23:04浏览次数:34  
标签:do epoll 链表 fd poll select

1、select的实现(fs/select.c)

主要涉及三个函数sys_select() à core_sys_select() à do_select() 

每次调用select,都会将用户态的fd拷贝至内核态

do_select()会

1) 循环遍历每一个fd,调用对应的驱动的poll函数,poll函数会:1)将用户进程插入到驱动的等待队列中 2)返回mask告知就绪fd

2) 如果遍历完都没有,for循环进入睡眠,等待被驱动唤醒或超时退出

3) 如果遍历完有可操作的fd,则跳出for循环

 

2、poll的实现(fs/select.c)

主要涉及三个函数sys_poll()->do_sys_poll()->do_poll()

poll的实现和select非常相似,区别就是入参方式变了,由固定大小的位图改成了变长的指针数组,select中存放文件描述符集合,是用的数组,poll中替换成了链表,这样就没有了1024的限制

 

3、epoll的实现(fs/eventpoll.c)

epoll机制是通过向驱动注册回调函数的方式获得IO就绪的通知

其使用过程如下:

第一步:epoll_create会创建一个对象, 该对象包含两个数据结构,一个红黑树,一个链表;

第二步:epoll_ctl会将要关注的fd存入红黑树数据结构,当有事件触发时,内核会将就绪的fd拷贝到链表数据结构

第三部:epoll_wait从链表里读取就绪的fd,移到用户空间

注意:epoll_create的入参需要填入一个任意的大于0的int, 该参数已无具体意义

 

总结:

(1)select支持的文件描述符有1024的限制,poll 没有限制

(2)select和poll实现机制相似,每次调用,都需要把fd集合从用户态拷贝到内核态,然后遍历所有的fd, 再拷贝回用户态

(3)epoll避免了fd在用户态和内核态间的反复拷贝, 其内部的回调机制,以及就绪链表的存在,使得在io数量超多的情况下,其效率比select/poll要高效很多

 

标签:do,epoll,链表,fd,poll,select
From: https://www.cnblogs.com/ho966/p/18034411

相关文章

  • 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型
    Reactor模型是一种常见的高并发设计模式,特别是在网络编程中。在Reactor模型中,一个或多个输入同时传递给一个或多个服务处理程序。服务处理程序对输入进行处理,然后将结果传递给相应的输出处理程序。使用IO复用技术(如epoll)和线程池,可以实现多线程的Reactor高并发模型。下面是一个简......
  • Vue3学习(十八) - TreeSelect 树选择
    写在前面本以为可以在家学习一天,结果家里来了客人拜年,就没学习上,有点小遗憾吧。昨天完成从分类管理的前后端代码复制出文档管理的前后端代码,遗留问题是只能选择一级父分类。值得说的是,昨晚的遗留的问题修复了,开心。遗留问题点击父文档,弹出警告,从报错来看那意思就是parent应该......
  • 【问题记录】【Apollo】修改业务配置参数需要重启服务么?
    1 前言最近发现小伙伴对于修改参数,要不要重启不太清楚,整的我都怀疑自己的认知了,我记得看Apollo源码的时候,它有个后置处理器,会收集哪个类的哪个属性需要注入,然后当配置变更的时候,会通过反射设置新的值的,这节我就来带大家看看。首先对于服务参数或者系统参数,比如端口、数据源......
  • Go 100 mistakes - Expecting deterministic behavior using select and channels
      funcmain(){messageCh:=make(chanint,10)disconnectCh:=make(chanstruct{},1)fori:=0;i<10;i++{messageCh<-i}gofunc(){for{select{casev:=<-messageCh:......
  • 9.Polly在NET中的使用,重试、熔断、超时、降级、限流简单用法
    Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以Fluent和线程安全的方式来实现重试、断路、超时、隔离、限流和降级策略。文档: https://gitee.com/hubo/Polly重试(Retry)出现故障自动重试,这个是很常见的场景,如:当发生请求异常、网络错误、服务暂时不可用时,就应该重试。......
  • subprocess中的return_code与poll
    subprocess中的return_code与pollp=subprocess.Popen('ping8.8.8.8',shell=True,stdout=subprocess.PIPE,stderror=subprocess.DEVNULL)whilenotp.poll():#p.poll()即为return_codeprint(p.stdout.read().decode())#return_code=p.poll()#......
  • Python异步编程原理篇之IO多路复用模块selector
    selector简介selector是一个实现了IO复用模型的python包,实现了IO多路复用模型的select、poll和epoll等函数。它允许程序同时监听多个文件描述符(例如套接字),并在其中任何一个就绪时进行相应的操作。这样可以有效地管理并发I/O操作,提高程序的性能和资源利用率。本篇主要......
  • 8小时速成golang(五)golang高阶 select
     Selectselect作用Go里面提供了一个关键字select,通过 select 可以监听 channel 上的数据流动。有时候我们希望能够借助channel发送或接收数据,并避免因为发送或者接收导致的阻塞,尤其是当channel没有准备好写或者读时。select语句就可以实现这样的功能。select的用法与sw......
  • JavaScript中的querySelector()方法是什么,它是如何工作的?
    在JavaScript中,有时您需要访问HTML元素。querySelector方法是一个WebAPI,它选择与传入的指定CSS选择器匹配的第一个元素。但是,更详细地说,这是如何工作的呢?在本文中,我们将看一些如何使用querySelector方法以及querySelectorAll方法的示例。(本文内容参考:java567.com)querySelector......
  • Caused by: java.lang.IllegalStateException: A unix domain socket connection requ
    Causedby:java.lang.IllegalStateException:Aunixdomainsocketconnectionrequiresepollorkqueueandneitherisavailable出现这个错误,首先确保自己的操作系统是否支持epoll,或者kqueue。如果支持。请导入netty的大库,lettuce中好像缺失了一部分,我怀疑是这是怀疑,......