鸿蒙内核源码分析(调度故事篇) | 通俗易懂 故事说内核调度 | 百篇博客分析HarmonyOS源码 | v9.06

百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee | github | csdn | coding >

百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< oschina | csdn | 掘金 | harmony >


鸿蒙内核源码分析(调度故事篇) | 通俗易懂 故事说内核调度 | 百篇博客分析HarmonyOS源码 | v9.06

本篇用一个故事说清楚鸿蒙进程和线程的调度过程.

有个场馆

   某地有一个演出场馆,分成室内馆(400平米)和室外馆(4万平米),管理处在室内馆,那是工作人员办公的地方,非工作人员不得进入!

场馆的定位是为本地用户提供舞台表演(统称舞台剧),规定同时只能一个剧上演,但因为生意太好,申请人太多了,所以用馆要先申请->排队->上演.场馆里面有一座永远很准时,不会停的大钟表,每十分钟就自动响一次,场馆里有很多的资源,有篮球,酒馆,小卖部,桌椅,还有演员(人也算资源),反正就是应有尽有,但是数量有限.

资源由管理处统一管理,这些资源也得先申请才能使用.场地外有个大屏幕,屏幕实时对外公布场馆舞台剧情况,屏幕内容如下:

舞台剧名 优先级 状态 进行中节目 就绪节目
管理处 0 正在工作 打扫场地卫生
三国演义 19 已就绪 骂死王朗
淘宝直播 20 已就绪 薇娅9点直播

场馆的内部工作也是个剧,只不过它的内部剧,优先级最高.而且注意这里只展示正在和就绪的剧情节目,就绪是指万事俱备,只欠登台表演的意思.

例如上表中有两个剧都准备好了,排成了一个就绪队列,都等着管理处打扫完卫生后表演,但同时只能演一个剧,而三国演义的优先级更高(场馆规定越小的优先级越高),所以不出意外,下一个表演的节目就是三国演义之骂死王朗.

这里请记住就绪队列,后续会反复的提它,很重要!

表演走什么流程?

用馆者需提交你舞台剧的剧本,剧本可以是玩游戏,拍电视剧,直播电商等等,反正精彩的世界任你书写,场馆内有专人(统称导演)负责跟进你的剧本上演。

剧本由各种各样的场景剧组成(统称节目),比如要拍个水浒传的剧本. 被分成武松打虎,西门和金莲那点破事等等节目剧.申请流程是去管理处先填一张电子节目表,节目表有固定的格式,填完点提交你的工作就完成了,接下来就是导演的事了.

节目表单格式如下.

剧本名称 节目章回 内容 优先级 所需资源 状态
水浒传 第18回 武松打虎 12 武松,老虎一只,酒18碗 未开始
水浒传 第28回 西门和金莲那点破事 2 西门庆,金莲,王婆,一个炕 未开始
水浒传 第36回 武松拳打蒋门神 14 武松,蒋门神,猪肉 未开始

故事写到这里,大家脑子里有个画面了吧,记住这两张表,继续走起。

西门大官人什么时候表演?

场馆都会给每个用馆单位发个标号代表你使用场馆的优先级,剧本中每个场景节目也有优先级,都是0级最高,31级最低,这里比如水浒传优先级为8,西门庆和金莲那点破事节目为2,节目资源是需要两位主角(西门,金莲)和王婆,一个炕等资源,这些资源要向场馆负责人申请好,节目资源申请到位了就可以进入就绪队列.

如果你的剧本里没有一个节目的资源申请到了那对不起您连排号的资格都没有。这里假如水浒传审核通过,并只有西门大官人节目资源申请成功,而管理处卫生打扫完了,以上两个表格的内容将做如下更新

舞台剧名 优先级 状态 进行中节目 就绪节目
水浒传 8 正在进行 西门和金莲那点破事
三国演义 19 已就绪 骂死王朗
淘宝直播 20 已就绪 薇娅9点直播

注意虽然三国演义先来,但此时水浒传排在三国的前面,是因为它的优先级高,优先级分32级,0最高,31最低.

剧本名称 节目章回 内容 优先级 所需资源 状态 表演位置
水浒传 第18回 武松打虎 12 武松,老虎一只,酒18碗 未开始 暂无
水浒传 第28回 西门和金莲那点破事 2 西门,金莲,王婆,炕一个 正在进行 西门火急火燎的跑进金莲屋内
水浒传 第36回 武松拳打蒋门神 14 武松,蒋门神,猪肉 未开始 暂无

注意看表中状态的变化和优先级,一个是剧本的优先级,一个是同一个剧本中节目的优先级.而之前优先级最高的管理处,因为没有其他节目要运行,所以移出了就绪队列.

西门好事被破坏了怎么办了?

    场馆会根据节目上的内容把节目演完。每个节目十分钟,时间到了要回去重新排队,如果还是你就可以继续你的表演。但这里经常会有异常情况发生.

比如上级领导给场馆来个电话临时有个更高优先级节目要插进来,没办法西门你的好事要先停止,please stop! 场地要让给别人办事,西门灰溜溜得回就绪队列排队去,但请放心会在你西门退场前会记录下来表演到哪个位置了(比如:西门官人已脱完鞋),以便回来时继续接着表演。高优先级的事处理完后,如果西门的优先级还是最高的就可以继续用场地,会先还原现场演到哪了再继续办事就完了,绝不重复西门前面的准备工作,否则西门绝不答应!

节目表演完所有资源要回收,这个节目从此消亡,如果你剧本里所有节目都表演完了,那你的整个剧本也可以拜拜了,导演回到导演组,又可以去接下一部戏了.

这里还原下西门被场馆紧急电话打断后表的变化是怎样的,如下:

剧本名称 优先级 状态 进行中节目 就绪节目
管理处 0 正在工作 接听上级电话
水浒传 8 已就绪 西门和金莲那点破事
三国演义 19 已就绪 骂死王朗
淘宝直播 20 已就绪 薇娅9点直播
剧本名称 节目章回 内容 优先级 所需资源 状态 表演位置
水浒传 第18回 武松打虎 12 武松,老虎一只,酒18碗 未开始 暂无
水浒传 第28回 西门和金莲那点破事 2 西门庆,金莲,王婆,一个炕 就绪 西门官人脱完鞋
水浒传 第36回 武松拳打蒋门神 14 武松,蒋门神,猪肉 未开始 暂无

表演给谁看呢?

外面那些吃瓜观众啊,群众你我他,游戏公司设计了游戏的剧本,电商公司设计了电商剧本,西门大官人被翻拍了这么多次不就是都爱看嘛,场馆会按你的剧本来表演,当然也可以互动,表演的场景需要观众操作时,观众在外面可以操作,发送指令。想想你玩游戏输入名字登录的场景。场馆里面有三个团队,张大爷团队负责导演组演剧本,王场馆负责场地的使用规划的,李后勤负责搞搞后勤.

张大爷团队做什么的?

上面这些工作都是张大爷团队的工作,接待剧本的导演组,管理剧本清单,指派导演跟进,申请节目资源,调整剧本优先级,控制时间,以使舞台能被公平公正的被调度使用等等

王场馆是做什么的?

看名字能知道负责场地用度的,你想想这么多节目,场地只有这么点,同时只能由一个节目上演,怎么合理的规划才能即公平又效率最大化呢,这就是王场馆的工作,但咱王总也有两把刷子,会给用馆公司感觉到整个场馆都是自己在用,具体不在这个故事里说明,后续有专门讲王场馆如何高效的管理内外场地的故事篇.

李后勤是做什么的?

场馆每天的开业,歇业,场地清理,管理处的对外业务,接听电话,有人闹事了怎么处理,收钱开发票 等等也有很多工作统称为后勤工作要有专门的团队来对接,具体不在这里说明,后续也有专门讲这块的故事.

故事想说什么呢?

   故事到底想说什么呢?这就是操作系统的调度机制,熟悉了这个故事就熟悉了鸿蒙系统内核任务调度的工作原理!操作系统就是管理场馆和确保工作人员有序工作的系统解决方案商,外面公司只要提供个剧本,就能按剧本把这台戏演好给广大观众观看。有了这个故事垫底,鸿蒙内核源码分析系列就有了一个非常好的开始基础。

内核和故事的关系映射

故事概念 内核概念 备注
只能一个剧本演 单CPU 多CPU核指多个剧同时上演
剧本 程序 一个剧本一个负责人跟进,跑起来的程序叫进程
导演 进程 进程负责剧本整个运行过程,是资源管理单元,任务也是一种资源
节目 线程/任务 任务记录节目的整个运行过程,任务是调度的单元
西门被打断 保存现场 本质是保存寄存器(PC,LR,FP,SP)的状态
西门继续来 恢复现场 本质是还原寄存器(PC,LR,FP,SP)的状态
表演场地 用户空间 所有节目都在同一块场地表演
管理处 内核空间 管理处非工作人员不得入内
外部场地 磁盘空间 故事暂未涉及,留在内存故事中讲解
节目内容 代码段 任务涉及的具体代码段
管理处的服务 系统调用 软中断实现,切换至内核栈
场馆大钟 系统时钟 十分钟响一次代表一个节拍(tick)
节目20分钟 时间片 鸿蒙时间片默认 2个tick,20ms
上级电话 中断 硬中断,直接跳到中断处理函数执行
表演顺序 优先级 进程和线程都是32个优先级,[0-31],从高到低
张大爷 进程/线程管理 抢占式调度,优先级高者运行
王场馆 内存管理 虚拟内存,内存分配,缺页置换 ==
李后勤 异常接管 中断,跟踪,异常接管 ==

请牢记这个故事

当然还有很多的细节在故事里没有讲到,比如王场馆和李后勤的工作细节,还有后续故事一一拆解.太细不可能真的在一个故事里全面讲完,笔者想说的是框架,架构思维,要先有整体框架再顺藤摸瓜寻细节,层层深入,否则很容易钻进死胡同里出不来。读着读着就放弃了,其实真没那么难。当你摸清了整个底层的运作机制再看上层的应用,就会有了拨开云雾见阳光,神清气爽的感觉。具体的我们在后续的章节里一一展开,用这个故事去理解鸿蒙系统内核调度过程,没毛病,请务必牢记这个故事。

鸿蒙源码百篇博客 往期回顾

参与贡献

喜欢请大方 点赞+关注+收藏 吧

上一篇:如何混合PCM音频源(Java)?


下一篇:鸿蒙源码分析系列(总目录) | 百万汉字注解 百篇博客分析 | 深入挖透HarmonyOS源码 | v8.23