这篇文章读不懂的没关系,可以先收藏一下。
当然,这些核心思想,也会在之后的文章中慢慢做详细讲解,欢迎关注。
文章如果实在是没有看懂,可以回头来看看这个视频讲解:epoll原理剖析
epoll 是Linux平台下的一种特有的多路复用IO实现方式,与传统的 select 相比,epoll 在性能上有很大的提升。本文主要讲解 epoll 的实现原理,而对于 epoll 的使用可以参考相关的书籍或文章。
epoll 的创建
要使用 epoll 首先需要调用 epoll_create() 函数创建一个 epoll 的句柄,epoll_create() 函数定义如下:
int epoll_create(int size);
参数 size 是由于历史原因遗留下来的,现在不起作用。当用户调用 epoll_create() 函数时,会进入到内核空间,并且调用 sys_epoll_create() 内核函数来创建 epoll 句柄,sys_epoll_create() 函数代码如下:
asmlinkage long sys_epoll_create(int size)
{
int error, fd = -1;
struct eventpoll *ep;
error = -EINVAL;
if (size <= 0 || (error = ep_alloc(&ep)) < 0) {
fd = error;
goto error_return;
}
fd = anon_inode_getfd("[eventpoll]", &eventpoll_fops, ep);
if (fd < 0)
ep_free(ep);
error_return:
return fd;
}
sys_epoll_create() 主要做两件事情:
- 调用 ep_alloc() 函数创建并初始化一个 eventpoll 对象。
- 调用 anon_inode_getfd() 函数把 eventpoll 对象映射到一个文件句柄,并返回这个文件句柄。
我们先来看看 eventpoll 这个对象,eventpoll 对象用于管理 epoll 监听的文件列表,其定义如下:
struct eventpoll {
...
wait_queue_head_t wq;
...
struct list_head rdllist;
struct rb_root rbr;
...
};
先来说明一下 eventpoll 对象各个成员的作用:
- wq: 等待队列,当调用 epoll_wait(fd) 时会把进程添加到 eventpoll 对象的 wq 等待队列中。
- rdllist: 保存已经就绪的文件列表。
- rbr: 使用红黑树来管理所有被监听的文件。
下图展示了 eventpoll 对象与被监听的文件关系:
文章理解有任何问题,欢迎加我qun:正在跳转 进来讨论
分享更多关于C/C++ Linux服务器开发高级架构架构 学习资料,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。
学习视频