其他分享
首页 > 其他分享> > epoll的实现原理

epoll的实现原理

作者:互联网

1.为什么在用户态协议栈实现epoll?

内核协议栈是对内核文件系统的管理,vfs。fd是用户空间,内核的epoll是没办法管理int类型的fd。

2.协议栈如何与epoll模块通信

客户端与服务器三次握手之后,会加入到全连接队列,这时候会通知epoll

 

从协议栈回调到epoll

1.通过fd查找对应的节点

2.把节点加入到就绪队列

 

客户端 协议栈 epoll是异步的,两两没有耦合。

 

3.数据结构是什么

红黑树和队列

所有的fd集合,key-value形式的数据结构:

1.hash  (刚开始创建时就要占用很大的内存,因为不知道有多少fd,创建比较大的数组,当使用比较多的fd,就适合)

2.数组  (空间不好扩展, 查找速度慢)

3.红黑树

4.b树/b+树 (层高比较低,查找的效率不会更好)

就绪的fd集合,选择线性结构:

1.队列 

2.栈(先入后出,容易造成有些fd一直取不出来,得不到处理)

 

 

红黑树的节点与就绪队列的节点是一个节点

4.如何加锁?

 

 

 

5.et与lt如何实现?

 

应用层使用epoll的三个API:

1. epoll_create :创建一个红黑树根节点 

2. epoll_ctl : 添加修改删除红黑树节点,  对红黑树加锁,整棵树加锁,互斥锁

3. epoll_wait():把就绪队列里面节点,拷贝到用户空间,就绪队列100个就绪节点, 对就绪队列加锁,自旋锁,

 

 

 

 

 select/poll 与epoll的区别

1.使用:select/poll需要把总集拷贝到内核  epoll不用

2. 实现原理:select/poll,循环遍历总集,是否有需要就绪,epoll不用。

 

为什么水平触发和边沿触发?

回调(回调就是将fd加入到就绪队列):et接收数据,调用一次回调

lt recvbuffer,里面有数据就调用回调

协议栈怎么知道有没有数据?

网卡

 

 

 

 ET模式下,当注册EPOLLOUT,会一直触发,与LT一样了,特殊情况

 

内核协议栈处理流程,网卡将数据拷贝到协议栈,再拷贝到应用程序

用户协议栈将网卡的数据使用利用dma映射到内存中(mmap),减少一次拷贝

 

标签:加锁,epoll,实现,队列,fd,原理,就绪,节点
来源: https://www.cnblogs.com/cuijy1/p/16578355.html