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