简述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)]

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT等AI使用的过程苦笑不得瞬间

引言: 在人工智能的浪潮中,我们见证了技术的飞速发展和智能应用的广泛渗透。特别是随着语言模型的进步,AI如ChatGPT、文心一言、通义千问、讯飞星火等已经成为人们日常生活和工作中不可或缺的助手。然而,与任何新兴技术一样&#…

零售EDI:劳氏 Lowe‘s EDI项目案例

通过 EDI,企业与Lowes之间可以直接交换各种商业文档,如订单、发票、收据等,从而实现信息的实时交换,提高了供应链的效率和准确性。在现代供应链管理中,EDI 已经成为了不可或缺的重要工具。 作为一家拥有多条业务线的企…

力扣每日一题 找出数组的第 K 大和 小根堆 逆向思维(TODO:二分+暴搜)

Problem: 2386. 找出数组的第 K 大和 文章目录 思路复杂度💖 小根堆💖 TODO:二分 暴搜 思路 👨‍🏫 灵神题解 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂…

组态软件基础知识

一、组态软件基础知识 1、概述 (1)、组态软件概念与产生背景 “组态”的概念是伴随着集散型控制系统(Distributed Control System简称DCS)的出现才开始被广大的生产过程自动化技术人员所熟知的。在工业控制技术的不断发…

新手如何快速上手学习单片机?

读者朋友能容我,不使博文负真心 新开专栏,期待与诸君共享精彩 个人主页:17_Kevin-CSDN博客 专栏:《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器,广泛应用于各种电子设备和嵌入式系统中。在这…

大模型快速实现python3+html内容在线渲染

需求: 有一份数据需要通过前端在线展示给用户,不需要复杂的样式交互,后端服务是基于Python3实现的API接口,对前端技术不是很了解,需要快速实现该需求。类似样式即可: 思路: 如果页面不复杂&am…

开放式高实时高性能PLC控制器解决方案-基于米尔电子STM32MP135

前言 随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,…

编译支持国密的抓包工具 WireShark

目录 前言WireShark支持国密的 WireShark小结前言 在上一篇文章支持国密的 Web 服务器中,我们搭建了支持国密的 Web 服务器,但是,我们使用 360 安全浏览器去访问,却出现了错误: 是我们的 Web 服务器没有配置好?在这里插入图片描述还是 360 安全浏览器不支持国密?还是两…

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法,需要注意分布式锁的redis需要单点 分布式事务 分布式事务中,核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC,比如 seata 的 AT 模式下,将 un…

moi3D安装

下载文件双击文件 下一步 同意下一步 下一步 下一步 下一步 安装下一步 完成 破解 将如图中的文件复制到文件目录下 汉化 在目录中进入ui文件夹下 在安装包中找到如下的文件复制到ui目录下 在打开 另存为 另存为时改一下编码格式如图 打开软件 找到如图options进入…

七彩虹八渐变 外贸建站公司wordpress模板

进出口水果wordpress外贸模板 漂亮水果wordpress外贸模板,做水果进出品生意的外贸公司自建站官网模板。 https://www.jianzhanpress.com/?p3516 玩具wordpress外贸模板 简洁玩具wordpress外贸模板,适合做跨境电商外贸公司使用的wordpres外贸s网站主题…

深入探索HAProxy:高性能负载均衡器的奥秘

目录 引言 一、HAProxy基础知识 (一)HAProxy概述 (二)核心特性 (三)支持调度算法 二、安装haproxy (一)下载源码包 (二)解决依赖环境 (三…

CAP告诉你系统没法做到完美,只能做到权衡和适当

一、CAP介绍 CAP原理,全称为Consistency(一致性)、Availability(可用性)和Partition tolerance(分区容错性),是分布式系统设计中的基本原理。它强调了在设计分布式系统时&#xff0c…

【Linux】第四十二站:线程局部存储与线程分离

一、线程的局部存储 1.实现多线程 如果我们想创建多线程&#xff0c;我们可以用下面的代码类似去实现 #include <iostream> #include <pthread.h> #include <string> #include <cstdlib> #include <unistd.h> #include <thread> #inclu…

【机器学习】进阶学习:详细解析Sklearn中的MinMaxScaler---原理、应用、源码与注意事项

【机器学习】进阶学习&#xff1a;详细解析Sklearn中的MinMaxScaler—原理、应用、源码与注意事项 这篇文章的质量分达到了97分&#xff0c;虽然满分是100分&#xff0c;但已经相当接近完美了。请您耐心阅读&#xff0c;我相信您一定能从中获得不少宝贵的收获和启发~ &#x1f…

PromptBreeder---针对特定领域演化和发展提示词的方法

原文地址&#xff1a;promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址&#xff1a;https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示&#xff0c;包含离散的输入令牌&#xff1b;其缺点…

如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

目录 一、面试官心理分析 二、面试题剖析 1.Redis 主从架构 2.Redis replication 的核心机制 3.Redis 主从复制的核心原理 4.主从复制的断点续传 5.无磁盘化复制 6.过期 key 处理 7.复制的完整流程 8.全量复制 9.增量复制 10.heartbeat 11.异步复制 12.Redis 如何…

鸿蒙OS应用开发之显示图片组件11

前面学习了像素降级处理的方法,这样方便一个图片可以显示在不同大小屏幕的技术,同样不会失真。现在来学习另外一个重要的技术,就是图片处理。图片处理是一个很范的名词,一般来说图片处理都会采用预处理的方法,比如在电脑上采用图形处理软件进行处理,然后再使用到手机的软…

校园小情书微信小程序,社区小程序前后端开源,校园表白墙交友小程序

功能 表白墙卖舍友步数旅行步数排行榜情侣脸漫画脸个人主页私信站内消息今日话题评论点赞收藏 效果图

JS实现chatgpt数据流式回复效果

最近高了一个简单chatgpt对话功功能&#xff0c;回复时希望流式回复&#xff0c;而不是直接显示结果&#xff0c;其实很简单&#xff0c;前端流式读取即可&#xff0c;后端SSE实现流式传输 前端用到fetch获取数据&#xff0c;然后利用reader读取 let requestId parseInt(Ma…