epoll的底层实现机制

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

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

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

 

首先谈一谈epoll_create()

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

进程调用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()

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

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

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

 

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

 

 

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

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

 


版权声明:本文为weixin_41521306原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。