linux 驱动 哪些链表

linux 驱动的链表:1、双向循环链表 list_head;2、哈希链表 hlist;3、无锁链表llist;4、降序优先排序的双向链表 plist。其中,双向循环链表 list_head存在于include/linux/list.h文件中,双向循环链表是将双向链表的头结点和尾结点链接起来的链表。

linux 驱动 哪些链表-Worktile社区

1、双向循环链表 list_head

双向链表指的是构成链表的每个结点中设立两个指针域:一个指向其直接前驱的指针域prev,一个指向其直接后继的指针域next。这样形成的链表中有两个方向不同的链,故称为双向链表。双向循环链表将双向链表的头结点和尾结点链接起来也能构成循环链表,其称为双向循环链表。

相关文件:include/linux/list.h

数据结构:

struct list_head {
	struct list_head *next, *prev;
};

接口:

static inline void INIT_LIST_HEAD(struct list_head *list);
static inline void list_add(struct list_head *new, struct list_head *head);
static inline void list_del(struct list_head *entry);

2、哈希链表 hlist

Linux链表设计者认为双指针表头双循环链表对于HASH表来说过于浪费,因而另行设计了一套用于HASH表的hlist数据结构,即单指针表头双循环链表。hlist表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在海量的HASH表中存储的表头就能减少一半的空间消耗。

相关文件:include/linux/list.h;include/linux/hashtable.h

数据结构:

struct hlist_head {
	struct hlist_node *first;
};
 
struct hlist_node {
	struct hlist_node *next, **pprev;
};

接口:

static inline void hlist_del(struct hlist_node *n);
static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h);
hlist_for_each_entry(pos, head, member)

3、无锁链表llist

无锁链表是一种单向链表。单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点。

相关文件:lib/llist.c

定义:

struct llist_head {
	struct llist_node *first;
};
 
struct llist_node {
	struct llist_node *next;
};

4、降序优先排序的双向链表 plist

plist是由两个双向循环链表形成的具备优先级的双向链表。其中每个节点的plist_node按prio值重小(优先级较高)到大(优先级最小)以node_list排序形成链表,prio值相同的节点按先插入在前的顺序;不同prio值的节点又按小到大的顺序以prio_list排序形成链表。其中prio值相同的节点,仅较早插入链表的节点被链接到prio_list中,其余节点prio_list为空。

相关文件:include/linux/plist.h;lib/plist.c

数据结构:

struct plist_head {
	struct list_head node_list;
};
 
struct plist_node {
	int			prio;
	struct list_head	prio_list;
	struct list_head	node_list;
};

接口:

static inline void plist_head_init(struct plist_head *head);
static inline void plist_node_init(struct plist_node *node, int prio);
void plist_add(struct plist_node *node, struct plist_head *head);
void plist_del(struct plist_node *node, struct plist_head *head);

延伸阅读

linux 组成

  1. 进程管理(process management)
  2. 定时器(timer)
  3. 中断管理(interrupt management)
  4. 内存管理(memory management)
  5. 模块管理(module management)
  6. 虚拟文件系统接口(VFS layer)
  7. 文件系统(file system)
  8. 设备驱动程序(device driver)
  9. 进程间通信(inter-process communication)
  10. 网络管理(network management)
  11. 系统启动(system init)等操作系统功能的实现

文章标题:linux 驱动 哪些链表,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/34109

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Z, ZLW的头像Z, ZLW

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部