Linux内核数据结构

时间:2022-12-22 10:32:13

一、概述

        Linux内核提供了一些常用的数据结构并建议开发者尽量重用,而不需要再去实现一些类似的数据结构。这篇博客主要描述一下Linux内核提供的链表、队列、映射及二叉树这四种常用数据结构。当然这里提到的每一种数据结构要说清楚都需要不少的篇幅,而这篇博文只是简要分析一下Linux内核设计的理念,以便在选用时能做到心中有数。


二、链表

        链表是最常用的一种数据结构,用来组织一系列的数据。链表不同于静态数组,它的长度可变,且通过指针来指向前或后的节点元素,所以每个节点之间内存可能都不连续,这也使得它的插入和删除操作变得极为简单。

        Linux内核定义了自己的链表数据结构,不同于其它一些系统将链表的前后指针植入某个结构体,Linux将一个链表的结构体(list_head)植入需要构成链表的节点结构体中。如下形式:

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

struct myNode{
void * data;
struct list_head list; /* 所以myNode节点构成链表 */
};
        Linux通过container_of()宏来获取list_head链表嵌入的inode指针,从而实现对inode元素的链表组织。

        LInux提供了一些列操作链表的函数定义在<linux/list.h>头文件里面,包括添加、删除、遍历等常规操作。

        LInux这种链表组织形式提供了一些统一的操作方法,避免了内核编程时链表的多样化设计带来的困惑,使得开发工程师可以更多的专注于其它设计,并减少了大量的编码工作,这种设计理念很值得学习。其实这种设计在生活中也存在活生生的例子,比如挂钩式窗帘做好滑轨和环扣以后,可以随意挂上不同的窗帘,当需要更换窗帘时就不再需要拆掉滑轨等重新制作,而只要更换窗帘布即可。


三、队列

        任何操作系统都少不了一种模型,那就是生产者——消费者模型,队列就是实现这种模型的基础数据结构,它是一种FIFO的模型,用来完美解决生产消费的关系。Linux内核通用队列实现叫做kfifo,它定义在/kernel/kfifo.c中,其声明在文件<linux/kfifo.h>中。

        Linux的队列同其他系统定义的队列差不多,提供了一列的函数供开发者调用,包括初始化、推入数据、取出数据、peek数据、销毁队列以及查询队列状态等函数。具体见kfifo.c源码文件。


四、映射

        映射通常也叫做关联数组,其实就是一组唯一键组成的集合,每个键对应必然关联某个特定的值,映射必须提供下面三个操作函数:add(key, value); remove(key); value = lookup(key);