ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

epoll的实现原理

2022-08-12 00:00:22  阅读:196  来源: 互联网

标签:加锁 epoll 实现 队列 fd 原理 就绪 节点


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有