基数树
看这篇文章:https://zhuanlan.zhihu.com/p/643699822
节点的基本结构如下:
上述结构体中:
shift表示位移量,其实也就是和层级正相关的;
slots用于指向下一个节点,如果没有相应的子节点就可以是NULL;
tags表示是否存在,因为你可能某个数的存在而分配了这个slot,但是和它相邻的数并不存在,这个其实和Linux的多级页表比较类似,但是基数树的作用仅仅是存储并查询某个数字是否存在,是一种动态存储的结构:
pid的分配
pid_namespace结构的第一个成员是idr:
idr的定义如下:
其使用的是如下所示的基数树这样的一种结构,idr_rt正是这个树的根:
在pid_namespace中,正是使用基数树来存储并查询某个pid是否已经被分配;
通过pid查找task
查询基数树能返回一个指针:
int pid 到structuct pid
struct pid查找task
关键函数是pid_task:https://elixir.bootlin.com/linux/v6.13.5/source/kernel/pid.c#L409