Linux 进程优先级
一、侵入式链表管理 task_struct
1、传统链表 vs 侵入式链表
传统链表的逻辑是:让数据结构体'依附'于链表——比如定义一个链表节点,把数据结构体作为节点的'数据域'(链表是主体,数据是附属)。

这种方式的核心问题是:数据与链表指针紧耦合,不同结构体要单独写链表逻辑,代码完全无法通用,冗余且维护成本高。
而侵入式链表正好相反:把通用链表节点'嵌入'到数据结构体内部——数据结构体是主体,链表节点是它的一个'成员'(链表逻辑通过这个嵌入的节点实现)。

侵入式链表的核心是'通用链表节点嵌入数据结构体,数据是主体,同一套链表逻辑可复用管理任意结构体,灵活且无冗余'。
2、通过节点指针 + 偏移量计算,反向获取结构体对象

(task_struct *)(start - (size_t)&((task_struct *)0)->link)->other
**1、(task_struct *)0:**将地址 0 强转为
task_struct*,虚拟结构体基址**2、(size_t)&((task_struct *)0)->link:**计算
link在结构体中的偏移量(强转size_t确保数值运算)**3、start - (size_t)&((task_struct *)0)->link:**节点地址减偏移量,得结构体起始地址
**4、(task_struct *)(...):**将结果强转回
task_struct*,最终访问other成员
3、问题:在进程管理中,为什么通常用链式结构存储 PCB(进程控制块)?
用链式结构存 PCB,其实是内核'怎么方便怎么来'的选择,核心是适配进程的'动态'和内核的'资源紧':
进程是'活的',链式改起来快:进程总在创建、销毁,链式结构增删节点只动指针(一步到位),不像数组得挪一堆元素,效率差太多;
内核内存'碎',链式能凑合用:内核里难搞到大块连续内存,PCB 散着存也没事,链式靠指针串起来就行,不用纠结地址连不连续;
管理要灵活,链式好折腾:进程要切状态(比如从就绪变阻塞)、按优先级排队列,链式结构调个指针就能重组队列,比数组挪元素轻松多了;
内核代码要省事儿,链式能复用:内核里不光管 PCB,还管文件、设备这些,一套链表逻辑就能管所有这些对象,不用给每个东西写套新代码。









