select的问题
- 当进程被唤醒时,不清楚到底哪个socket有数据,只能遍历一遍
- 每一次select的执行,都需要将这进程,再加入到等待队列中
- 为了重复添加等待队列,当每一次操作完成时,也需要从等待队列中删除进程
所以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的两个问题
- epoll把对于等待队列的操作,与阻塞进程分开了
- epoll自己维护了一个等待列表,避免了遍历所有的socket