epoll笔记

epoll是Linux内核提供的一种高效处理大批量文件描述符的IO接口,是select/poll的增强版。它允许用户空间程序缓存IO状态,提高在大量并发连接中的CPU利用率。本文介绍了epoll_create()、epoll_ctl()以及epoll插入操作的关键步骤,包括epoll实例、事件触发模式、红黑树和等待队列等核心概念。
摘要由CSDN通过智能技术生成

最近研究netty源码,涉及到了epoll方面的知识,网上查阅了一些资料脑补

epoll

   

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

 

epoll_create()

系统调用epoll_create()会创建一个epoll实例并返回该实例对应的文件描述符fd。在内核中,每个epoll实例会和一个struct eventpoll类型的对象一一对应,该对象是epoll的核心,其声明在fs/eventpoll.c文件中.

epoll_create的接口定义在这里,主要源码分析如下:

首先创建一个struct eventpoll对象:

1

2

3

4

5

struct eventpoll *ep = NULL;

...

error = ep_alloc(&ep);

if (error < 0)

    return error;  

然后分配一个未使用的文件描述符:

1

2

3

4

5

fd = get_unused_fd_flags(O_RDWR | (flags & O_CLOEXEC));

if (fd < 0) {

    error = fd;

    goto out_free_ep;

}

然后创建一个struct file对象,将file中的struct file_operations *f_op设置为全局变量eventpoll_fops,将void *private指向刚创建的eventpoll对象ep:

1

2

3

4

5

6

7

struct file *file;

...

file = anon_inode_getfile("[eventpoll]", &eventpoll_fops, ep, O_RDWR | (flags & O_CLOEXEC));

if (IS_ERR(file)) {

    error = PTR_ERR(file);

    goto out_free_fd;

}

然后设置eventpoll中的file指针:

1

ep->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值