epoll 原理详解
一、epoll原理详解
当某一进程调用epoll_create
方法时,Linux内核会创建一个eventpoll
结构体,这个结构体中有两个成员与epoll的使用密切相关:
struct eventpoll {.../*红黑树的根节点,这棵树中存储着所有添加到epoll中的事件,也就是这个epoll监控的事件*/struct rb_root rbr;/*双向链表rdllist保存着将要通过epoll_wait返回给用户的、满足条件的事件*/struct list_head rdllist;...
};
我们在调用epoll_create
时,内核除了帮我们在epoll文件系统里建了个file
结点,在内核cache
里建了个红黑树用于存储以后epoll_ctl
传来的socket外,还会再建立一个rdllist
双向链表,用于存储准备就绪的事件,当epoll_wait
调用时,仅仅观察这个rdllist
双向链表里有没有数据即可。有数据就返回,没有数据就sleep
,等到timeout
时间到后即使链表没数据也返回。所以,epoll_wait
非常高效。
所有添加到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,也就是说相应事件的发生时会调用这里的回调方法。这个回调方法在内核中叫做ep_poll_callback
,它会把这样的事件放到上面的rdllist
双向链表中。
在epoll中对于每一个事件都会建立一个epitem
结构体,如下所示:
struct epitem {...//红黑树节点struct rb_node rbn;//双向链表节点struct list_head rdllink;//事件句柄等信息struct epoll_filefd ffd;//指向其所属的eventepoll对象struct eventpoll *ep;//期待的事件类型struct epoll_event event;...
}; // 这里包含每一个事件对应着的信息。
当调用epoll_wait
检查是否有发生事件的连接时,只是检查eventpoll
对象中的rdllist
双向链表是否有epitem
元素而已,如果rdllist
链表不为空,则这里的事件复制到用户态内存(使用共享内存提高效率)中,同时将事件数量返回给用户。因此epoll_waitx
效率非常高。epoll_ctl
在向epoll对象中添加、修改、删除事件时,从rbr
红黑树中查找事件也非常快,也就是说epoll是非常高效的,它可以轻易地处理百万级别的并发连接。
【总结】:
一颗红黑树,一张准备就绪句柄链表,少量的内核
cache
,就帮我们解决了大并发下的socket
处理问题。执行
epoll_create()
时,创建了红黑树和就绪链表;执行
epoll_ctl()
时,如果增加socket
句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据;执行
epoll_wait()
时立刻返回准备就绪链表里的数据即可。
二、epoll的两种触发模式
epoll有 EPOLLLT 和 EPOLLET 两种触发模式,LT是默认的模式,ET是“高速”模式。
LT(水平触发)模式下,只要这个文件描述符还有数据可读,每次
epoll_wait
都会返回它的事件,提醒用户程序去操作;ET(边缘触发)模式下,在它检测到有 I/O 事件时,通过
epoll_wait
调用会得到有事件通知的文件描述符,对于每一个被通知的文件描述符,如可读,则必须将该文件描述符一直读到空,让errno
返回 EAGAIN 为止,否则下次的epoll_wait
不会返回余下的数据,会丢掉事件。如果ET模式不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。
还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl
注册fd
,一旦该fd
就绪,内核就会采用类似callback
的回调机制来激活该fd
,epoll_wait
便可以收到通知。
【epoll为什么要有EPOLLET触发模式?】:
如果采用EPOLLLT模式的话,系统中一旦有大量你不需要读写的就绪文件描述符,它们每次调用epoll_wait都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率.。而采用EPOLLET这种边缘触发模式的话,当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符。
【总结】:
ET模式(边缘触发)只有数据到来才触发,不管缓存区中是否还有数据,缓冲区剩余未读尽的数据不会导致epoll_wait返回;
LT 模式(水平触发,默认)只要有数据都会触发,缓冲区剩余未读尽的数据会导致epoll_wait返回。
转载自:https://blog.csdn.net/daaikuaichuan/article/details/83862311
Epoll的具体实现:与epoll线程安全、互斥锁、自旋锁
6种 Epoll 每一种适用的业务场景 | 单线程 | 多线程 | 多进程 | 协程 | io_uring
epoll 原理详解相关推荐
- 一、epoll原理详解
Linux服务器开发/后台架构师知识体系整理 一.epoll原理详解 当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll ...
- linux epoll原理详解,Linux下selectpollepoll的实现原理(一)【转】
最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录. 其基本的原理是相同的,流程如下 先依次调用fd对应的s ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
- jQuery中getJSON跨域原理详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...
- nginx配置文件及工作原理详解
nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...
- EMD算法之Hilbert-Huang Transform原理详解和案例分析
目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...
- 图像质量损失函数SSIM Loss的原理详解和代码具体实现
本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
最新文章
- 基于ESP8266-01s 增加对于FZ35恒流电子负载WiFi接口
- maven项目编译漏掉src/main/java下的xml配置文件
- ruby的module与Java的interface以及C++的friend
- Spring Security OAuth2源码解析(一)
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
- Spring Data,MongoDB和JSF集成教程
- mongodb报错 An error occurred while loading navigation: topology was destroyed
- Elasticsearch Painless Script详解
- 什么是TCP粘包?怎么解决这个问题
- mysql insert on duplicate_一条Insert on duplicate引发的血案
- amap_flutter_map 初始化地图后将当前位置设为地图的中心点
- mv单位是什么意思_ayawawa经常说的pu MV是什么意思 怎么mv是什么意思算
- android客户端功能,推荐一个功能齐全的【玩Android客户端】
- 清理win10不常用服务
- HTTP之(二)HTTP协议简介
- Monitor的用法
- C语言之简单版本银行储蓄系统4(结构体版本)
- 二分区间的左右边界-Leetcode 33题
- DDD实战11 在项目中使用JWT的token 进行授权验证
- CATIA V5R20电气线束设计从入门到精通视频教程