首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

鸿蒙内核源码分析:双向循环链表篇

作者 | 深入研究鸿蒙,鸿蒙内核发烧友

出品 | CSDN(ID:CSDNnews)

为何鸿蒙内核源码分析系列开篇就说 LOS_DL_LIST?

因为它在鸿蒙 LOS 内核中无处不在,可以说在整个内核占了极大的比重,基本通过它把所有的结构体像胶水一样粘在一起,豪不夸张的说理解LOS_DL_LIST及相关函数 是读懂鸿蒙内核的关键。前后指针就像人的两只左右手一样灵活的指挥着系统精准的运行,越是深入分析内核源码,越是能体会在内核开发者对LOS_DL_LIST的非凡的驾驭能力,笔者仿佛看到了无数双手前后相连,拉起了无数个双向循环链表,把指针妙处运用到了极致,这也许就是编程的艺术吧!

致敬鸿蒙内核开发者,鸿蒙内核源码可以作为大学操作系统,数据结构两门课的教学项目。

真的是无处不在吗?答:是真的,看看使用它的源码吧,无处不在。

基本概念

双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针。其头指针head是唯一确定的。

从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。由于双向链表具有对称性,能方便地完成各种插入、删除等操作,但需要注意前后方向的操作。

功能接口

Huawei LiteOS系统中的双向链表模块为用户提供下面几个接口。

功能分类

接口名

描述

鸿蒙使用了双向循环链表来实现结构体数据结构之间的关联,支持单个节点的头尾插入,更精妙的是链表中支持插入另一个链表,将两个循环链表合成一个大循环链表,实现极为巧妙和简单。详见代码

大家在阅读鸿蒙内核源码要实时带着LOS_DL_LIST 这理解 代码之间的关联,构想运行时的场景是怎样的,就能体会到内核代码之精练美妙。

具体的使用场景

看下它其中的一个使用场景吧,体验设计者的奇妙用心,上代码。

这是LosProcessCB(进程控制块),因为结构体很复杂,省去了其他定义,留下LOS_DL_LIST 相关的,大家自行对照内核源码阅读,LosProcessCB包含了 七个双向循环链表,而进程组的队列是个数组,又包含了32个就绪队列的双向循环链表。这些链表承载的是一个进程在期生命周期内的运行过程逻辑,进程和线程的关系逻辑,线程的运行过程逻辑等等,是的,必须要有这么复杂的数据结构才能描述进程从出生到消亡的过程。

任务队列涉及的相关代码

这些是 任务队列出队入队操作,背后都是LOS_DL_LIST的增删过程。

内联函数 inline

鸿蒙内核大量的使用了内联函数,内联函数的好处是什么?不明白自己去查,这里不普及基本知识。源码中只有los_list.h 是.h 文件,木有.c 文件!这些调用最最频繁的内联函数,免去了像普通函数要出栈入栈的时间和空间,效率极高。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200923A03WFN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券