热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux内核链表

最近在看Linux内核的代码,第一个想了解的是Linux内部所使用的数据结构:链表。事实上Linux内核使用的链表是双向循环链表.跟普通的链表一样,它的每个节点包含两个域:数据域和

最近在看Linux内核的代码,第一个想了解的是Linux内部所使用的数据结构:链表。

事实上Linux 内核使用的链表是双向循环链表.跟普通的链表一样,它的每个节点包含两个域:数据域和指针域,其中数据域很明确,就是用户自己的数据,没啥好说的,具体得看用户想通过链表组织什么数据。指针域是一个结构体如下:

技术分享技术分享
struct list_head
{
      struct list_head   *next, *prev;
}
View Code

从上面可以看出,这个链表是一个双向的链表,因为它的指针域包含了两个指针,一个指向前一个节点的指针域,另一个指向后一个节点的指针域。这就跟普通的链表有了很大的区别了,一般普通的链表的指针域是直接指向了另一个节点的数据域,当我们通过指针域得到到节点的地址后就可以直接获得数据。但是问题就是一旦一个链表的节点被创建以后,它的数据域就固定了,这样当下一个用户也想使用这个链表的时候就必须重新定义节点数据域,这样就使得链表的通用性下降了。Linux内核的链表为了让链表更加通用,就采用了如下的方式定义链表:让节点的指针域指向另一个节点的指针域,数据域可以让用户自行定义。如下面的定义:

技术分享技术分享
struct student
{
    char name[10];
    int english;
    int math;
    int chinese;
    struct list_head list;
};
View Code

在上面的定义中,数据域是学生的数据,指针域是一个结构体,它们分别指向下一个和上一个节点的指针域。在这里,数据域可以由用户自行定义,只需要将指针域加入即可。
但是这样一来如果用户要使用链表来获得节点的数据就没有普通用户那么方便了。因为指针域指向的并非是另一个节点的数据域。不过不用担心,内核提供了函数让我们能通过指针域获得数据。下面介绍内核提供的常用的操作链表的函数:

  INIT_LIST_HEAD():创建链表;

  void list_add();在链表头插入一个节点

  list_add_tail();在链表尾插入一个节点

  list_add_tail();删除节点

  list_entry();取出节点

  list_for_each();遍历链表

上面只是给出了操作函数的名称,并不是具体的函数头。可以在内核代码中查找到具体的函数定义和实现。这些函数都定义在include/linux/list.h 中

Linux 内核链表


推荐阅读
  • 简单动态字符串redis里面很多地方都用到了字符串,我们知道redis是一个键值对存储的非关系型数据库,那么所有的key都是用字符串存储的,还有字符串类型,这些都是用字符串存储的 ... [详细]
  • 论文阅读及复现 | Improved Semantic Representations From TreeStructured Long ShortTerm Memory Networks
    两种形式的LSTM变体Child-SumTree-LSTMsN-aryTree-LSTMshttps:paperswithcode.compaperimproved-semanti ... [详细]
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • Linux     系统安装
    Linux系统安装linux系统安装准备工作电脑、u盘、光盘、网络、硬盘主要使用光盘、网络虚拟化软件vmwarevi ... [详细]
  • 安全3AAuthentication:认证Authorzation:授权Accouting|Audition:审计用户管理用户:UID:0,不一定是root,root的uid非0时 ... [详细]
  • Illustrator绘制逼真的愤怒的小鸟实例教程
    Illustrator教程: ... [详细]
  • 抓取百万知乎用户设计之实体设计
    一.实体的关系实体是根据返回的Json数据来设计的教育经历方面用户可以有很多教育经理,USER和education是一对多的关系,一个education对应一个education一 ... [详细]
  • iOS之富文本
    之前做项目时遇到一个问题:使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ... [详细]
  • Xib九宫格应用管理使用xib封装一个自定义view的步骤1新建一个继承UIView的自定义view,假设类名叫做(AppView)2新建一个AppView.xib文件来描述 ... [详细]
  • kepserver中文手册,kepserver使用教程,kepserver设置
    下面介绍一下KepServer模拟器的使用,以下示例使用服务器随附的Simulator驱动程序来演示创建、配置和运行项目的过程。Simulator驱动程序是基于内存的驱动程序,能为 ... [详细]
  • 看这里,教你如何快速将pdf文件翻译成中文
    因为网上下载的PDF资料,往往掺杂着一些英文,所以中英文翻译是一件很平常的事,毕竟不是每个人的英文都那么好,轻轻松松的就能够看完一篇英文的文件,那么,我们就要寻找翻译工具来帮助我们 ... [详细]
  • ASP.NET Core WebAPI 开发新建WebAPI项目  转
    转 http:www.cnblogs.comlinezerop5497472.htmlASP.NETCoreWebAPI开发-新建WebAPI项目ASP.NETCoreWebAPI ... [详细]
  • 步骤一:明确主打的核心目标用户群(对应产品侧的定位)这个核心目标用户群体是该产品成功挤进市场的切入点,甚至是撬动市场的支点和撬杠。市面上几乎很少有产品是专门给一个群体用而对其他群体 ... [详细]
  • npmimportuse这里我记录一下,视频地址和封面地址均引用的是服务器端得,本地的视频和图片 ... [详细]
  • UDP协议开发
    UDP是用户数据报协议(UserDatagramProtocol,UDP)的简称,其主要作用是将网络数据流量压缩成数据报形式,提供面向事务的简单信息传送服务。与TCP协议不同,UD ... [详细]
author-avatar
阿贵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有