Linux内核链表——看这一篇文章就够了

Linux77

本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_each_entry,然后介绍list_del函数,通过在遍历时list_del链表的不安全行为,引出list_for_each_entry_safe函数,通过本文,我希望读者可以得到如下三个技能点:

1.能够熟练使用内核链表的相关宏和函数,并应用在项目中;

2.明白内核链表设计者们的意图,为什么要那样去设计链表的操作和提供那样的函数接口;

3.能够将内核链表移植到非GNU环境。

大多数人在学习数据结构的时候,链表都是第一个接触的内容,笔者也不列外,虽然自己实现过几种链表,但是在实际工作中,还是Linux内核的链表最为常用(同时笔者也建议大家使用内核链表,因为会了这个,其他的都会了),故总结一篇Linux内核链表的文章。

阅读本文之前,我假设你已经具备基本的链表编写经验。

核心链表的结构是双向循环链表,只有指针域,数据字段取决于使用链表的人的特定需求。内核列表设计理念:

[En]

The structure of the kernel linked list is a two-way circular linked list, only the pointer domain, and the data field depends on the specific needs of the person who uses the linked list. Philosophy of kernel list design:

既然链表不能包含万事万物,那么就让万事万物来包含链表。

假设以如下方式组织我们的数据结构:

Linux内核链表——看这一篇文章就够了

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Linux

4.2 Linux tar打包命令详解

Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个单独的磁带或磁盘中进行归档。不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包。...
Linux

020 Linux 20个宝藏命令案例

1 JDK 相关的查找命令 (1)确认是否安装 JDK (2)查找 java 命令目录的位置 (3)查找 java 命令的位置的软链地址 (4)通过软链地址查找 JDK 的安装目录 (5)查找 Lin...
Linux

Centos部署Loki日志聚合系统

关于一些日志聚合由来及原理科普见我的另外一篇 《编程入门之日志聚合系统》 https://www.cnblogs.com/uncleguo/p/15948763.html Loki日志聚合系统是由 L...
Linux

MariaDB的安装与配置

镜像下载、域名解析、时间同步请点击阿里云开源镜像站 MariaDB的安装与配置 (菜鸡我是用阿里源安装的) MariaDB是MySQL的一个分支,由开源社区维护,采用GPL授权许可,完全兼容MySQL...
Linux

Linux查看端口开放

netstat -nupl (UDP类型的端口) netstat -ntpl (TCP类型的端口) a 表示所有 n表示不查询dns t表示tcp协议 u表示udp协议 p表示查询占用的程序 l表示查...
Linux

调度器简介,以及Linux的调度策略

进程是操作系统虚拟出来的概念,用来组织计算机中的任务。但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失。不过,进程的生命都得到了操作系统内核的关照。就...
Linux

说透缓存一致性与内存屏障

故事还得从一个矛盾说起。 摩尔定律告诉我们:大约每18个月会将芯片的性能提高一倍。芯片的这种飞速发展直接导致了芯片的指令执行速度与内存读取速度之间的巨大鸿沟。 举个例子,CPU在1纳秒之内可以执行几十...
Linux

云服务器部署前后端分离项目(若依)详细教程

镜像下载、域名解析、时间同步请点击阿里云开源镜像站 第一次在Linux云服务器上部署前后端分离项目,查了很多资料和视频,踩了许多坑。成功实现部署若依的前后端分离项目后,想记录一下前后端部署的过程,供学...
Linux

Java的jinfo命令使用详解

jinfo命令简介 jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参数和系统属性的命令行...
Linux

Redis-实现SpringBoot集成Redis多数据源

背景 ​ 有些时候在一个项目里,由于业务问题,可能仅仅操作一个Redis数据源已经不能满足,比如某个运营系统,对接着多个不同的服务,处理数据时又不想通过远程调用,那只能增加一个数据源来解决问题,像My...
Linux

零基础简单易用的EmberJS框架

为什么要使用ember.js ​ ember.js是一个JavaScript框架,它大大减少了构建任何web应用程序所需的时间、精力和资源。它专注于让你,开发人员,通过做所有常见的,重复的,但重要的,...
Linux

wget命令8种实用用法

大家好,我是良许。 wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上。 这实际上也是大家所使用的浏览器所做的...