Linux中的Plist -- 降序优先排序的双向链表

Plist是一种按优先级排序的双向链表,用于高效地插入、删除和管理节点。它由两个双向循环链表构成,分别按优先级和插入顺序排序。插入和删除操作具有不同的时间复杂度,插入节点时根据优先级找到合适位置,删除节点则考虑了优先级相等时的处理。Plist的初始化、插入和删除涉及多种情况,确保了高优先级节点的优先处理和FIFO功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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是由两个双向循环链表形成的具备优先级的双向链表。其中

  1. 每个节点的plist_node按prio值重小(优先级最高)到大(优先级最小)以node_list排序形成链表,prio值相同的节点按先插入在前的顺序。
  2. 不同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),				
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值