Epoll是Linux IO多路复用的管理机制。作为现在Linux平台高性能网络IO必要的组件。内核的实现可以参照:fs/eventpoll.c .
为什么需要自己实现epoll呢?现在自己打算做一个用户态的协议栈。采用单线程的模式。https://github.com/wangbojing/NtyTcp,至于为什么要实现用户态协议栈?可以自行百度C10M的问题。
由于协议栈做到了用户态故需要自己实现高性能网络IO的管理。所以epoll就自己实现一下。代码:https://github.com/wangbojing/NtyTcp/blob/master/src/nty_epoll_rb.c
在实现epoll之前,先得好好理解内核epoll的运行原理。内核的epoll可以从四方面来理解。
1. Epoll的数据结构,rbtree对<fd, event>的存储,ready队列存储就绪io。
2. Epoll的线程安全,SMP的运行,以及防止死锁。
3. Epoll内核回调。
4. Epoll的LT(水平触发)与ET(边沿触发)
下面从这四个方面来实现epoll。
一、Epoll数据结构
Epoll主要由两个结构体:eventpoll与epitem。Epitem是每一个IO所对应的的事件。比如 epoll_ctl EPOLL_CTL_ADD操作的时候,就需要创建一个epitem。Eventpoll是每一个epoll所对应的的。比如epoll_create 就是创建一个eventpoll。