epoll是在2.5.44内核中引进的,被公认为是最好的多路IO就绪通知方法
创建一个 epoll 对象,这里类似于创建管道,但是这里返回的是一个标识该软件资源的文件描述符。
这里的参数 size 在linux2.6.8之后就忽略了,但是减一传参为256,128避免平台不同出错
第二个参数为动作 EPOLL_CTL_ADD: 注册新的 fd 到 opfd 中 EPOLL_CTL_MOD: 修改已注册的 fd 的监听事件 EPOLL_CTL_DEL: 从epfd中删除该fd
第三参数为要监听的文件描述符
struct epoll_event
1.创建epoll模型 调用epoll_create()之后,内核会做3件事情 (1)在操作系统底层(硬件驱动, 卡)构建会调机制 (2)在操作系统层构建一颗红黑树(一种相对平衡的二叉搜索树),树的每个节点用来保存用户关心的事件(即用户关心的文件描述符和所关心的事件类型) (3)在操作系统层构建一个就绪队列,保存众多事件中已经就绪的事件 2.用户控制事件 (1) 用户通过调用epoll_ctl()实现实现告诉操作系统,你现在要关心的文件描述符和关心的事件类型 (2)操作系统会将这一事件保存在红黑树中 3.内核激活事件 (1)操作系统得知 卡(文件)上面有数据就绪时(硬件机制),激活该事件,将其存入就绪队列中 (2)用户调用epoll_wait()返回时,返回的为就绪队列中就绪的事件 我们说epoll_wait()的实现是O(1)的时间复杂度,只需要关注就绪队列是否为空,不为空就将事件复制到用户态
对比于我们之前学的select 和 poll epoll的优点
完。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!