长春网站建设选择星宿科技,网站开发关联下拉列表,frontpage做网站,免费虚拟主机vps一、epoll实现原理
1、实现原理 epoll通过3个方法来实现对句柄的监控操作#xff0c;要深刻理解epoll#xff0c;首先得了解epoll的三大关键要素#xff1a;mmap、红黑树、链表。下面是epoll的框架图#xff0c;如下#xff1a; mmap epoll是通过内核与用户空间mmap同一块…一、epoll实现原理
1、实现原理 epoll通过3个方法来实现对句柄的监控操作要深刻理解epoll首先得了解epoll的三大关键要素mmap、红黑树、链表。下面是epoll的框架图如下 mmap epoll是通过内核与用户空间mmap同一块内存实现的。mmap将用户空间的一块地址和内核空间的一块地址同时映射到相同的一块物理内存地址不管是用户空间还是内核空间都是虚拟地址最终要通过地址映射映射到物理地址使得这块物理内存对内核和对用户均可见减少用户态和内核态之间的数据交换。 红黑树 红黑树将存储epoll所监听的句柄注册的句柄通过红黑树来保存。epoll在实现上采用红黑树去存储所有套接字当添加或者删除一个套接字时epoll_ctl都在红黑树上去处理红黑树本身插入和删除性能比较好时间复杂度O(logN)。 链表 一旦有事件发生epoll就会将该事件添加到双向链表中。那么当我们调用epoll_wait时epoll_wait只需要检查rdlist双向链表中是否有存在注册的事件效率非常可观。这里也需要将发生了的事件复制到用户态内存中即可。 2、epoll_wait的工作流程 1epoll_wait调用ep_poll当rdlist为空无就绪fd时挂起当前进程直到rdlist不空时进程才被唤醒 2文件fd状态改变buffer由不可读变为可读或由不可写变为可写导致相应fd上的回调函数ep_poll_callback()被调用 3ep_poll_callback将相应fd对应epitem加入rdlist导致rdlist不空进程被唤醒epoll_wait得以继续执行 4ep_events_transfer函数将rdlist中的epitem拷贝到txlist中并将rdlist清空 5ep_send_events函数它扫描txlist中的每个epitem调用其关联fd对用的poll方法。此时对poll的调用仅仅是取得fd上较新的events防止之前events被更新之后将取得的events和相应的fd发送到用户空间封装在struct epoll_event从epoll_wait返回 3、epoll高效的本质 1减少了对可读可写文件句柄的遍历 2减少了用户态和内核态的文件句柄拷贝内核直接监控句柄 3mmap 加速了内核与用户空间的信息传递epoll是通过内核与用户mmap同一块内存减少用户态与内核态数据交换 4IO性能不会随着监听的文件描述的数量增长而下降 5使用红黑树存储fd以及对应的回调函数其插入查找删除的性能不错 参考文档https://www.zhihu.com/zvideo/1351542438125760512