简述epoll实现

所有学习笔记:https://github.com/Dusongg/StudyNotes

文章目录

  • epoll数据结构的选择?
  • 以tcp为例,网络io的可读可写如何判断?
  • epoll如何做到线程安全?
  • LT和ET如何实现?
  • tcp状态和io的读写有哪些关系?
    • epoll_wait等待io唤醒过程(以建立tcp建立链接为例)

epoll数据结构的选择?

  • rbtree/hash/btree/b+tree?
    • hash内存浪费

epoll内核为什么不选择哈希表而是选择红黑树?

在Linux的epoll中,为了实现高效的事件管理,epoll内核模块采用了红黑树作为事件的存储结构,而不是哈希表。这是因为红黑树在查找、插入和删除等操作上具有较好的性能表现,特别是对于大量事件的管理。

红黑树是一种自平衡的二叉查找树,具有以下特点:

  1. 在最坏情况下,插入、删除和查找操作的时间复杂度为O(log n),保证了较好的性能。
  2. 红黑树的结构相对稳定,对于动态添加和删除节点的场景,红黑树能够保持平衡,减少了不必要的树旋转操作。
  3. 红黑树的高度较低,使得在进行查找操作时能够快速定位到目标节点。

相比之下,哈希表虽然在平均情况下具有O(1)的插入、删除和查找操作,但在处理大规模数据时,哈希表的冲突处理、扩容和缩小等操作会引入额外的开销,而且哈希表的遍历不如红黑树高效,因此在这种场景下,红黑树更适合作为epoll的事件管理数据结构

  • btree/b+tree更适合磁盘查找

所以最终

io集合用红黑树管理;就绪集合用队列管理;队列和红黑树公用一个节点

image-20240309234541225

image-20240310001744630

以tcp为例,网络io的可读可写如何判断?

  1. 对于tcp而言,哪些事件是的io变为就绪:

    1. 三次握手完成 -> listenfd可读

    2. 当recvbuffer接收到数据 -> clientfd可读

      image-20240310004908826

    3. 当sendbuffer有空间 -> clientfd可写

    4. 当接收到FIN包 -> clientfd可读

epoll如何做到线程安全?

一把锁锁rbtree -> mutex:得不到锁,休眠

一把锁锁queue -> spinlock :得不到锁,一直等待

自旋锁和互斥锁都是用于多线程编程中实现同步的机制,但它们有一些区别:

  1. 等待方式
    • 自旋锁:线程在尝试获取锁时,如果锁已经被其他线程持有,该线程会一直处于忙等(自旋)状态,直到锁被释放。
    • 互斥锁:线程在尝试获取锁时,如果锁已经被其他线程持有,该线程会被阻塞,直到锁被释放。
  2. 实现机制
    • 自旋锁:通常使用原子操作来实现,因此适用于轻量级的同步操作。
    • 互斥锁:通常使用操作系统提供的系统调用(如pthread_mutex_lock)来实现,因此会涉及到用户态和内核态的切换,性能开销较大。
  3. 适用场景
    • 自旋锁:适用于锁被持有的时间很短的情况,避免了线程切换的开销。
    • 互斥锁:适用于锁被持有的时间较长的情况,可以让等待的线程进入睡眠状态,不会占用CPU资源。
  4. 实现复杂度
    • 自旋锁:实现相对简单,主要依赖于原子操作。
    • 互斥锁:实现相对复杂,需要考虑线程阻塞、唤醒等操作。

LT和ET如何实现?

tcp内部有一个循环,内核recvbuffer。

  • LT判断recvbuffer有数据就回调,往就绪队列里增加节点,节点状态为就绪

  • ET判断有数据写入recvbuffer才回调,往队列里增加节点,节点状态为就绪

image-20240310001521549

tcp状态和io的读写有哪些关系?

tcp调用回调函数,将事件添加到就绪队列

epoll中实现回调函数,当回调函数被tcp调用时,pthread_cond_signal唤醒epoll_wait中的条件变量

image-20240310010432071

epoll_wait等待io唤醒过程(以建立tcp建立链接为例)

image-20240310005922431
ll_wait等待io唤醒过程(以建立tcp建立链接为例)

[外链图片转存中…(img-YvWU16DH-1710004476688)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文本生成视频:从 Write-a-video到 Sora

2024年2月15日,OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…

CPU设计实战-协处理器访问指令的实现

目录 一 协处理器的作用与功能 1.计数寄存器和比较寄存器 2.Status寄存器 3.Cause寄存器(标号为13) 4.EPC寄存器(标号为14) 5.PRId寄存器(标号为15) 6.Config 寄存器(标号为16)-配置寄存器 二 协处理器的实现 三 协处理器访问指令说明 四 具体实现 1.译码阶段 2.执行…

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste(github仓库地址) cd 仓库路径(进入到仓库内部准备提交文件等操作) 2. 查看main分支 git branch(列出本地仓库中的所有分支) 3. 创建新分支(可省…

Edu18 -- Divide by Three --- 题解

目录 Divide by Three: 题目大意: ​编辑​编辑思路解析: 代码实现: Divide by Three: 题目大意: 思路解析: 一个数字是3的倍数,那么他的数位之和也是3的倍数,所以我…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE(AiThinker_IDE)编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK,将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

WiFi模块助力少儿编程:创新学习与实践体验

随着科技的飞速发展,少儿编程已经成为培养孩子们创造力和问题解决能力的重要途径之一。在这个过程中,WiFi模块的应用为少儿编程领域注入了新的活力,使得学习编程不再是单一的代码教学,而是一个充满创新与实践的综合性体验。 物联网…

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因: 在高并发场景下,传统关系型数据库的并发能力相对比较薄弱(QPS不能太大); 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…

开发指南002-前后端信息交互规范-概述

前后端之间采用restful接口,服务和服务之间使用feign。信息交互遵循如下平台规范: 前端: 建立api目录,按照业务区分建立不同的.js文件,封装对后台的调用操作。其中qlm*.js为平台预制的接口文件,以qlm_user.…

【红外与可见光融合:条件学习:实例归一化(IN)】

Infrared and visible image fusion based on a two-stage class conditioned auto-encoder network (基于两级类条件自编码器网络的红外与可见光图像融合) 现有的基于自动编码器的红外和可见光图像融合方法通常利用共享编码器从不同模态中提取特征&am…

arduino安装索尼spresense开发库

arduino安装索尼spresense开发库 一.库安装二.库文件下载1.直接下载2.git下载1.git加速下载2.git下载加速3.将文件导入arduino 一.库安装 打开arduino点击文件->首选项 将以下链接添加进附加开发板管理器网址 https://github.com/sonydevworld/spresense-arduino-compatib…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机,以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据,例如温度、压力、流量等,然后将这些数据汇…

【李沐】动手学习ai思路softmax回归实现

来源:https://www.cnblogs.com/blzm742624643/p/15079086.html 一、从零开始实现 1.1 首先引入Fashion-MNIST数据集 1 import torch 2 from IPython import display 3 from d2l import torch as d2l 4 5 batch_size 256 6 train_iter, test_iter d2l.load_data…

tcp流式服务和粘包问题

目录 1.概念 2.流式服务 3.粘包问题 1.概念 套接字是一个全双工的 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输. TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成…

集合框架(一)List系列集合

特点 有序,可重复,有索引。 LIst集合的特有方法 /** 目标:掌握List系列集合的特点,以及其提供的特有方法* */import java.util.ArrayList; import java.util.List;public class ListTest1 {public static void main(String[] arg…

android开发环境搭建

android开发环境搭建 Android 开发环境搭建1.JDK安装与配置1.1 Jdk官方下载1.2 JDK安装1.3 环境变量配置1.4 新建JAVA_HOME1.5 修改Path变量1.6 新建classpath1.7 验证环境是否配置完成 2.开发工具二选一1.如何创建一个工程2.工程的目录结构的了解3.与开发的相关的常规视图4.我…

记录WiFi转WDS桥接再转网线

第一步: 把LAN口修改为 和 主路由器的前三位段位编码一致,最后一位设置大于250,减少抢IP的可能性。这个步骤是修改 桥接路由器的登录IP 第二部: 设置IP池。网关和dns服务器都是同一个,用手机连接主路由器wifi可以找到 …

【Flink】Flink 的八种分区策略(源码解读)

Flink 的八种分区策略(源码解读) 1.继承关系图1.1 接口:ChannelSelector1.2 抽象类:StreamPartitioner1.3 继承关系图 2.分区策略2.1 GlobalPartitioner2.2 ShufflePartitioner2.3 BroadcastPartitioner2.4 RebalancePartitioner2…

HTML 学习笔记(五)超链接

HYperText 超文是用超链接的方式&#xff0c;将不同空间的文字信息组合在一起的网状文其就像一个桥梁&#xff0c;建立了不同页面中的联系&#xff0c;实现了访问不同网站中页面的功能 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

深度学习+感知机

深度学习感知机 1感知机总结 2多层感知机1XOR2激活函数3多类分类总结 3代码实现 1感知机 是个很简单的模型,是个二分类的问题。 感知机&#xff08;perceptron&#xff09;是Frank Rosenblatt在1957年提出的一种人工神经网络&#xff0c;被视为一种最简单形式的前馈神经网络&…

【C语言】深入理解指针(进阶篇)

一、数组名的理解 数组名就是地址&#xff0c;而且是数组首元素的地址。 任务&#xff1a;运行以下代码&#xff0c;看数组名是否是地址。 #include <stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,0 };printf("&arr[0] %p\n", &arr[0]);pri…