Linux6.1中为什么用Radix树替换位图(bitmap)来管理进程pid

在过去的几十年中,Linux内核为了有效地管理进程,采用了位图(bitmap)数据结构来记录和跟踪进程的PID。我们知道Linux支持的最大进程数量为65535个,那么用位图来表示的话只需要16位bit就够了,这大大节约了内存空间,随着系统规模的扩大和复杂性增加,尤其是云计算、容器等新兴虚拟化技术大爆发的时代中,操作系统经常会在短时间内快速创建或者销毁大量进程,在这种场景下位图的全面查找时性能问题就逐渐暴露出来了。为了解决这些问题,Linux内核逐渐采用radix树(radix-tree)来替代位图,对进程PID进行管理,这个替换的思路就是用空间换时间。

Radix树及在Linux pid中的使用方式简介

radix tree是一种多叉搜索树,树的叶子结点是实际的数据条目。每个结点有一个固定的、2^n指针指向子结点。Radix树的基本概念如下:

1.节点

Radix树由节点组成,每个节点表示一个键值。

2.边

每个节点有零个或多个子节点,这些子节点通过边相连。

3.层级

从根节点到任意一个节点的路径上的节点数量称为该节点的层级。

4.深度

Radix树的深度是指根节点到任意一个节点的最长路径上的节点数量。

5.Radix树在Linux Pid中的具体应用方式

如我们刚刚所说Linux中的进程数量最大就是2^16个。在LinuxPID中使用时Radix树的深度固定为3,其中建模方式就是把16位的数据分为三组,其中第一层、第二层和第三层分别表示PId的前4位,中6位及后6位。

假设在一个操作系统中已经用掉了0-3个进程PID,此时新进程开始申请PID的情况举例,此时现有4个进程的PID分为是0000 000000 000000、0000 000000 000001、0000 000000 000010、0000 000000 000011,那么此时Radix树中只有第一层中只0000节点下有子节点000000,而二层子节点000000下有四个子节点000000、000001、000010、000011,此时申请新的PID只需要在0000的二层节点000000下再增加一个叶节点000100即可。

6.Radix树和前缀树的比较

从上面的情况我们可以看到前缀树只支持前缀查询的树形结构,查询时只能找到以该前缀开头的所有字符串。而Radix树则类似于嵌套编码的前缀树,支持全前缀查询的树形结构,查询时可以找到以该前缀开头的所有字符串,并可进一步缩小查询范围。

Radix树相比于BITMAP在PID管理中的优势

1. 海量进程申请时的性能更佳

位图在处理大量PID时,其效率会显著下降。因为位图的每一位只能表示一个PID,所以当系统中有大量进程时,位图会变得非常大,导致内存和CPU资源的大量消耗。而radix树是一种自平衡的树形数据结构,能够高效地管理大量进程PID,无论系统规模大小,都能保持较低的复杂性和良好的性能。

2.PID查询搜索时性能更强

在位图中搜索特定的PID时,需要按位逐一检查,因此搜索时间会随着位图的增大而增加。而radix树具有优秀的搜索性能,通过将PID按照一定的前缀排序并存储在树中,可以快速定位到指定的PID,减少了搜索时间。

3.未来扩展时更具灵活性

目前LINUX的进程数量限定在65535以内,但一旦未来林纳斯同志要打破这一限定,那么位图就要处理变长的PID了,这时需要调整位图的长度,较为繁琐。而radix树可以灵活地管理不同长度的PID,只需要调整树的结构和节点即可。此外,radix树还支持按需扩展和收缩节点,以适应系统负载的变化。

4.并发性更强

在现代多核处理器系统中,对进程PID的管理需要支持并发访问和修改。位图在并发环境中可能会出现竞争条件和死锁等问题。而radix树通过采用锁或其他并发控制机制,能够支持多线程并发访问和修改,提高了系统的并发性能。

综上所述,radix树在管理进程PID方面具有优秀的扩展性、效率、搜索性能、因此,现代Linux内核逐渐采用radix树来替换位图,以更好地满足实际应用场景中对进程PID管理的需求。

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

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

相关文章

探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【Java】接口 interface

目录 概述 示例代码: 接口成员访问特点 示例代码: 概述 什么是接口 接口就是一种公共的规范标准,只要符合规范标准,大家都可以调用。 Java 中的接口更多的体现在对行为的抽象! 1. 接口 用关键字 interface 修饰 pub…

【Windows】安装Microsoft Store,Microsoft Store离线包

用了大半年的Windows,今天发现没有Microsoft store 安装方法有2: 方法一、到这里找相关程序 https://store.rg-adguard.net/ …… 方法二、用下边的离线包 二选一下载: 离线包下载:https://wwon.lanzout.com/i4xPL1atnotc离…

spfa算法_C++详解

spfa定义 SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的,它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,其中k为所有顶点进队的平均次数,可以证明k一般小于等于2,可以处理负边,但无法处理带负环的图(负环和…

RPA是什么?AI和RPA可以结合吗?

随着科技的快速发展,机器人流程自动化(RPA)逐渐成为企业提高效率、降低成本、优化流程的重要工具。本文将从RPA的概念、特点以及AI和RPA的结合等方面进行阐述,探讨其对企业和社会的意义。 一、RPA的概念和特点 机器人流程自动化…

从零手搓一个【消息队列】创建核心类, 数据库设计与实现

文章目录 一、创建核心类1, 交换机2, 交换机类型3, 队列4, 绑定5, 交换机转发 & 绑定规则6, 消息7, 消息属性 二、数据库设计1, 使用 SQLite2, 使用 MyBatis2.1, 创建 Interface2.2, 创建 xml 文件 三、硬盘管理 -- 数据库1, 创建 DataBaseManager 类2, init() 初始化数据库…

算法题系列10·最长公共前缀

目录 题目描述 思路 实现 题目描述 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1: 输入:strs ["flower","flow","flight"] 输出:&qu…

C++【4】指针与引用;数组指针;指针数组

/* 指针变量作为函数参数 函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。 指针变量作为函数参数与变量本身作为函数参数不同,变量作函数参数传递的是具体值。 而指针作为函数参数传递的是内存的…

LabVIEW开发教学实验室自动化INL和DNL测试系统

LabVIEW开发教学实验室自动化INL和DNL测试系统 如今,几乎所有的测量仪器都是基于微处理器的设备。模拟输入量在进行数字处理之前被转换为数字量。对于参加电气和电子测量课程的学生来说,了解ADC以及如何欣赏其性能至关重要。ADC的不确定性可以根据其传输…

蓝桥杯每日一题2023.10.5

3420. 括号序列 - AcWing题库 题目描述 题目分析 对于这一我们需要有前缀知识完全背包 完全背包的朴素写法&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1010; int n, m, v[N], w[N], f[N][N]; int main() {cin >> n >> m;fo…

PyTorch实例:简单线性回归的训练和反向传播解析

文章目录 &#x1f966;引言&#x1f966;什么是反向传播&#xff1f;&#x1f966;反向传播的实现&#xff08;代码&#xff09;&#x1f966;反向传播在深度学习中的应用&#x1f966;链式求导法则&#x1f966;总结 &#x1f966;引言 在神经网络中&#xff0c;反向传播算法…

利用python来打印九九乘法表

一. 打印九九乘法表 法一 # 定义起始行 row 1# 最大打印 9 行 while row < 9:# 定义起始列col 1# 最大打印 row 列while col < row:# end ""&#xff0c;表示输出结束后&#xff0c;不换行# "\t" 可以在控制台输出一个制表符&#xff0c;协助在输…

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…

JavaScript操作CSS样式

上节课我们基本完成了游戏的主体&#xff0c;这节课我们来学习如果使用JavaScript去操作CSS样式 ● 例如&#xff0c;我们现在想当玩家输入对的数字之后&#xff0c;我们讲背景改为绿色&#xff0c;并且把number的框宽度变大 const secretnumber Math.trunc(Math.random() * …

经典算法-----汉诺塔问题

前言 今天我们学习一个老经典的问题-----汉诺塔问题&#xff0c;可能在学习编程之前我们就听说过这个问题&#xff0c;那这里我们如何去通过编程的方式去解决这么一个问题呢&#xff1f;下面接着看。 汉诺塔问题 问题描述 这里是引用汉诺塔问题源自印度一个古老的传说&#x…

目前制造企业生产计划现状是什么?有没有自动化排产系统?

大家都知道&#xff0c;人的指挥中心是大脑&#xff0c;大脑对我们的发出各种各样的指令&#xff0c;告诉我们&#xff1a;“手”做什么事情&#xff0c;“眼睛”看什么地方&#xff0c;“耳朵”听什么声音&#xff0c;然后再将摸到的、看到的、听到的信息传递给大脑&#xff0…

制作 3 档可调灯程序编写

PWM 0~255 可以将数据映射到0 75 150 225 尽可能均匀电压间隔

2023-09-27 Cmake 编译 OpenCV+Contrib 源码通用设置

Cmake 编译 OpenCV 通用设置 特点&#xff1a; 包括 Contrib 模块关闭了 Example、Test、OpenCV_AppLinux、Windows 均只生成 OpenCV_World 需要注意&#xff1a; 每次把 Cmake 缓存清空&#xff0c;否则&#xff0c;Install 路径可能被设置为默认路径Windows 需要注意编译…

安装PostgreSQL

PostgreSQL安装指南&#xff1a;从下载到配置 PostgreSQL是一款强大的开源关系型数据库管理系统&#xff0c;广泛用于企业和开发者的应用程序。在这篇博客中&#xff0c;我们将向您介绍如何安装和配置PostgreSQL&#xff0c;以便您可以开始使用这个强大的数据库。 步骤1&#…