epoll的底层实现机制

1 .epoll_create() //创建内核事件表 容纳事件的容器

2.epoll_ctl() // 向内核事件表中 添加、修改、移除 事件

3.epoll_wait() // 检查获取就绪事件

 

首先谈一谈epoll_create()

epoll的底层实现机制_第1张图片

sys_epoll_create是创建一个新的内核事件表,分别通过ep_getfd()、ep_file_init()函数分配struct file、fd、struct inode,并创立起关联。

epoll的底层实现机制_第2张图片

epoll的底层实现机制_第3张图片

进程调用epoll()步骤:首先是为为进程在文件表中分配未被使用的fd,在申请一个struct file,并创建fd与struct file 的关联;对strunct inode 进行分配;对struct file里的private_date与struct eventpoll 进行关联,间接的建立fd与struct eventpoll中struct list_head rdlist即就绪队列和struct rb_list rbr 即内核事件表建立关联。

 

再谈一谈.epoll_ctl()

epoll的底层实现机制_第4张图片

参数为传一个fd,op为对内核事件表的增删改操作的指令。

epoll的底层实现机制_第5张图片

epoll的底层实现机制_第6张图片

epoll_ctl()的作用主要是将描述符和事件添加等操作到内核事件表中。关键操作时在

添加时等等待队列中注册回调函数,描述符就绪时将其添加到就绪队列中,在添加到内核事件表中。

 

 最后谈一谈epoll_wait(),检查并获取就绪队列。

 

epoll的底层实现机制_第7张图片

 

epoll的底层实现机制_第8张图片

此处重点谈一下ET和LT模式,ET模式是将就绪的事件传给用户的event结构体数组后,在将事件传给一个列表txlist,进而返回给就绪列表,下一次传递会再检测事件用户是否完全接收数据,将未完全接收就绪事件再次传递给用户,重复步骤,直至用户全部接受数据为止。

LT模式为将就绪事件传递给用户之后,不必返回给就绪列表,可能存在丢失数据的可能。

 

你可能感兴趣的:(linux)