但凡阅读过Linux内核代码的工程师都有一个概念,Linux内核遍布着各种各样的链表结构。Tasklets、Workqueue、Hash、目录树等地方都用到数据链表。可以认为是Linux内核最重要的数据结构之一,Linux内部就是由。本文顺序介绍Linux链表结构,以及Tasklets、WorkQueue等。
一、链表类型: 链表类型包括单链表、双链表和循环链表。
1、单链表:
图 1
如上图所示,单链表指的是一个链表指针头指向一个数据结构的指针区,最后一个指针 == NULL。链表头的数据结构类型和指针区的结构一样,具体的说明见下面的
Linux链表结构。
2、双链表:
图 2
如上图所示,双链表指针的每个指针区的Next都是指向下一个结构的指针区,而下一个的pre指针都是指向上一个指针。在双链表指针最后一个指针Next等于NULL
3、循环链表:
循环链表如图2所示,把其中虚线部分加入其中的时候就是一个循环的双向链表。循环链表指的是链表的头和结尾都进行相连。
二、Linux链表
Linux内核数据结构中采用的大多数都是双向循环链表。内核中提供和许多链表操纵和单个数据结构的操作函数,下面就分别介绍一下Linux链表操作和单个数据结构的
操作。
1、链表指针所在数据结构及其操作函数:
Linux数据结构中的链表建立是通过在每个数据结构中插入一个list_head指针结构,list_head如下所示:
struct list_head
{
struct list_head *pre; // 指向前级的指针
struct list_head *next; // 指向后级的指针
};
带上数据区的数据结构是在数据当中插入这样的指针结构,比如有一个数据区为my_data,其结构如下:
struct my_data
{
int data1;
......
struct list_head list;
.......
};
像my_data