作为C++后端开发程序员,应该彻底理解Epoll实现原理

本文详细解析了Epoll在Linux下的实现原理,包括Epoll的创建、向Epoll添加文件句柄以及等待文件状态改变的过程。通过epoll_create()、epoll_ctl()和epoll_wait()函数,阐述了Epoll如何高效地管理被监听的文件句柄,并在文件状态改变时唤醒等待进程。此外,还介绍了Epoll中红黑树的数据结构以及Epoll与socket的交互机制。
摘要由CSDN通过智能技术生成

这篇文章读不懂的没关系,可以先收藏一下。

当然,这些核心思想,也会在之后的文章中慢慢做详细讲解,欢迎关注。

文章如果实在是没有看懂,可以回头来看看这个视频讲解: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() 主要做两件事情:

  1. 调用 ep_alloc() 函数创建并初始化一个 eventpoll 对象。
  2. 调用 anon_inode_getfd() 函数把 eventpoll 对象映射到一个文件句柄,并返回这个文件句柄。

我们先来看看 eventpoll 这个对象,eventpoll 对象用于管理 epoll 监听的文件列表,其定义如下:

struct eventpoll {
    ...
    wait_queue_head_t wq;
    ...
    struct list_head rdllist;
    struct rb_root rbr;
    ...
};

先来说明一下 eventpoll 对象各个成员的作用:

  1. wq: 等待队列,当调用 epoll_wait(fd) 时会把进程添加到 eventpoll 对象的 wq 等待队列中。
  2. rdllist: 保存已经就绪的文件列表。
  3. rbr: 使用红黑树来管理所有被监听的文件。

下图展示了 eventpoll 对象与被监听的文件关系:

 

文章理解有任何问题,欢迎加我qun:正在跳转 进来讨论

分享更多关于C/C++ Linux服务器开发高级架构架构 学习资料,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。​​​​​​​

学习视频

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值