- 指令是稳定的,但指令序列是变化的,只有这样计算机才能够实现用计算来解决一切问题这个目标。计算是稳定的,但计算的数据是多变的,多态的,地址是数据,控制信号也是数据.指令集本身也是数据(固定的数据).只有这样才能够让计算机不必修改基础架构却可以适应不断发展变化的技术革命。
cpu
是负责执行指令的,谁能给它指令?是线程(也叫任务), 任务是内核的调度单元,调度到哪个任务CPU就去执行哪个任务的指令. 要执行指令就要有个取指令的开始地址. 开始地址就是大家所熟知的main函数.一个程序被加载解析后内核会在ELF中找到main函数的位置,并自动创建一个线程,指定线程的入口地址为main函数的地址,由此开始了取指,译指,执指之路.- 多线程内核是怎么处理的? 一样的, 以JAVA举例,对内核来说 new thread中的run() 函数 和 main() 并没有区别. 都是一个线程(任务)的执行入口. 注意在系列篇中反复的说任务就是线程,线程就是任务,它们是一个东西在不同层面上的描述.对应用层说线程,对内核层说任务. 有多少个线程就会有多少个入口,它们统一接受调度算法的调度, 调度算法只认优先级的高低,不会管你是main() 还是 run() 而区别对待.
- 定时器的实现也是通过任务实现的,只不过是个系统任务
OsSwtmrTaskCreate
,优先级最高,和入口地址OsSwtmrTask
由系统指定. - 所以理解CPU就要先理解任务,任务是理解内核的主线,把它搞明白了分析内核就轻轻松松,事半功倍了.看似高深的CPU只不过是搂草打兔子.不相信?那就看看内核对CPU是怎么描述的吧.本篇就围绕这个结构体展开说.
Percpu
percpu变量,顾名思义,就是对于同一个变量,每个cpu都有自己的一份,它可以被用来存放一些cpu独有的数据,比如cpu的id,cpu上正在运行的任务等等.
至于 g_percpu
的值怎么来的,因和编译过程相关,将在后续编译篇中说明.Percpu
结构体不复杂,但很重要,一个一个掰开了说.
taskSortLink
是干什么用的? 一个任务在运行过程中,经常会主动或被动停止,而进入等待状态.
- 主动停止情况, 例如:主动delay300毫秒,这是应用层很常见的操作.
- 被动停止情况, 例如:申请互斥锁失败,等待某个事件发生.
发生这些情况时任务将被挂到taskSortLink
上.这些任务可能来自不同的进程,但都是因为在被这个CPU执行时停下来了,等着再次被它执行.下图很清晰的看出在哪种情况下会被记录在案.
OsAdd2SortLink
,将任务挂到排序链表上,因等待时间不一样,所以内核会对这些任务按时间长短排序.
- 定时器相关三个变量,在系列篇定时器机制篇中已有对定时器的详细描述,可前往以下查看.
看完后就不难理解以下三个的作用了.
搞明白定时器的机制只需搞明白: 定时器(SWTMR_CTRL_S
),定时任务(swtmrTaskID
),定时器响应函数(SwtmrHandlerItem
),定时器处理队列swtmrHandlerQueue
四者的关系就可以了.
一句话概括:定时任务swtmrTaskID
是个系统任务,优先级最高,它循环读取队列swtmrHandlerQueue
中的已到时间的定时器(SWTMR_CTRL_S
),并执行定时器对应的响应函数SwtmrHandlerItem
.
-
idleTaskID
空闲任务,注意这又是个任务,每个cpu核都有属于自己的空闲任务,cpu没事干的时候就待在里面.空闲任务长什么样?Look!
OsIdleTask
是一个死循环,只有一条汇编指令Wfi
. 啥意思?WFI
(Wait for interrupt):等待中断到来指令. WFI
一般用于cpuidle,WFI 指令是在处理器发生中断或类似异常之前不需要做任何事情。具体在 自旋锁篇 中有详细描述,可前往查看.
说到死循环,这里多说一句,从宏观尺度上来理解,整个内核就是一个死循环.因为有 软硬中断/异常 使得内核能活跃起来,能跳到不同的地方去执行,执行完了又会沉寂下去,等待新的触发到来.
这句话能理解吗 ?
taskLockCnt
这个简单,记录等锁的任务数量.任务在运行过程中优先级是会不断地变化的, 例如 高优先级的A任务在等某锁,但持有锁的一方B任务优先级低,这时就会调高B的优先级至少到A的等级,提高B被调度算法命中的概率,如此就能快速的释放锁交给A运行.taskLockCnt
记录被CPU运行过的正在等锁的任务数量.schedFlag
调度的标签.
调度并不是每次都能成功的,在某些情况下内核会阻止调度进行.例如:OS_INT_ACTIVE
硬中断发生的时候.
-
excFlag
标识CPU的运行状态,只在多核CPU下可见.
以上为内核对CPU描述的全貌,不是很复杂.多CPU的协同工作部分在后续篇中介绍.
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
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 开发环境搭建
《OpenHarmony源码解析》
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。