本篇为快锁下篇,说清楚快锁在内核态的实现,解答以下问题,它们在上篇的末尾被提出来。
- 鸿蒙内核进程池默认上限是
64
个,除去两个内核进程外,剩下的都归属用户进程,理论上用户进程可以创建很多快锁,这些快锁可以用于进程间(共享快锁)也可以用于线程间(私有快锁),在快锁的生命周期中该如何保存 ? - 无锁时,前面已经有进程在申请锁时,如何处理好新等锁进程和旧等锁进程的关系 ?
- 释放锁时,需要唤醒已经在等锁的进程,唤醒的顺序由什么条件决定 ?
系列篇多次提过,线程在内核层面叫任务,在内核任务比进程重要得多,调度也好,竞争也罢,都是围绕任务展开的。竞争快锁是任务间的竞争,自然会和任务(task
)有紧密的联系,其在内核的表达也出现在了任务表达之中。
对 任务 不清楚的请翻看系列相关篇,一定要搞懂,它是内核最重要的概念,甚至没有之一,搞不懂任务就一定搞不懂内核整体的运行机制。
快锁节点 | 内核表达
FutexNode
(快锁节点) 是快锁模块核心结构体,熟悉这块源码的钥匙。
解读
- 首先要明白 快锁 和 快锁节点 的区别,否则看内核代码一定会懵圈,内核并没有快锁这个结构体,
key
就是快锁,它们的关系是1:N
的关系 ,快锁分成了 私有锁 和 共享锁 两种类型。用key
表示唯一性。共享锁用物理地址 , 私有锁用虚拟地址。为什么要这么做呢 ?
- 私有锁的意思是进程私有,作用于同一个进程的不同任务间, 因为任务是共享进程空间的, 所以可以用虚拟地址来表示进程内的唯一性 。 但两个不同的进程会出现两个虚拟地址一样的快锁。
- 共享锁的意思是进程共享,作用于不同进程的不同任务间,因为不同的进程都会有相同的虚拟地址范围, 所以不能用虚拟地址来表示唯一性 ,只能用物理地址。虚拟地址 : 物理地址 =
N: 1
,不清楚的请查看系列篇之内存映射相关篇。
-
index
内核使用哈希桶来检索快锁 ,index
和key
的关系通过哈希算法(FNV-1a
)来映射。注意会有同一个哈希桶中两个key
一样的锁,虽然它会以极低概率出现。快锁的内核实现代码部分,个人觉得可以优化的空间很大,应好好测试下这块 ,说不定会有意想不到的bug
: ) 。 -
pid
指快锁节点进程归属,作用于私有锁。 -
pendList
指向LosTaskCB.pendList
, 通过它去唤醒和挂起任务,但并没有在源码中看到指向动作,如有看到的请告诉站长(wx: rekaily
)。 -
queueList
具有相同key
值的节点被queue_list
串联起来表示被同一把锁阻塞的任务队列,意思就是queueList
上面挂的都是等值为相同key
的快锁,并按任务的优先级排好序。任务优先级高的可以先获取快锁使用权。 -
futexList
指向下一把快锁, 虽然挂的也是FutexNode
,但是意义不一样 ! 是指queueList
链表上的首个快锁节点,即不同key
的快锁。能理解吗 ? 好吧 ,我承认这里面有点绕 。
哈希桶 | 管理快锁
当用户态产生锁的竞争或释放需要进行相关线程的调度操作时,会触发Futex
系统调用进入内核,此时会将用户态锁的地址传入内核,并在内核的Futex
中以锁地址来区分用户态的每一把锁,因为用户态可用虚拟地址空间为1GiB
,为了便于查找、管理,内核Futex
采用哈希桶来存放用户态传入的锁。
哈希桶共有80
个,0~63
号桶用于存放私有锁(以虚拟地址进行哈希),64~79
号桶用于存放共享锁(以物理地址进行哈希),所有相同的 key
都掉进了同一个桶里。私有/共享属性通过用户态锁的初始化以及Futex
系统调用入参确定。
下图来源于官方文档,基本能准确的描述管理方式,暂且使用此图(后续可能重画) , 有了这张图理解上面FutexNode
会更轻松
任务调度
- 无锁时就需要将当前任务挂起,可详细跟踪函数
OsFutexWaitTask
,无非就是根据任务的优先级调整queueList
futexList
queueList
这些链表上的位置
- 释放锁时就需要将
queueList
上挂起任务唤醒,可详细跟踪函数OsFutexWaitTask
,如果没有任务再等锁了就DeleteKey
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
OpenHarmony 开发环境搭建
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。