plist
https://elixir.bootlin.com/linux/v4.9.59/source/include/linux/plist.h#L212
*Descending-priority-sorted double-linked list
(*降序优先排序的双向链表)
plist是一个按优先级排序的节点列表; 每个节点的优先级从 INT_MIN(最高)到 INT_MAX(最低)。
插入的时间复杂度为O(k), 删除的时间复杂度为O(1), 变更节点优先级的时间复杂度是O(k)。其中K是系统中RT优先级的数量。(1≤K≤99)
数据结构
//plist 头
struct plist_head {
struct list_head node_list;
};
//plist 节点
struct plist_node {
int prio;
struct list_head prio_list;
struct list_head node_list;
};
plist是由两个双向循环链表形成的具备优先级的双向链表。其中
- 每个节点的plist_node按prio值重小(优先级最高)到大(优先级最小)以node_list排序形成链表,prio值相同的节点按先插入在前的顺序。
- 不同prio值的节点又按小到大的顺序以prio_list排序形成链表。其中prio值相同的节点,仅最早插入链表的节点被链接到prio_list中,其余节点prio_list为空。
这种结构使得插入节点时,通过变量prio_list能快速找到插入位置,不需变量相同prio的节点。同时node_list是以prio小到大排序,相同prio的节点,最早插入的节点在前;按优先级出队时只需要取第一个节点,能实现,高优先级优先出对,同优先级实现FIFO功能。
宏/函数
初始化plist头和节点
静态初始化
创建变量并初始化。
/**p
* PLIST_HEAD_INIT - 静态初始化plist头结构体。
* @head: struct plist_head variable name
*/
#define PLIST_HEAD_INIT(head) \
{
\
.node_list = LIST_HEAD_INIT((head).node_list) \
}
/**
* PLIST_HEAD - 定义并初始化一个plist头。
* @head: name for struct plist_head variable
*/
#define PLIST_HEAD(head) \
struct plist_head head = PLIST_HEAD_INIT(head)
/**
* PLIST_NODE_INIT - 静态初始化plistd节点结构体。
* @node: struct plist_node variable name
* @__prio: initial node priority
*/
#define PLIST_NODE_INIT(node, __prio) \
{
\
.prio = (__prio),