epoll源码分析

epoll经典代码示例 1. epoll原理 原理性的知识不再另做说明,我在这里附上收藏整理的两篇经典文章: selectepoll的本质关系。 select、poll、epoll之间的区别。 2. epoll服务器端经典示例 2.1 逻辑框架 2.2 代码 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <asse. 阅读详情

码字不易,转载请标明出处

前言

Linux内核提供了3个关键函数供用户来操作epoll,分别是:

  • epoll_create(), 创建eventpoll对象 
  • epoll_ctl(), 操作eventpoll对象 
  • epoll_wait(), 从eventpoll对象中返回活跃的事件

而操作系统内部会用到一个名叫epoll_event_callback()的回调函数来调度epoll对象中的事件,这个函数非常重要,故本文将会对上述4个函数进行源码分析。


源码来源

由于epoll的实现内嵌在内核中,直接查看内核源码的话会有一些无关代码影响阅读。为此笔者在GitHub上找到一个大神写的简化版TCP/IP协议栈,里面实现了epoll逻辑。链接为:https://github.com/wangbojing/NtyTcp

存放着以上4个关键函数的文件是[src\nty_epoll_rb.c],本文接下来通过分析该程序的代码来探索epoll能支持高并发连接的秘密。


两个核心数据结构

(1)epitem

如图所示,epitem是中包含了两个主要的成员变量,分别是rbn和rdlink,前者是红黑树的节点,而后者是双链表的节点,也就是说一个epitem对象即可作为红黑树中的一个节点又可作为双链表中的一个节点。并且每个epitem中存放着一个event,对event的查询也就转换成了对epitem的查询。

struct epitem {
	RB_ENTRY(epitem) rbn;
	/*  RB_ENTRY(epitem) rbn等价于
	struct {											
		struct type *rbe_left;		//指向左子树
		struct type *rbe_right;		//指向右子树
		struct type *rbe_parent;	//指向父节点
		int rbe_color;			    //该节点的颜色
	} rbn
	*/

	LIST_ENTRY(epitem) rdlink;
	/* LIST_ENTRY(epitem) rdlink等价于
	struct {									
		struct type *le_next;	//指向下个元素
		struct type **le_prev;	//前一个元素的地址
	}*/

	int rdy; //判断该节点是否同时存在与红黑树和双向链表中
	
	int sockfd; //socket句柄
	struct epoll_event event;  //存放用户填充的事件
};

(2)eventpoll

如图所示,eventpoll中包含了两个主要的成员变量,分别是rbr和rdlist,前者指向红黑树的根节点,后者指向双链表的头结点。即一个eventpoll对象对应二个epitem的容器。对epitem的检索,将发生在这两个容器上(红黑树和双链表)。

struct eventpoll {
	/*
	struct ep_rb_tree {
		struct epitem *rbh_root; 			
	}
	*/
	ep_rb_tree rbr;      //rbr指向红黑树的根节点
	
	int rbcnt; //红黑树中节点的数量(也就是添加了多少个TCP连接事件)
	
	LIST_HEAD( ,epitem) rdlist;    //rdlist指向双向链表的头节点;
epoll源码剖析 好久好久没有更新博客了,最近一直在实习,刷算法找工作,忙里偷闲简单研究了一下epoll源码。也是由于面试的时候经常被问到,我只会说那一套,什么epoll_create创建红黑树,以O(1)的方式去读取数据,它和poll与select的区别等等。本篇将从epoll源码层面重新学习epoll 阅读详情

相关推荐

网络编程epoll源码深度剖析

IO多路复用技术中epoll是很重要的部分,从源码中理解它的高性能

小鱼学编程 4949

epoll机制源码分析

epoll机制源码分析 文章目录epoll机制源码分析epoll 调用方法epoll实现原理源码分析关键结构思考题 epoll 调用方法 // 调用epoll_create建立一个epoll对象(在epoll文件系统中给这个句柄分配资源); //参数:监听的最大fd数目 返回值:epollfd int epoll_create(int size); //添加、删除、更改操作 //参数:ep...

qq_22121229的博客 468

EPOLL源码

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

weixin_43890947的博客 1587

(转)epoll源码分析

(转)epoll源码分析 当系统启动时,epoll进行初始化: 1 static int __init eventpoll_init(void) 2 { 3 mutex_init(&pmutex); 4 ep_poll_safewak...

158

epoll源码分析(三)

epoll源码分析(三) epoll源码分析(三) epoll_wait函数 总结 epoll_wait函数 SYSCALL_DEFINE4(epoll_wait,…) 判断最大值合法性 获取匿名文件的文件指针, 取得文件信息 调用ep_poll阻塞自己, 等待有消息的到来 // epoll_wait()函数的调用 SYSCALL_DEFINE4(epo...

啦啦啦 1357

libevent库epoll反应堆模型源码分析

libevent库epoll反应堆模型源码分析 /* *epoll基于非阻塞I/O事件驱动 */ #include <stdio.h> #include <sys/socket.h> #include <sys/epoll.h> #include <arpa/inet.h> #include <fcntl.h> #include &l...

zhuoyue01的博客 313

epoll源码分析它的使用

首先来看看epoll_create的真身SYSCALL_DEFINE1(epoll_create, int, size) { if (size <= 0) return -EINVAL; //也就是说参数size根本用不上 return sys_epoll_create1(0); }再来看看epoll_create1的真身SYSCALL_DEFINE1(epoll_c

Linux C/C++后台开发 1810

Linux I/O 多路复用技术 epoll 源码分析

epoll 源码分析 在 Linux 下做网络编程,一定需要对 epoll 有深入的了解,因此我在这里对 epoll源码做了注释,因为源码过长,所以摘出来一些重要的数据结构和关键代码,对其做了注释(从暑假拖到12月份也太真实了…),github地址. epoll 介绍 什么是 I/O 多路复用? 在讲解 epoll 之前,我先简单介绍一下什么是多路复用,其实能想着去了解 epoll 底层实现原理的人一般不会出现这种疑问,但是我还是简单的说一下吧. 当我们在进行网络编程的时候,经常会出现一种场景. 我

RandyLambert的博客 406

Epoll详解及源码分析

epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用(IO multiplexing)技术,按照man手册的说法:是为处理大批量句柄而作了改进的poll。 Linux下有以下几个经典的服务器模型:   ①Apache模型(Process Per Connection,简称PPC)

kingkongkang的博客 942

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

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

qq_23095607的博客 1640

Linux epoll模型详解及源码分析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhaobryant/article/details/80557262 一、epoll简介 epoll是当前在Linux下开发大规模并...

175

epoll之ep_insert()源码分析

参考:http://www.cnblogs.com/apprentice89/p/3234677.html ep_insert()过程中涉及的数据结构及回调函数如下图所示: 其中,红色部分回调函数构造了红色部分的结构体,黄色部分结构体主要由init_poll_funcptr和主函数ep_insert构造。 具体源码表在下面,重点环节已标出,以后有空再完善吧~ str

ordeder的专栏 3479
上一篇: 『项目总结』基于线程池的矢量瓦片切割技术
再也不玩网游了
博客等级 码龄9年 15粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值