select的问题以及epoll的使用

select的问题

  1. 当进程被唤醒时,不清楚到底哪个socket有数据,只能遍历一遍
  2. 每一次select的执行,都需要将这进程,再加入到等待队列中
  3. 为了重复添加等待队列,当每一次操作完成时,也需要从等待队列中删除进程

所以select最大的限制被设置为了1024,如此看来select连多线程都比不上

于是就推出了poll和epoll

poll

  • 简单的对select进行了优化,但依旧不够完美,过渡使用,epoll才是最后的解决方案

epoll

  • epoll只能在linux中使用,因为这和操作系统相关

中断程序会将内核的数据copy到socket缓冲区,然后唤醒socket的等待队列,就是epoll,epoll又会唤醒进程A

epoll维护了一个就绪队列

socket数据准备好的时候会执行一个回调函数,将自己的地址交给epoll

epoll将其添加到就绪列表中,即可

进程A只需要访问epoll的就序列带能够获取到就绪的socket对象

没懂

epoll如何解决select的两个问题

  1. epoll把对于等待队列的操作,与阻塞进程分开了
  2. epoll自己维护了一个等待列表,避免了遍历所有的socket
posted @ 2019-07-11 00:08  abcde_12345  阅读(260)  评论(0编辑  收藏  举报