linux内核链表---挑战常规思维
一.普通链表
1.一般教材上的链表定义如下:
struct node{
int content;
node *next;
};
它将指针域放在链表节点中,上一个节点指针域中的值指向下一个节点的首地址,以此将a1,到an这n个在内存地址中分布不连续的值连接起来,构成顺序表。

2.链表作为一种数据结构,自然需要为它实现一些函数,比如插入节点,搜索和删除节点等,用来维护它的数据集。
(1).创建链表 node *create(...){...}
(2).插入节点 node *insert(...){...}
(3).删除节点 node *delete(...){...}
...
3.如果在一个程序中需要使用两种类型的链表,如下所示
struct node1{
int data;
node1 *next;
};
struct node2{
int data;
node2 *next;
};
那么当我们在定义它们各自的操作的时候,就需要为每个链表各自定义一套方法。比如说创建链表的操作:
node1 *create(...){...};
node2 *create(...){...};
这样就大大增加了代码量,并且较多的指针操作容易带来隐患。
二. linux的内核链表
链表在linux内核中是很常用的数据结构,在进程管理,内存管理等很多地方都有使用。比如著名的task_struct就是用链表组织的。在这样一个使用很多链表的系统中,为每个链表定义自己的一套方法是不现实的。因此使用了一种统一的组织形式。
1.内核链表定义
struct list_head{
struct list_head *next,*prev;
};
它是一个不含数据域的节点,用来将含有数据域的节点“串”起来。
2.一个例子如下
struct my_struct{
int data;
list_head *mylist;
};
如果用它创建一个节点
struct my_struct first = {
.data = 10,
.mylist = LIST_HEAD_INIT(first.mylist)
} ;
创建四个节点并对节点中的数据成员和链表节点成员进行初始化,如下图所示

可以看到,这种组织形式将节点链域与数据域分离开来,节点中的mylist域的作用就是将各个分离的节点穿起来,而mylist使用统一的list_head类型,对链表进行操作时只需要修改节点中的mylist域,而与整个结构体的类型无关,这样就不需要为每一个链表都定义一套自己的操作函数。
为了更好地理解内核链表的优点,画为如下的形式,可以当数据域是附着在list_head类型的节点域上的,将数据域与指针域分离。当我要增加或删除节点时,只需要改动节点中的指针域即可,而这样的指针就像一根线,如果在系统中只有一种线,那么就只需要定义一套链表操作函数

三.总结
书本上的知识一般只是讲述原理,技巧性的东西不会涉及太多。在实际应用中,可能一般的套路是行不通的。linux内核中的链表的实现,的确让人觉得是极为精巧的设计。不仅能大大减少代码量,还方便维护。
linux内核链表---挑战常规思维的更多相关文章
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- C语言 Linux内核链表(企业级链表)
//Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- Linux 内核链表
一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_d ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- linux内核链表的移植与使用
一. Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...
- [国嵌攻略][108][Linux内核链表]
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...
随机推荐
- Canvas get/putImageData
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...
- 【初码干货】关于.NET玩爬虫这些事
这几天在微信群里又聊到.NET可以救中国但是案例太少不深的问题,我说.NET玩爬虫简直就是宇宙第一,于是大神朱永光说,你为何不来写一篇总结一下? 那么今天就全面的来总结一下,在.NET生态下,如何玩爬 ...
- Hadoop权威指南:HDFS-数据流
Hadoop权威指南:HDFS-数据流 [TOC] 剖析文件读取 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说, 这个对象是分布式文件系统的一个实例 ...
- ubuntu 笔记一
注:ubuntu14.04 64位 1.刚安装的ubuntu无法在终端使用su 原因:root没有默认密码,需要手动设定. 解决方法:以具有sudo权限的用户登录 给root用户设置密码:打开一个te ...
- css3 3D效果
css3 3D变形 transfrom初学 这个礼拜学了css3 3d,感觉到css无穷的魅力,可以通过几个特定的代码符号创建出3D效果的页面. ___ 透视 一个元素需要一个透视点才能激活3D空间, ...
- CoreData和FMDB你用哪个?
概括: 我们先说说这两个东西,CoreData 和 FMDB,其实就我自己而言觉得这两个都不错,刚开始是接触FMDB的,CoreData是工作后自己看的.苹果推荐开发者去使用CoreData,但 FM ...
- iOS Plist 文件的 增 删 改
一:Plist 文件的创建 Plist 文件作为我们IOS开发的一种数据存储文件,还是经常会用到的.在看<X-code江湖录>的时候,看到了这一点.自己就写了一下,把写的东西分享出来!先看 ...
- DataAdapter&&DataSet 帮助理解小程序
// 2105/07/08 // DataAdapter&&DataSet using System; using System.Collections.Generic; using ...
- JavaScript中几个相似方法对比
一.substring与substr substring substr 概述 返回字符串两个索引之间(或到字符串末尾)的子串 返回字符串从指定位置开始到指定长度的子串 语法 参数 indexSta ...