2.7 线程的基本概念

L12

学习目标

线程与进程的对比:调度单位与资源单位;本课 LiteOS-M 任务更接近内核线程,共享同一地址空间。

  • 线程=调度单位;进程=资源单位。
  • 本课任务模型共享固件地址空间,TCB(对应教材 PCB)描述每个可调度实体。
  • 共享 g_buf 无需跨地址空间拷贝——这是「任务≈线程」的现场证据。
  • 本课不单独实现用户级线程库。

原理 · 深入理解

进程与线程:地址空间共享 进程 A(重) 代码+数据+堆+文件表 线程 T1 自己的栈 线程 T2 自己的栈 LiteOS-M 任务 Task ≈ 线程 同地址空间(MCU 单进程) 调度单位是 Task TCB 保存 sp / 优先级

2.7 线程(Threads)的基本概念

本节概览:先建立「线程(Threads)的基本概念」的框架,再依次展开下列小节。

  1. 线程的引入
  2. 线程与进程的比较
  3. 线程的状态和线程控制块

2.7.1 线程的引入

如何让多个程序更好地并发执行、又尽量减少系统开销,成为近年来设计 OS 的重要目标。

学者们想到把进程的两个属性分开处理:调度和分派的基本单位不再同时作为资源拥有单位,使其能轻装上阵;而资源拥有单位则不必频繁切换。正是在这种思想指导下,形成了线程的概念。

引入进程是为了让多个程序能并发执行,提高资源利用率和系统吞吐量;而在 OS 中再引入线程,则是为了减少程序并发执行时的时空开销,使 OS 具有更好的并发性。

进程有两个基本属性:既是拥有资源的独立单位,又是可独立调度和分派的基本单位。把这两者分开处理,正是线程思想的由来。

资源拥有单位

进程拥有内存地址空间、I/O 设备、打开的文件、信号量等运行所需资源。

调度分派单位

进程同时是可独立调度和分派的基本单位,能被 CPU 调度执行。

为使程序能并发执行,系统需进行三类操作,每类都伴随不小的时空开销。

正是这些开销促使人们把进程的资源拥有与调度分派两个属性分开,引入更轻量的线程作为调度单位。

  1. 创建进程:分配除处理机外的所有资源(内存、I/O 等)并建立 PCB
  2. 撤销进程:先回收资源再撤销 PCB
  3. 进程切换:保留当前进程 CPU 环境、设置新进程 CPU 环境,耗费处理机时间

2.7.2 线程与进程的比较

本节讨论「线程与进程的比较」。请结合后面各小节的原理自学。

2.7.3 线程的状态和线程控制块

多线程 OS 中的进程通常包含多个线程,并为它们提供资源;OS 支持同一进程内的多个线程并发执行,但此时进程不再作为执行实体。

多线程 OS 中的进程有以下属性。

  1. 进程是一个可拥有资源的基本单位
  2. 多个线程可并发执行
  3. 进程已不是可执行的实体

线程也有三种基本状态,与进程状态对应。

执行态:已获得处理机正在运行;就绪态:具备执行条件,只等 CPU;阻塞态:执行中因某事件受阻而暂停,例如执行从键盘读数据的系统调用时被阻塞。

  1. 执行状态:线程已获得处理机而正在运行
  2. 就绪状态:线程已具备各种执行条件,只须再获得 CPU 便可立即执行
  3. 阻塞状态:线程执行中因某事件受阻而暂停

做 · 实验

  • 打开工作台 L12,阅读 los_task.c 中 TCB/任务控制相关字段。
  • 烧录 19-share-mem,reader 打印 writer 填入的字符串。
  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

打开工作台

线程的基本概念

用控件单步操作;日志区记下每一步发生了什么。

代码导读

本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。

总结与提升

  • 能说明为何本课用「任务」对应教材「进程/线程」教学。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 若引入用户态线程,HDF 驱动应放哪?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表