2.2 进程
L07
学习目标
进程=程序+数据+PCB;LiteOS-M 任务控制块(TCB)字段对照,串口打印一张表。
- 状态、优先级、栈、入口、sp。
- 教学内核 los_task_t 与 TSK_INFO_S 走读。
原理 · 深入理解
2.2 进程
本节概览:先建立「进程」的框架,再依次展开下列小节。
- 进程的定义和特征
- 进程的基本状态及转化
- 挂起操作和进程状态的转换
- 进程管理中的数据结构
2.2.1 进程的定义和特征
进程可以从不同角度定义,下面三种说法都比较典型。
引入进程实体的概念后,传统OS中的进程可定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位
进程与程序不同。从结构上看,进程实体由程序段、数据段和进程控制块(PCB)组成——程序本身没有 PCB。
从性质上看,进程还具有下列五方面特征。
进程由创建而产生,由调度而执行,由撤销而消亡;程序只是静态的指令集合。
多个进程实体可同时存在于内存,并在一段时间内交替推进。
进程是系统分配资源和调度的基本单位,各自相对独立地运行。
各进程按各自独立的、不可预知的速度向前推进(停停走走)。
进程实体由程序段、数据段和 PCB 三部分构成。
下图左侧是进程映像(程序、数据与栈),右侧是 PCB 的关键字段。
2.2.2 进程的基本状态及转化
多道并发时,进程要轮流用处理机、还要等资源,所以执行过程中就会停。先抓住三种基本状态:就绪、执行、阻塞。任何一个活着的进程,通常都落在这三者之一。
已经得到除处理机以外的资源,只要一调度就能执行。
正在占用处理机。单处理机上同一时刻只有一个进程处于执行态。
等待事件:例如申请的临界资源正被其他进程占用,此时即使将 CPU 分配给它也无法继续执行。
这三条边要记清楚:谁来切、切到哪。图2-5 就是这张三态图。
调度程序把处理机分给它。
时间片用完,处理机被收回,进程回到就绪队列再等下一次。
等事件(访问正被占用的临界资源、等 I/O 等),暂时无法继续执行。
所等的事件出现了,进程重新具备运行条件,回到就绪队列。
创建状态
进程并非调用一次即出现。创建需按顺序完成以下三步,才能进入就绪队列、接受调度。
资源暂时不足——最常见的是内存尚不足以容纳——创建未完成,此时不能调度。
- 申请一块空白 PCB,填上控制和管理所需的信息
- 分配运行必需的资源(内存等)
- 转入就绪状态,插入就绪队列
终止状态
进程执行到自然结束点、出现无法克服的错误、或被操作系统和其他进程终结,就进入终止状态。图2-6 是在三态上加上创建、终止之后的五态图。
- 操作系统做善后:记下退出码和计时统计,PCB 先留着供其他程序读取
- 其他进程取完信息后,将 PCB 清零并交还系统;此后该进程不能再执行
2.2.3 挂起操作和进程状态的转换
引入挂起操作,是基于系统和用户的四类需要。
许多系统中,进程除了就绪、执行和阻塞三种最基本状态外,为了系统和用户观察、分析进程的需要,引入了一个重要操作——挂起操作。
进程被挂起后处于静止状态:若正在执行则暂停执行;若处于就绪状态则暂不接受调度。
- 终端用户的需要
- 父进程请求
- 负荷调节的需要
- 操作系统的需要
引入挂起原语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。
引入挂起原语后,进程多出终止状态的转换:进程完成任务、出现不可克服的错误或被 OS 终结时进入终止状态。
新进程产生时处于创建状态。
资源和性能允许时,创建完成后转为活动就绪。
进程完成或被终结时进入终止状态。
2.2.4 进程管理中的数据结构
索引方式:系统根据所有进程状态的不同,建立几张索引表,并把各索引表在内存的首地址记录在内存的一些专用单元中。
每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
一个系统中通常有数十个、数百个乃至数千个PCB,为有效管理它们,应采用适当方式组织。
常见组织方式有线性方式、链接方式和索引方式。
系统中PCB数量众多,需要用适当方式将它们组织起来以便管理。
将系统中所有PCB组织在一张线性表中,将该表首址存放在内存的专用区域中。
把具有相同状态进程的PCB分别通过PCB中的链接字链接成队列,可形成就绪队列、若干阻塞队列和空白队列等。
为了便于对计算机中各类资源的使用和管理,OS将它们抽象为相应的数据结构,并提供一组对资源进行操作的命令,用户利用数据结构及操作命令执行相关操作。
OS作为计算机资源的管理者,为协调诸多用户对共享资源的使用,必须记录和查询各种资源的使用及各类进程运行情况的信息。
计算机系统对每个资源和每个进程都设置了一个数据结构,用于表征其实体,称为资源信息表或进程信息表,其中包含资源或进程的标识、描述、状态等信息以及一批指针。
PCB 的组织方式:系统中有大量 PCB,需要用合适的方式组织管理。
所有 PCB 组织在一张线性表中,首址存放在内存专用区域。
相同状态进程的 PCB 通过链接字组成队列,形成就绪队列、阻塞队列等。
结合图 2-11 PCB 链接队列示意图理解:不同状态的 PCB 分别链接成就绪队列、阻塞队列和空白队列。
索引方式:系统根据进程状态建立几张索引表,各索引表首地址记录在内存专用单元中,每个表目记录相应状态 PCB 的地址。
做 · 实验
- 烧录 11-tcb-dump,对照 dump 行与头文件字段。
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
进程
用控件单步操作;日志区记下每一步发生了什么。
代码导读
本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。
总结与提升
- 能列出至少 4 个 TCB 关键字段并指出本课日志中的值。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
延伸思考
- 为何栈要在创建时就准备好?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?