9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

linux 内核源码 -- list 链表

  • 2019-11-20
  • 本文字数:912 字

    阅读完需:约 3 分钟

linux内核源码 -- list链表

linux kernel 里的很多数据结构都很经典, list 链表就是其中之一,本文将从以下几方面介绍 list 链表:list 的定义、list 提供的操作方法、注意事项、使用实例

前言

linux kernel 里的很多数据结构都很经典, list 链表就是其中之一


本篇要介绍的内容:

1.list 的定义

2.list 提供的操作方法

3.注意事项

4.使用实例

list 链表

1 List 所在文件

List 的所有操作可以在 include/linux/list.h 找到;

List head 的定义可以在 include/linux/types.h 找到;

2 定义

实际上这就是一个双向循环链表, 且有一个头指针


list head 的定义:



这个定义中只有前向和后向指针,没任何的数据部分, 那我们基本上就知道了, 它不是被单独使用的,而是把它嵌入到用户定义的 struct 中, 将用户定义的数据结构串起来,作成 list;


思想很巧妙, 对用户定义的数据结构侵入性很小, 实现了 c++中 std::List 模板的功能;


虽然这个定义是叫 head, 但其实嵌入到用户定义的数据结构中的也是这个.

3 list 提供的操作方法

初始化

插入操作

将一个元素插入到两个元素之间, 即将 new 插入到 prev 和 next 中, 这个函数是下面在头部和尾部插入的实现基础



在头部插入, 在头指针和第一个元素间插入



在尾部插入,在最后一个元素间和头指针间插入, 因为是循环链表嘛~


删除操作

删除两个元素之间的元素



删除一个已知元素 entry


替换操作

都是指针的变换


移动操作

将一个元素移动到另一个 list 的头部



将一个元素移动到另一个 list 的队尾


拆分操作

将一个队列由指定的位置拆成两个队列


list 是新队列的 head 指针, 包括的元素从原 head 队列的第一个元素到 entry, head 队列仅包括余下的元素


合并操作

将 list 列表中除了 list 本身插入到 prev 和 next 之间



将一个列表插入到另一个列表的头部



将一个列表插入到另一个列表的尾部


list_entry 宏

按之前说的, 这个 list_head 都有要嵌入到用户定义的 struct 中,这个宏就是由这个 list_head ptr 来获取当前所处的 struct 对象的指针, 用了 linux 的经典宏定义 container_of



一堆宏定义, 用来各种遍历, 获取 entry

4 注意事项

只说一个,就是多线程操作同一个 list, 还是需要加锁

5 使用实例


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/yFbCE3qu7IEKeAhpEoiUPw


活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2019-11-20 16:381081

评论

发布
暂无评论
发现更多内容

运营宠物类自媒体:明确受众和自己的定位

石头IT视角

另一个失败的小项目

箭上有毒

8月日更

TCP-三次握手和四次挥手简单理解

一个大红包

8月日更

从0开始的TypeScriptの六:webpack5热更新打包TS

空城机

JavaScript typescript 大前端 8月日更

【Vue2.x 源码学习】第三十四篇 - 组件部分-Vue组件与初始化流程简介

Brave

源码 vue2 8月日更

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

编程三昧

JavaScript html5 大前端 8月日更 事件冒泡

MySQL专栏(三)-->事务控制那些事

卢卡多多

MySQL 8月日更

优秀的求职者,是如何巧妙应对面试提问呢?

xcbeyond

面试 求职 8月日更

占楼

IT蜗壳-Tango

8月日更

算法分析

一个大红包

8月日更

Vue进阶(二十八):浅析 Vue 中 computed 与 method 区别

No Silver Bullet

Vue 8月日更 computed

架构杂谈——也谈互联网系统架构演进

老农小江

Java 架构

三分钟看完单例模式的八个例子

4ye

Java 后端 设计模式 单例模式 8月日更

netty系列之:文本聊天室

程序那些事

Java Netty nio 程序那些事

毕业设计:设计电商秒杀系统

9527

#架构实战营

oeasy教您玩转vim - 15 - # 行内查找

o

IntelliJ IDEA 如何在 Java 中进行快速注释

HoneyMoose

Linux之ss命令

入门小站

Linux

Redis入门到超神 - 03 redis.conf配置文件详解

陈皮的JavaLib

redis 运维 8月日更

iOS开发:苹果开发者账号第一次新建APP ID以及创建App的步骤

三掌柜

8月日更 8月

手撸二叉树之二叉树的最近公共祖先

HelloWorld杰少

数据结构与算法 8月日更

什么是分布式超媒体信息获取系统?

escray

学习 极客时间 如何落地业务建模 8月日更

毕业总结

方堃

在线HTTP/HTTPS协议GET,POST,RESTful接口测试

入门小站

Linux

如何评价《Java 并发编程艺术》这本书?

cxuan

书籍推荐 java 并发

旗舰机怎么做隐私安全?荣耀Magic3有个答案

脑极体

【Flutter 专题】69 图解基本 Stepper 步进器

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

有状态算子和应用(七)

数据与智能

flink 算子 状态

Golang中的Remove和RemoveAll的对比分析

liuzhen007

8月日更

Discourse 用户的邮件无法投递的时候如何处理

HoneyMoose

LeetCode题解:783. 二叉搜索树节点最小距离,递归,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

  • 扫码添加小助手
    领取最新资料包
linux内核源码 -- list链表_文化 & 方法_刘伟_InfoQ精选文章