女主宣言

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

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

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

使用实例

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

linux内核源码 -- list链表相关推荐

  1. linux内核代码研读与实战,Linux内核源码研读与实战演练

    Linux内核源码研读与实战演练 网盘下载链接: http://pan.baidu.com/s/1fIYf0 密码: 341f 要是网盘失效了,请加我QQ: 3113533060 课程内容: 第1部分 ...

  2. 详细讲解Linux内核源码内存管理(值得收藏)

    Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理和进程虚拟内存.内核的内存管理是Linux内存管理的核心,所以我们先对内核的内存管理进行简介. 一.物理内存模型 物理内存 ...

  3. 腾讯首发Linux内核源码《嵌入式开发进阶笔记》差距差的不止一点点哦

    一,前言 Linux内核是一个操作系统(OS)内核,本质上定义为类Unix.它用于不同的操作系统,主要是以不同的Linux发行版的形式.Linux内核是第一个真正完整且突出的免费和开源软件示例.Lin ...

  4. Linux内核源码分析《进程管理》

    Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...

  5. Linux内核源码分析之内存管理

    本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...

  6. iostat IO统计原理linux内核源码分析----基于单通道SATA盘

    iostat IO统计原理linux内核源码分析----基于单通道SATA盘 先上一个IO发送submit_bio流程图,本文基本就是围绕该流程讲解. 内核版本 3.10.96 详细的源码注释:htt ...

  7. 红黑树原理浅谈(附Linux内核源码注释)

    引言:红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二 ...

  8. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】...

    原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinauni ...

  9. Linux内核源码中使用宏定义的若干技巧

    在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠 ...

最新文章

  1. 机器视觉中彩色成像必须考虑的十个问题
  2. AngularJS表单验证
  3. s3c2440移植MQTT
  4. 集美大学java考试题_我的JAVA习题集2
  5. 通过 dhcp-agent 访问 Metadata - 每天5分钟玩转 OpenStack(168)
  6. 你们也只剩下点赞的交情
  7. Windows下安装配置ant
  8. 【Docker】ERROR: Could not find a version that satisfies the requirement pytest==5.0.1
  9. 关于java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 实体类
  10. android系统开机画面_Android开机画面
  11. cent mysql 配置,centos下MySQL安装配置
  12. js和jquery给iframe src赋值的3种方法
  13. python音标1003python音标_词汇小助手V1.2——可以显示英语单词的国际音标
  14. [ 成为架构师系列 ] 2. 深入理解 Cookie 与 Session ,Facade 设计模式, 分布式 Session...
  15. 第4关国际标准书号校验python 头歌
  16. 推荐系统学习笔记-FNN
  17. java基础之TreeMap
  18. ssh登录报no matching MAC found. Their offer: hmac-sha2-512异常
  19. 小米、HomeKit之间设备互联?智汀家庭云助你实现兼容性
  20. matlab软件推广海报,海报制作软件下载-posterlabs海报制作工具下载1.0 官方版-西西软件下载...

热门文章

  1. Yammer Metrics实现服务指标收集与监控
  2. Spring对不同来源的Resources的支持
  3. Android服务的通信方式,android客户端与服务器通信的HTTP通信
  4. 什么是JDK,什么是JRE?JDK的安装和环境变量的配置
  5. c++使用单向链表存储一组有序数据_初试攻略丨计算机考研中数据结构知识点总结,硬核!...
  6. eclipse拒绝mysql,eclipse连接mysql的有关问题
  7. 精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由
  8. 感谢党,软考过了。系统集成项目管理project师
  9. phpstorm配置yaf代码自动补全提示
  10. qiniudn.com域名已完全恢复