Epoll 内核实现学习
1. 先介绍系统调用与内部实现函数的对应关系
2. 关键的数据结构及全局变量
3. 数据结构关联关系
4. 介绍 epoll 关键操作
5. 跟 select 的比较及总结
第一部分 系统调用与内部实现函数的对应关系
epoll_create------------------ sys_epoll_create
epoll_wait-------------------- sys_epoll_wait
epoll_ioctl------------------ sys_epoll_ctl
第二部分:关键的数据结构及全局变量
1. poll_safewake
struct poll_safewake {
struct list_head wake_task_list;
spinlock_t lock;
};
该结构用于执行 poll 安全唤醒,避免在调用 wake_up 时,又进入了 poll 回调操作。
wake_task_list:
Lock:自旋锁。
注解:
自旋锁是用在多处理器环境中工作的一种特殊的锁。如果内核控制路径发现自旋锁由运行
于另一个 CPU 上的内核控制路径“锁着”,就在周围“旋转”,反复执行一条紧密的循环指令 ,
直到所被释放。在单处理器环境中自旋锁不起作用,因此,对于我们 sslvpn 单 CPU 系统,
自旋锁是没有用的。
2. epitem
struct epitem {
struct rb_node rbn;
struct list_head rdllink;
struct epoll_filefd ffd;
int nwait;
struct list_head pwqlist;
struct eventpoll *ep;
struct epoll_event event;
atomic_t usecnt;
struct list_head fllink;
struct list_head txlink;
unsigned int revents;
};
每个加入到 eventepoll 接口中的文件描述符,都有一个该类型的条目加入到 hash 表中
Rbn:rb-tree 节点。用于将该结构链入 eventepoll 的 rb-tree 中。
Rdllink:链表头,用于链接该结构到 eventepoll 的 ready 链表中
评论1