epoll源码探秘(epoll_create)

Linux epoll内核源码剖析 IO多路复用接口Linux内核源码剖析,源码之前,了无密码 poll Linux内核源码剖析 select Linux内核源码剖析 epoll Linux内核源码剖析 epoll Linux内核源码剖析 前面介绍了select/poll,此文章将讲解epoll,epoll是select/poll的增强版,epoll更加高效,当然也更加复杂 epoll高效的一个重要的原因是在获取事件的时候,它无须遍... 阅读详情

epoll源码探秘(epoll_create)

epoll系列的系统函数,很简单,但是很强大。epoll_create(),epoll_ctl() , epoll_wait(),三个就够了。

一些重要的结构:

/*
 * Each file descriptor added to the eventpoll interface will
 * have an entry of this type linked to the "rbr" RB tree.
 * Avoid increasing the size of this struct, there can be many thousands
 * of these on a server and we do not want this to take another cache line.(红黑树单节点)
 */
struct epitem {
	union {
		/* RB tree node links this structure to the eventpoll RB tree */
		struct rb_node rbn;
		/* Used to free the struct epitem */
		struct rcu_head rcu;
	};

	/* List header used to link this structure to the eventpoll ready list (列表头用于连接结构的eventpoll就绪列表)*/
	struct list_head rdllink;

	/*
	 * Works together "struct eventpoll"->ovflist in keeping the
	 * single linked chain of items.
	 */
	struct epitem *next;

	/* The file descriptor information this item refers to (关联的文件描述符)*/
	struct epoll_filefd ffd;

	/* Number of active wait queue attached to poll operations (轮询操作)*/
	int nwait;

	/* List containing poll wait queues */
	struct list_head pwqlist;

	/* The "container" of this item */
	struct eventpoll *ep;

	/* List header used to link this item to the "struct file" items list */
	struct list_head fllink;

	/* wakeup_source used when EPOLLWAKEUP is set */
	struct wakeup_source __rcu *ws;

	/* The structure that describe the interested events and the source fd (感兴趣的监控文件描述符的状态)*/
	struct epoll_event event;
};
/*
 * This structure is stored inside the "private_data" member of the file
 * structure and represents(表现)the main data structure for the eventpoll
 * interface.
 */
struct eventpoll {
	/* Protect the access to this structure */
	spinlock_t lock;

	/*
	 * This mutex is used to ensure that files are not removed
	 * while epoll is using them. This is held during the event
	 * collection loop, the file cleanup path, the epoll file exit
	 * code and the ctl operations.
	 */
	struct mutex mtx;

	/* Wait queue used by sys_epoll_wait() (双链表,epoll文件的等待队列。
	 *调用epoll_wait的进程可能在此队列上睡眠, 等待ep_poll_callback()函数唤醒或超时 
	 */
	wait_queue_head_t wq;

	/* Wait queue used by file->poll() (双链表, poll_wait是eventpoll文件本身的唤醒队列,
	 *该队列上睡眠的进程是等待eventpoll文件本身的某些事件发生
	 */
	wait_queue_head_t poll_wait;

	/* List of ready file descriptors (就绪链表)*/
	struct list_head rdllist;

	/* RB tree root used to store monitored fd structs (存储监听文件描述符结构红黑树根节点)*/
	struct rb_root rbr;

	/*
	 * This is a single linked list(单链表) that chains all the "struct epitem" that
	 * happened while transferring ready events to userspace w/out
	 * holding ->lock.(如果正在向用户空间传递事件,此时状态就绪的文件描述符相关的结构会暂时放在该队列上,
	 * 否则会直接添加到就绪队列rdllist中。)
	 */
	struct epitem *ovflist;

	/* wakeup_source used when ep_scan_ready_list is running */
	struct wakeup_source *ws;

	/* The user that created the eventpoll descriptor */
	struct user_struct *user;

	struct file *file;

	/* used to optimize loop detection check */
	int visited;
	struct list_head visited_list_link;
};


epoll_create函数:

         创建一个epoll的句柄。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

int epoll_create(int size);
int epoll_create1(int flags);

第一级:epoll_create()(注意在Linux 2.6.8之后,size参数是被忽略的)

第二级: epoll_create1()

第三级:ep_alloc()创建内部数据(eventpoll)

                 在ep_alloc()中

               1.初始化epoll文件等待队列(双向链表)

               2.初始化eventpoll文件唤醒队列(双向链表)

               3.初始化就绪队列(双向链表)

static inline void INIT_LIST_HEAD(struct list_head *list)
{
	list->next = list;
	list->prev = list;
}

               4.初始化红黑树根节点

#define RB_ROOT	(struct rb_root) { NULL, }
ep->rbr = RB_ROOT;

               5.初始化发生事件红黑树节点链表(单链表)

#define EP_UNACTIVE_PTR ((void *) -1L)
ep->ovflist = EP_UNACTIVE_PTR;

第三级:get_unused_fd_flags()获取一个空闲的文件描述符

第三级:anon_inode_getfile()创建一个匿名文件

第三级:fd_install()将文件与fd建立联系

/*
 * Open an eventpoll file descriptor.
 */
SYSCALL_DEFINE1(epoll_create1, int, flags)
{
	int error, fd;
	struct eventpoll *ep = NULL;
	struct file *file;

	/* Check the EPOLL_* constant for consistency(符合条件EPOLL_CLOEXEC != O_CLOEXEC就报错).  */
	BUILD_BUG_ON(EPOLL_CLOEXEC != O_CLOEXEC);

	if (flags & ~EPOLL_CLOEXEC)
		return -EINVAL;
	/*
	 * Create the internal(内部) data structure ("struct eventpoll").
	 */
	error = ep_alloc(&ep);
	if (error < 0)
		return error;
	/*
	 * Creates all the items needed to setup an eventpoll file. That is,
	 * a file structure and a free file descriptor.
	 *(分配eventpoll实例并初始化,存储在file结构的private_data成员中。 
     * private_data成员用来存储文件描述符真正对应的对象。例如 
     * 如果文件描述符是一个套接字的话,其对应的file实例的private_data 
     * 成员存储的就是一个socket实例。)
	 */
	fd = get_unused_fd_flags(O_RDWR | (flags & O_CLOEXEC));
	if (fd < 0) {
		error = fd;
		goto out_free_ep;
	}
	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;
	}
	ep->file = file;
	fd_install(fd, file);
	return fd;

out_free_fd:
	put_unused_fd(fd);
out_free_ep:
	ep_free(ep);
	return error;
}

SYSCALL_DEFINE1(epoll_create, int, size)
{
	if (size <= 0)
		return -EINVAL;

	return sys_epoll_create1(0);
}




























Linux epoll模型详解及源码分析 一、epoll简介 epoll是当前在Linux下开发大规模并发网络程序的热门选择,epoll在Linux2.6内核中正式引入,和select相似,都是IO多路复用(IO multiplexing)技术。 按照man手册的说法,epoll是为处理大批量句柄而做了改进的poll。 Linux下有以下几个经典的服务器模型: 1、PPC模型和TPC模型 PPC(Process Per Co... 阅读详情

相关推荐

epoll源码剖析

好久好久没有更新博客了,最近一直在实习,刷算法找工作,忙里偷闲简单研究了一下epoll的源码。也是由于面试的时候经常被问到,我只会说那一套,什么epoll_create创建红黑树,以O(1)的方式去读取数据,它和poll与select的区别等等。本篇将从epoll的源码层面重新学习epoll。

分享学习的知识,记录我的技术成长道路 1553

epoll_create详解

epoll_create,打开一个epoll文件描述符。 #include <sys / epoll.h> nfd = epoll_creat(max_size); epoll_create()创建一个epoll实例。其中nfd为epoll句柄,参数max_size标识这个监听的数目最大有多大,从Linux 2.6.8开始,max_size参数将被忽略,但必须大于零。epoll_create()返回引用新epoll实例的文件描述符。该文件描述符用于随后的所有对epoll的调...

zhoumuyu_yu的博客 2万+

epoll源码分析

码字不易,转载请标明出处 前言 Linux内核提供了3个关键函数供用户来操作epoll,分别是: epoll_create(), 创建eventpoll对象 epoll_ctl(), 操作eventpoll对象 epoll_wait(), 从eventpoll对象中返回活跃的事件 而操作系统内部会用到一个名叫epoll_event_callback()的回调函数来调度epoll对...

Replus_的博客 966

epoll用法详解与编程实例

epoll中三个函数中的相关参数到底应该怎么使用?这篇epoll用法详解与编程实例文章将告诉你。

weixin_43354152的博客 4110

03 Aras Innovator二次开发-服务端方法(二)

Aras Innovator二次开发-服务端方法书写

企业信息化(PLM,ERP.MES) 2017

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

epoll_create()函数

epoll_create()函数

fucheng的博客 1596

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2982

epoll

文章目录epoll编程接口创建epoll实例:epoll_create()修改epoll的兴趣列表:epoll_ctl()事件等待:epoll_wait()深入探究epoll的语义epoll同I/O多路复用的性能对比边缘触发通知三种I/O复用函数的比较 epoll编程接口 linux的epoll(event poll)API可以检查多个文件描述符上的I/O就绪状态。 epoll API主要优点如下: 当检查大量的文件描述符时,epoll的性能延展性比select()和poll()高很多。 epoll AP

qq_36553387的博客 1487

FlexibleButton嵌入式按键处理方案设计与实现

嵌入式系统中的按键处理是基础且关键的人机交互技术,其核心原理是通过GPIO电平检测结合状态机实现事件识别。FlexibleButton作为轻量级C语言按键处理库,采用硬件抽象层设计实现驱动解耦,支持单击、双击、长按等丰富事件类型。该方案通过集中式扫描策略和内置消抖算法,在RT-Thread和裸机环境中均能稳定运行,特别适合需要组合按键检测和低功耗优化的物联网设备。典型应用场景包括智能家居控制面板和工业HMI界面开发,其中硬件解耦架构和事件驱动模型显著提升代码复用率。

weixin_35757191的博客 402

Windows 10/11蓝屏急救:SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION报错全攻略(附安全模式+CMD修复)

本文针对Windows 10/11系统常见的SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION蓝屏报错,提供了从诊断到修复的完整解决方案。文章深入剖析了该错误与系统安全功能“内存完整性”及pci.sys驱动的关系,并详细指导用户如何通过安全模式进行基础修复,以及使用命令提示符执行高级系统文件修复和注册表修改,帮助用户彻底解决蓝屏问题并恢复系统稳定。

echo99的专栏 969

epoll_create

【代码】epoll_create。

weixin_41812346的博客 620

YOLOv8剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

该摘要介绍了LAMP剪枝方法的创新点和理论分析,重点突出了其最小化L2失真和分层自适应剪枝的特性。LAMP通过引入ξ变量在最坏情况下优化剪枝失真,并简化了计算过程。文章还提供了代码移植的具体步骤,包括创建compress.py文件和相关配置说明。

FJN110的博客 1113

【Linux深入】epoll源码剖析

引入 之前讲了select、poll、epoll的区别,由于许多应用中都用到了epoll,例如Netty、Redis等等,所以就来深入学习一下,现在我们就来剖析一下epoll的源码 我先来剖析理解epoll源码的基础:主要的数据结构,然后再来解析epoll主要的三个方法:epoll_create()、epoll_ctl()、epoll_wait()。 主要的数据结构1.eventpoll// epo

白夜行 1万+

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1733

【Bluetooth|蓝牙开发】二、蓝牙开发入门

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

Donge's Blog 1万+

epoll_create1与epoll_create区别

引子 第一次看到epoll_create1时非常疑惑 不知道为什么要有这样一个函数 所以在问题解决后写下这篇文章 首先来看一段文档 epoll_create() creates an epoll “instance”, requesting the kernel to allocate an event backing store dimensioned for size descripto...

李兆龙的博客 7826

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

epoll源码解析(1) epoll_create

示例代码内核版本为2.6.38 引言 这篇文章主要对于epoll_create以及epoll中所使用的重要数据结构进行分析,这些是在后续文章中搞懂epoll为何如此高效的前提.我们首先来看看两个数据结构. struct eventpoll { /* Protect the access to this structure */ spinlock_t lock; //自旋锁,提供更细粒度的锁定,...

李兆龙的博客 3072

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

EPOLL源码

在创建 epitem 并初始化之后,ep_insert 中第二件事情就是设置 socket 对象上的等待任务队列。并把函数 fs/eventpoll.c 文件下的 ep_poll_callback 设置为数据就绪时候的回调函数。在 ep_ptable_queue_proc 函数中,新建了一个等待队列项,并注册其回调函数为 ep_poll_callback 函数。然后再将这个等待项添加到 socket 的等待队列中。当有的连接就绪的时候,内核会把就绪的连接放到 rdllist 链表里。wq: 等待队列链表。

weixin_43890947的博客 1590

158 Linux C++ 通讯架构实战13,epoll 原理和函数介绍,epoll_create,epoll_ctl ,epoll_wait

掌握这个三个函数的使用,并结合网上一些大神关于如何自己实现这个三个函数的源码分析,epoll的三个关键函数都干了什么。大神源码://a)c1000k_test这里,测试百万并发的一些测试程序;一般以main();//c)总结:建议学习完老师的epoll实战代码之后,再来学习 这里提到的课件代码,事半功倍;

hunandede的博客 1715

Epoll内核源码解析

epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);

wuxiaoyu0806的博客 984

epoll源码分析---sys_epoll_create()函数

eventpoll的优点就不用说了,网上的资料很多,eventpoll的使用也很广泛,特别是在Web服务器中。因为最近要用到epoll,所以好好地看了一下它的实现,把学到的一些东西做下整理,做个记录。 一、sys_epoll_create()   其源码如下: SYSCALL_DEFINE1(epoll_create, int, size) { if (size <= 0)

Justlinux2010的专栏 5578

从linux源码看epoll

从linux源码看epoll 前言 在linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。epoll能让内核记住所关注的描述符,并在对应的描述符事件就绪的时候,在epoll的就绪链表中添加这些就绪元素,并唤醒对应的epoll等待进程。 本文就是笔者在探究epoll...

weixin_40988939的博客 889

「底层原理」epoll源码分析,还搞不懂epoll的看过来

epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);

qq_23095607的博客 1644
上一篇: vs2015 配置boost
下一篇: epoll源码探秘(epoll_ctl)
贰月十七
博客等级 码龄14年 31粉丝 102原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值