Linux内核设计基础(八)之内核数据结构
我个人比较喜欢学习数据结构,而Linux内核中实现的数据结构会是我们去学习、理解和应用数据结构的一个很好途径。这里介绍内核中广泛应用的四种数据结构:链表、队列、映射和二叉树。
链表:
Linux内核讲求高效精简,所以有时需要我们动态去创建和分配内存,这时就要借助链表,我们根据实际情况分配内存后,只需修改链表的指针,仍能索引到刚分配的内存区。链表分单向链表、双向链表和循环链表。
- 单向链表
struct list_element { void *data; struct list_element *next; /* 指向下一个元素的指针 */ };
- 双向链表
struct list_element { void *data; struct list_element *next; /* 指向下一个元素的指针 */ struct list_element *prev; /* 指向前一个元素的指针 */ };
- 循环链表
struct list_head { struct list_head *next; struct list_head *prev; };
struct fox { unsigned long tail_length; unsigned long weight; bool is_fantastic; struct list_head list; /* 所有fox结构体形成链表 */ };
也就是list不再是指向一个fox结构体,而是用.next和.prev指向前后两个list_head结构体。真奇怪,这样的话我们需要知道所指向的两个list_head结构体分别属于哪两个fox结构体,这需要借助宏container_of(),这样我们可以找到这个list_head结构体的父结构(也就是所属的fox结构体)中包含的任何变量。为什么要这样构造链表,希望懂的朋友们留下评论:)
int idr_get_new(struct idr *idp, void *ptr, int *id);
将id(键)和ptr(值)的映射注入到idr中。而查找操作如下:
void *idr_find(struct idr *idp, int id);
根据id找到对应的指针ptr。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。