2.7 线程的基本概念
L12
学习目标
线程与进程的对比:调度单位与资源单位;本课 LiteOS-M 任务更接近内核线程,共享同一地址空间。
- 线程=调度单位;进程=资源单位。
- 本课任务模型共享固件地址空间,TCB(对应教材 PCB)描述每个可调度实体。
- 共享 g_buf 无需跨地址空间拷贝——这是「任务≈线程」的现场证据。
- 本课不单独实现用户级线程库。
原理 · 深入理解
2.7 线程(Threads)的基本概念
本节概览:先建立「线程(Threads)的基本概念」的框架,再依次展开下列小节。
- 线程的引入
- 线程与进程的比较
- 线程的状态和线程控制块
2.7.1 线程的引入
如何让多个程序更好地并发执行、又尽量减少系统开销,成为近年来设计 OS 的重要目标。
学者们想到把进程的两个属性分开处理:调度和分派的基本单位不再同时作为资源拥有单位,使其能轻装上阵;而资源拥有单位则不必频繁切换。正是在这种思想指导下,形成了线程的概念。
引入进程是为了让多个程序能并发执行,提高资源利用率和系统吞吐量;而在 OS 中再引入线程,则是为了减少程序并发执行时的时空开销,使 OS 具有更好的并发性。
进程有两个基本属性:既是拥有资源的独立单位,又是可独立调度和分派的基本单位。把这两者分开处理,正是线程思想的由来。
进程拥有内存地址空间、I/O 设备、打开的文件、信号量等运行所需资源。
进程同时是可独立调度和分派的基本单位,能被 CPU 调度执行。
为使程序能并发执行,系统需进行三类操作,每类都伴随不小的时空开销。
正是这些开销促使人们把进程的资源拥有与调度分派两个属性分开,引入更轻量的线程作为调度单位。
- 创建进程:分配除处理机外的所有资源(内存、I/O 等)并建立 PCB
- 撤销进程:先回收资源再撤销 PCB
- 进程切换:保留当前进程 CPU 环境、设置新进程 CPU 环境,耗费处理机时间
2.7.2 线程与进程的比较
本节讨论「线程与进程的比较」。请结合后面各小节的原理自学。
2.7.3 线程的状态和线程控制块
多线程 OS 中的进程通常包含多个线程,并为它们提供资源;OS 支持同一进程内的多个线程并发执行,但此时进程不再作为执行实体。
多线程 OS 中的进程有以下属性。
- 进程是一个可拥有资源的基本单位
- 多个线程可并发执行
- 进程已不是可执行的实体
线程也有三种基本状态,与进程状态对应。
执行态:已获得处理机正在运行;就绪态:具备执行条件,只等 CPU;阻塞态:执行中因某事件受阻而暂停,例如执行从键盘读数据的系统调用时被阻塞。
- 执行状态:线程已获得处理机而正在运行
- 就绪状态:线程已具备各种执行条件,只须再获得 CPU 便可立即执行
- 阻塞状态:线程执行中因某事件受阻而暂停
做 · 实验
- 打开工作台 L12,阅读 los_task.c 中 TCB/任务控制相关字段。
- 烧录 19-share-mem,reader 打印 writer 填入的字符串。
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
线程的基本概念
用控件单步操作;日志区记下每一步发生了什么。
代码导读
本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。
总结与提升
- 能说明为何本课用「任务」对应教材「进程/线程」教学。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
延伸思考
- 若引入用户态线程,HDF 驱动应放哪?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?