• LKD: Chapter 6 Kernel Data Structures


      这一章我们研究四种主要的数据结构: linked lists, queues, maps, binary trees.

    Linked Lists:(<linux/list.h>)

      在linux中,并不是直接将某个结构体作为链表的节点,而是在该结构中插入一个链表的节点。借助container_of()这个宏,我们可以轻松的找到包含给定成员变量的父结构。

      Linux kernel中一般使用的是循环双链表。

      正常遍历使用的是list_for_each()宏,但是当遍历过程中删除某个表项时就有可能出错。解决办法是使用

    list_for_each_entry_safe(pos, next, head, member)

      与原来的不同在于需要多提供一个next指针,这样就可以在遍历的过程中安全移除当前表项了。

      当我们能提供next和prev指针时,我们就直接使用内部函数而不是包装函数。比如删除某个节点,用__list_del(prev, next)而不是list_del(list),可以节约资源。

    Queues:

      内核中的队列也称作kfifo,在<linux/kfifo.h>中声明,在kernel/kfifo.c中实现。因为先进先出的特性,所以常用于生产与消费的模型中。初始化中的size须是2的n次方。

    Maps:

      Maps至少要能满足三种操作:

      Add(key, value)

      Remove(key)

      value=Lookup (key)

      Hash table是常见的map,但并不是所有maps都是hash table。

      在linux内核中,map也被称作idr。其中UID可以理解为key。

    Binary Trees:

      某个节点的深度是指从根节点到该节点中有多少个父节点。而balanced binary tree就是指所有叶子节点的深度相差不超过1的二叉树。

      在linux kernel中,主要使用的是red-black树,它有6个属性:

    1、所有节点非黑即红;

    2、叶子节点全为黑;

    3、叶子节点不含数据;

    4、所有非叶子节点都有两个孩子节点;

    5、如果某节点是红色的,则它的两个孩子都是黑色的;

    6、从一个节点开始到它的某个叶子节点的路径上含有的黑节点数目与到它其他的叶子节点的数目相同。

      rbtree的查找和插入需要自己实现。

    What Data Structure to Use, When:

      linked list: iterating over all your data;

      queue: producer/consumer pattern;

      map: map a UID to an object;

      red-black tree: store a large amount of data and look it up efficiently.

  • 相关阅读:
    Linux内存管理 -- /proc/{pid}/smaps讲解
    link hub(other)
    牛客项目平台管家 | xie_note 学习笔记整理📚 项目来源:https://github.com/Making-It/note ,已获得授权转载
    【Linux】C++后台开发面试
    C++ 后台开发面试时一般考察什么?
    Linux C/C++ 学习路线(已拿腾讯、百度 offer)2
    C++路线图
    【转】C++后台开发校招面试常见问题
    【转】Linux C/C++ 学习路线(已拿腾讯、百度 offer)
    学习经验总结|C++后台开发/云计算方向,offer收割机的学习路线
  • 原文地址:https://www.cnblogs.com/justforfun12/p/5062233.html
Copyright © 2020-2023  润新知