2.2 进程

L07

学习目标

进程=程序+数据+PCB;LiteOS-M 任务控制块(TCB)字段对照,串口打印一张表。

  • 状态、优先级、栈、入口、sp。
  • 教学内核 los_task_t 与 TSK_INFO_S 走读。

原理 · 深入理解

2.2 进程

本节概览:先建立「进程」的框架,再依次展开下列小节。

  1. 进程的定义和特征
  2. 进程的基本状态及转化
  3. 挂起操作和进程状态的转换
  4. 进程管理中的数据结构

2.2.1 进程的定义和特征

进程可以从不同角度定义,下面三种说法都比较典型。

引入进程实体的概念后,传统OS中的进程可定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

  1. 进程是程序的一次执行
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  3. 进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位

进程与程序不同。从结构上看,进程实体由程序段、数据段和进程控制块(PCB)组成——程序本身没有 PCB。

从性质上看,进程还具有下列五方面特征。

动态性

进程由创建而产生,由调度而执行,由撤销而消亡;程序只是静态的指令集合。

并发性

多个进程实体可同时存在于内存,并在一段时间内交替推进。

独立性

进程是系统分配资源和调度的基本单位,各自相对独立地运行。

异步性

各进程按各自独立的、不可预知的速度向前推进(停停走走)。

结构性

进程实体由程序段、数据段和 PCB 三部分构成。

下图左侧是进程映像(程序、数据与栈),右侧是 PCB 的关键字段。

2.2.2 进程的基本状态及转化

多道并发时,进程要轮流用处理机、还要等资源,所以执行过程中就会停。先抓住三种基本状态:就绪、执行、阻塞。任何一个活着的进程,通常都落在这三者之一。

就绪

已经得到除处理机以外的资源,只要一调度就能执行。

执行

正在占用处理机。单处理机上同一时刻只有一个进程处于执行态。

阻塞

等待事件:例如申请的临界资源正被其他进程占用,此时即使将 CPU 分配给它也无法继续执行。

这三条边要记清楚:谁来切、切到哪。图2-5 就是这张三态图。

就绪 → 执行

调度程序把处理机分给它。

执行 → 就绪

时间片用完,处理机被收回,进程回到就绪队列再等下一次。

执行 → 阻塞

等事件(访问正被占用的临界资源、等 I/O 等),暂时无法继续执行。

阻塞 → 就绪

所等的事件出现了,进程重新具备运行条件,回到就绪队列。

图2-5 进程的三种基本状态及其转换 就绪 执行 阻塞 调度:就绪→执行 等待事件:执行→阻塞 事件完成:阻塞→就绪
图2-5 进程的三种基本状态及其转换

创建状态

进程并非调用一次即出现。创建需按顺序完成以下三步,才能进入就绪队列、接受调度。

仍停在创建态

资源暂时不足——最常见的是内存尚不足以容纳——创建未完成,此时不能调度。

  1. 申请一块空白 PCB,填上控制和管理所需的信息
  2. 分配运行必需的资源(内存等)
  3. 转入就绪状态,插入就绪队列
创建进程:三步,资源不够就停在创建态 空白 PCB 填控制信息 分配资源 内存等 就绪队列 可以接受调度 创建状态 资源不够,还不能调度 资源齐了才从创建态走进就绪队列。

终止状态

进程执行到自然结束点、出现无法克服的错误、或被操作系统和其他进程终结,就进入终止状态。图2-6 是在三态上加上创建、终止之后的五态图。

  1. 操作系统做善后:记下退出码和计时统计,PCB 先留着供其他程序读取
  2. 其他进程取完信息后,将 PCB 清零并交还系统;此后该进程不能再执行
图2-6 进程的五种基本状态及转换 新建 就绪 执行 阻塞 终止 在三态上加新建、终止:创建完成进入就绪,执行完进入终止。
图2-6 进程的五种基本状态及转换

2.2.3 挂起操作和进程状态的转换

引入挂起操作,是基于系统和用户的四类需要。

许多系统中,进程除了就绪、执行和阻塞三种最基本状态外,为了系统和用户观察、分析进程的需要,引入了一个重要操作——挂起操作。

进程被挂起后处于静止状态:若正在执行则暂停执行;若处于就绪状态则暂不接受调度。

  1. 终端用户的需要
  2. 父进程请求
  3. 负荷调节的需要
  4. 操作系统的需要

引入挂起原语Suspend和激活原语Active后,进程会在活动/静止两种状态间转换。

未被挂起的阻塞状态称为活动阻塞Blockeda,用Suspend挂起后变为静止阻塞Blockeds;处于Blockeds的进程在所期待事件出现后,转为静止就绪Readys。

未被挂起的就绪状态称为活动就绪Readya,可接受调度;用Suspend挂起后变为静止就绪Readys,不再被调度执行。

活动就绪 → 静止就绪

Readya 经挂起原语Suspend作用后变为Readys,不再被调度执行。

活动阻塞 → 静止阻塞

Blockeda 经挂起原语Suspend作用后变为Blockeds,事件出现后转为Readys。

结合图2-7理解激活原语Active带来的反向转换。

处于静止状态的进程,可用激活原语Active重新转回活动状态。

静止就绪 → 活动就绪

处于Readys状态的进程经Active激活后转变为Readya。

静止阻塞 → 活动阻塞

处于Blockeds状态的进程经Active激活后转变为Blockeda。

图2-7 具有挂起状态的进程状态图 活动就绪 执行 活动阻塞 静止就绪 静止阻塞 挂起:从内存换出。活动=在内存,静止=被挂起在外存。
图2-7 具有挂起状态的进程状态图

引入挂起原语后,进程多出终止状态的转换:进程完成任务、出现不可克服的错误或被 OS 终结时进入终止状态。

NULL→创建

新进程产生时处于创建状态。

创建→活动就绪

资源和性能允许时,创建完成后转为活动就绪。

执行→终止

进程完成或被终结时进入终止状态。

图2-8 具有创建、终止和挂起状态的进程状态图 创建 活动就绪 执行 终止 静止就绪 活动阻塞 静止阻塞 挂起:活动↔静止;事件完成:阻塞→就绪。
图2-8 具有创建、终止和挂起状态的进程状态图

2.2.4 进程管理中的数据结构

索引方式:系统根据所有进程状态的不同,建立几张索引表,并把各索引表在内存的首地址记录在内存的一些专用单元中。

每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。

图2-9 操作系统控制表的一般结构 内存表 各进程占用的内存 设备表 设备分配与状态 文件表 打开文件 进程表 / PCB 进程控制块 每类资源一张表,用指针串起来。
图2-9 操作系统控制表的一般结构

一个系统中通常有数十个、数百个乃至数千个PCB,为有效管理它们,应采用适当方式组织。

常见组织方式有线性方式、链接方式和索引方式。

进程控制块的组织方式

系统中PCB数量众多,需要用适当方式将它们组织起来以便管理。

线性方式

将系统中所有PCB组织在一张线性表中,将该表首址存放在内存的专用区域中。

链接方式

把具有相同状态进程的PCB分别通过PCB中的链接字链接成队列,可形成就绪队列、若干阻塞队列和空白队列等。

图2-9 操作系统控制表的一般结构 内存表 各进程占用的内存 设备表 设备分配与状态 文件表 打开文件 进程表 / PCB 进程控制块 每类资源一张表,用指针串起来。
图2-9 操作系统控制表的一般结构

为了便于对计算机中各类资源的使用和管理,OS将它们抽象为相应的数据结构,并提供一组对资源进行操作的命令,用户利用数据结构及操作命令执行相关操作。

OS作为计算机资源的管理者,为协调诸多用户对共享资源的使用,必须记录和查询各种资源的使用及各类进程运行情况的信息。

计算机系统对每个资源和每个进程都设置了一个数据结构,用于表征其实体,称为资源信息表或进程信息表,其中包含资源或进程的标识、描述、状态等信息以及一批指针。

PCB 的组织方式:系统中有大量 PCB,需要用合适的方式组织管理。

线性方式

所有 PCB 组织在一张线性表中,首址存放在内存专用区域。

链接方式

相同状态进程的 PCB 通过链接字组成队列,形成就绪队列、阻塞队列等。

图2-10 PCB线性表示意图 下标 PCB 0 P0 1 P1 2 P2 n 所有 PCB 排在一张线性表里,首址放在专用单元。
图2-10 PCB线性表示意图

结合图 2-11 PCB 链接队列示意图理解:不同状态的 PCB 分别链接成就绪队列、阻塞队列和空白队列。

图2-11 PCB链接队列示意图 就绪队列 P1 P2 P3 阻塞队列 P1 P2 P3 同一状态的 PCB 用指针串成队
图2-11 PCB链接队列示意图

索引方式:系统根据进程状态建立几张索引表,各索引表首地址记录在内存专用单元中,每个表目记录相应状态 PCB 的地址。

图2-12 按索引方式组织PCB 索引表 PCB 表项地址 PCB 索引表里记的是 PCB 在表中的位置
图2-12 按索引方式组织PCB

做 · 实验

  • 烧录 11-tcb-dump,对照 dump 行与头文件字段。
  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

打开工作台

进程

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

代码导读

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

总结与提升

  • 能列出至少 4 个 TCB 关键字段并指出本课日志中的值。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 为何栈要在创建时就准备好?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表