zoukankan      html  css  js  c++  java
  • 多路复用IO:select poll epoll

    【电话面试】io多路复用专题面试 这个真猛

    有人做了笔记:点这里

    select

    Select(Max+1,&rset,null,null,null)是因为0~max是max+1。

    过程:

    • 将文件描述符收集过来,把bitmap从用户态拷贝到内核态,交给内核态判断那个有数据。Select是个阻塞函数,没有数据时会一直阻塞在select。如果有数据来,FD(对应的bitmap那一位)置位,然后select返回,O(n)判断哪一个被置位了,然后将那一位的数据读出来然后进行处理。

    缺点:

    • 1 bitmap默认大小是1024,虽然能调整,但仍有上线。
    • 2 从用户态切换到内核态的切换然后拷贝有额外开销。
    • 3 O(n)遍历判断哪一个被置位了。

    poll

    Poll(pollfds,5(元素个数),50000(超时时间));

    • 同样是从用户态拷贝到内核态,和select一样,好处是没有使用bitmap,strct pollfd{Int fdl short events; short revents;}; 
    • event在意的事件(读写),poll也是阻塞函数,有被置位,置的是revents而不是fd,然后返回。O(n)个被置位了,然后将那一位的数据读出来然后进行处理,将revents重置为0。

    改善的缺点就是没了bitmap的上限(pollfd设置元素个数)

    epoll  

    epoll只能工作在linux下!

    • 首先创建一个epoll对象,然后使用epoll_ctl对这个对象进行操作,把需要监控的描述添加进去,这些描述如将会以epoll_event结构体的形式组成一颗红黑树,接着阻塞在epoll_wait,当某个fd上有事件发生时,内核中断处理函数将会把其对应的结构体放入到一个链表中,最后返回有事件发生的链表。
    • 如何解决poll的缺点?fd是共享在用户态和内核态之间,避免的切换拷贝的资源开销。把触发的事件用链表存储,这样可以通过O(1)访问。 

    epoll 水平触发(LT)与 边缘触发(ET)的区别?

    • 水平触发(LT,Level Trigger):当文件描述符就绪时,会触发通知,如果用户程序没有一次性把数据读/写完,下次还会发出可读/可写信号进行通知。
    • 边缘触发(ET,Edge Trigger):仅当描述符从未就绪变为就绪时,通知一次,之后不会再通知。

    区别:边缘触发效率更高,减少了事件被重复触发的次数,函数不会返回大量用户程序可能不需要的文件描述符。

    使用场景:当连接数较多并且有很多的不活跃连接时,epoll 的效率比其它两者高很多。当连接数较少并且都十分活跃的情况下,由于 epoll 需要很多回调,因此性能可能低于其它两者。

  • 相关阅读:
    C++第7周任务3输出星号图详解示例
    C++第7周任务3输出星号图全解
    C02程序设计基础提高班(C++)第7周上机任务指针
    毕业生反馈(三)
    C++程序设计第七周上机实践项目
    C03Java同步实践加强班第7周上机任务
    写给菜鸟:发CSDN博文常见问题处理
    android项目 添加
    编译某一个ko模块make modules SUBDIRS=drivers/xxx/
    修改其他输入法为android 默认输入法
  • 原文地址:https://www.cnblogs.com/philo-zhou/p/14391754.html
Copyright © 2011-2022 走看看