1.什么是内核链表,他和普通链表的区别是啥。

普通链表是这样的

节点 = 数据 + 前后指针

struct Node

{

    int data;                                                                                         

    struct Node* next , *prev;

};


而内核链表是单独定义一个链表头结构体list_head,只存前后指针,不存任何数据

struct list_head

{

    struct  list_head *next , *prev;

}

而只要我们的结构体里嵌入这个list_head,我们就可以挂上链表。

2.为什么要这样设计?

1.这一套链表代码,所有结构体通用,不用再每一个结构体都要重写增删查改,只写一套基于list_head的操作宏,不管外层是什么结构体,直接复用。

2.一个对象可以嵌入多个list_head,为什么要嵌入多个list_head,这样一个结构体可以并入多个链表,一个进程就可以同时在全局进程链表,进程组链表,等待链表互不干扰。

3.不用判空,全程不存在NULL指针,所有 next/prev 一定指向合法 list_head地址。

3.拿到list_head指针后,我们只要算出偏移值,就能取到结构体首地址,进而就能取到别的数据。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐