linux 内核list head,Linux内核之list_head.pdf
Linux内核之list_head.pdf
一、 链表数据结构简介
/bbs/thread-995286-1-3.html
链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,
是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道
数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开
销主要是访问的顺序性和组织链的空间损失。
通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立
与下一个节点的联系。按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表 、
双链表、循环链表等多种类型,下面分别给出这几类常见链表类型的示意图:
1. 单链表
图1 单链表
单链表是最简单的一类链表,它的特点是仅有一个指针域指向后继节点(next),因此,对单链
表的遍历只能从头至尾(通常是NULL空指针)顺序进行。
2. 双链表
图2 双链表
通过设计前驱和后继两个指针域,双链表可以从两个方向遍历,这是它区别于单链表的地方。如
果打乱前驱、后继的依赖关系,就可以构成"二叉树";如果再让首节点的前驱指向链表尾节点、
尾节点的后继指向首节点(如图2中虚线部分),就构成了循环链表;如果设计更多的指针域,
就可以构成各种复杂的树状数据结构。
3. 循环链表
循环链表的特点是尾节点的后继指向首节点。前面已经给出了双循环链表的示意图,它的特点是
从任意一个节点出发,沿两个方向的任何一个,都能找到链表中的任意一个数据。如果去掉前驱
指针,就是单循环链表。
在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据
组织。这些链表大多采用在[include/linux/list.h]实现的一个相当精彩的链表数据结构。本文
的后继部分就将通过示例详细介绍这一数据结构的组织和使用。
二、 Linux 2.6内核链表数据结构的实现
尽管这里使用2.6内核作为讲解的基础,但实际上2.4内核中的链表结构和2.6并没有什么区别。
不同之处在于2.6扩充了两种链表数据结构:链表的读拷贝更新(rcu)和HASH链表(hlist)。
这两种扩展都是基于最基本的list结构,因此,本文主要介绍基本链表结构,然后再简要介绍一
下rcu和hlist。
链表数据结构的定义很简单(节选自[include/linux/list.h],以下所有代码,除非加以说明,
其余均取自该文件):
struct list_head {
struct list_head *next, *prev;
};
list_head结构包含两个指向list_head结构的指针prev和next,由此可见,内核的链表具
备双链表功能,实际上,通常它都组织成双循环链表。
和第一节介绍的双链表结构模型不同,这里的list_head没有数据域。在Linux内核链表中,
不是在链表结构中包含数据,而是在数据结构中包含链表节点。
在数据结构课本中,链表的经典定义方式通常是这样的(以单链表为例):
struct list_node {
struct list_node *next;
ElemType data;
};
因为ElemType的缘故,对每一种数据项类型都需要定义各自的链表结构。有经验的C++程序
员应该知道,标准模板库中的采用的是C++ Template,利用模板抽象出和数据项类型
无关的链表操作接口。
在Linux内核链表中,需要用链表组织起来的数据通常会包含一个 struct list_head成员,例
如在[include/linux/netfilter.h]中定义了一个nf_sockopt_ops结构来描述Netfilter为某一
协议族准备的getsockopt/setsockopt接口,其中就有一个(struct list_head list)成员,
各个协议族的nf_sockopt_ops结构都通过这个list成员组织在一个链表中,表头是定义在
[net/core/netfilter.c]中的nf_sockopts(struct list_head)。从下图中我们可以看到,这种
通用的链表结构避免了为每个数据项类型定义自己的链表的麻烦。Linux的简捷实用、不求完美
和标准的风格,在这里体现得相当充分。
图3 nf_socko
linux 内核list head,Linux内核之list_head.pdf相关推荐
- linux下poll和epoll内核源代码剖析
作者:董昊 博客链接http://donghao.org/uii/ poll和epoll的使用应该不用再多说了.当fd很多时,使用epoll比poll效率更高. 我们通过内核源码分析来看看到底是为什么 ...
- linux内核链表以及list_entry--linux内核数据结构(一)
传统的链表实现 之前我们前面提到的链表都是在我们原数据结构的基础上增加指针域next(或者prev),从而使各个节点能否链接在一起, 比如如下的结构信息 typedef struct fox { un ...
- linux内核网络协议栈--linux bridge(十九)
1 . 前言 本文是参考附录上的资料整理而成,以帮助读者更好的理解kernel中brdige 模块代码. 2. 网桥的原理 2.1 桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口" ...
- linux kernel 进程管理,Linux内核 | 进程管理
1. 进程和线程 1.1 定义 进程是处于运行状态的程序和相关资源的总称,是资源分配的最小单位. 线程是进程的内部的一个执行序列,是CPU调度的最小单位.有一段可执行程序代码. 有一段进程专用的系统堆 ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单. 2. 高 ...
- linux进程家族树,Linux内核 | 进程管理
作者:世至其美 博客地址:hqber.com 转载须注明以上信息, 更多文章,请访问个人博客:hqber.com 1. 进程和线程 1.1 定义 进程是处于运行状态的程序和相关资源的总称,是资源分配的 ...
- Linux信号量(3)-内核信号量
概念 Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干. 如果有一个任务想要获 ...
- Linux内核设计与实现——内核数据结构
主要内容 链表 队列 映射 二叉树 1. 链表 单向链表.双向链表 环形链表 linux内核中的链表使用方法和一般数据结构中定义的链表是有所不同的. 传统链表: 传统双向链表.png 传统的链表有个最 ...
最新文章
- memcache---mongodb---redis比较
- tomcat的work目录作用
- Python函数16道入门练习题
- java重定向设置header_java – 重定向时将标题添加到Zuul
- Java中的HashMap和HashTable到底哪不同?(原文参考来自码农网)
- 递归算法(一)递归概念与思路
- 上云七步走,助力垂直电商降本增效
- 【原创】OllyDBG 入门系列(五)-消息断点及 RUN 跟踪
- 【Vue2.0】— 全局事件总线GlobalEventBus(十九)
- Delphi中一些DLL的运用。
- opengl 关于glGenBuffers函数没有定义
- C++ GUI Qt4 自学笔记
- 最近给公司写的it规范,有经验的朋友给点意见
- 新中新电子f200a驱动安装_【电子税务局】出口退税功能上线指引
- 【2】使用MATLAB进行机器学习(回归)
- 关于华为手机使用MTK刷机时出现failed to get PMT info的解决办法
- Hbase数据库介绍
- 破解软件以及奇奇怪怪的网站集合
- 基于PHP的驾校预约管理系统
- unity中脚本之间传递信息的方式
热门文章
- rj45 千兆接口定义_RJ45接口针脚定义(各种接口针脚定义)
- postman的完美替代品,超好用的api测试软件
- C/C++ memset函数与类对象的使用安全
- 共识算法比较:Tendermint的BFT与EOS的dPoS
- 如何删除流氓弹窗广告(全民仙战)
- 浅谈设计模式在iOS开发实战项目中的应用
- ecw2c在工作中非常糟糕的一天教会了我关于建立Stack Overflow社区的知识
- 移动硬盘拷贝linux文件,Linux(CentOS)挂载U盘、移动硬盘以及文件拷贝、备份
- Pwn2Own黑客大会:攻陷特斯拉,30万美金带回家
- shell同时启多个进程,并等待所有子进程结束