为什么会有epoll这个技术的产生呢?
select 和poll 函数,这两系统函数每次调用都需要我们
提供给它所要需要侦听的socket文件描述符集合
select 和poll 函数的返回值是个int整型值,只能代表有
几个socket就绪或者是有错误了
它没办法表示出是哪个 具体是哪几个socket就绪了
这就导致我们程序被唤醒之后,它还需要新一轮系统调用去检查哪个
socket是就绪状态的 ,然后再进行socket数据处理逻辑
eventpoll的结果,说下这个结构,它主要是两块重要的区域:
一块是存放需要监听的socket_fd描述符号列表
另一块区域就是就绪列表,存放就绪状态的socket信息
就绪列表是怎么维护的呢?
socket 对象,它有3块区域吗 读缓冲区 写缓存区 还有等待队列
select 函数调用时会把当前调用进程从工作队列里面拿出来
然后把进程引用追加到当前进程关注的每一个socket对象的等待队里中
socket等待队列中的进程全部移到到工作对垒内,然后select函数就返回了
epoll处理
把当前eventpoll对象 追加到这个socket等待队列里,
再去检查这个socket的等待队列,
它发现这个socket等待队列内等待的不是进程,是一个eventpoll对象引用
它就根据这个eventpoll引用,将当前socket的引用追加到eventpoll的就绪链表末尾
eventpoll 还有一块空间是eventpoll等待队列
检查eventpoll 对象的等待队列,如果有进程 就会把进程转移到工作队列内
把这个进程 从这个eventpool 等待队列里面,迁移到工作队列