2.3 进程控制
L08
学习目标
进程控制:创建与基本状态。本课实现侧对照 los_task.c 的 Create/Start;user 自测台确认 Task1 运行。协作 Yield 可用 04-task-yield 加深。
- 进程创建:申请 PCB/TCB、分配栈等资源、插入就绪队列。
- LiteOS-M:LOS_TaskCreate 填写控制块;TCB 对应教材 PCB。
- 高优先级任务若不让出 CPU,低优先级入口暂不执行——对照「调度」概念。
- 本课主实验 01-task-create;可选 04-task-yield 观察协作切换。
原理 · 深入理解
2.3 进程控制
本节概览:先建立「进程控制」的框架,再依次展开下列小节。
- 操作系统内核
- 进程的创建
- 进程的终止
- 进程的阻塞与唤醒
- 进程的挂起与激活
2.3.1 操作系统内核
在进程管理中,由于各个功能模块的运行频率较高,或它们为多种功能模块
所需要,通常将它们放在内核中,以提高OS 的性能。
存储器管理软件的运行频率也比较高,通常也放在内核中,以保证存储器管理具有较高的运行速度。
2.3.2 进程的创建
为使程序之间能并发运行,应先为它们分别创建进程。导致一个进程创建另一个进程的典型事件有四类:用户登录、作业调度、提供服务、应用请求。
系统中每当出现创建新进程的请求后,OS便调用进程创建原语 Createe按下述步骤创建新进程。
- 初始化进程控制块(PCB)
- 如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列
申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。
OS中允许一个进程创建另一个进程,形成进程的层次结构。
为形象描述进程家族关系,引入进程图Process Graph,它是一棵有向树,节点代表进程。
创建进程的进程称为父进程,被创建的进程称为子进程;子进程可继续创建孙进程,形成层次结构。如UNIX中进程与其子孙共同组成一个进程家族(组)。
用于描述进程间关系的一棵有向树,图中节点代表进程,创建父进程的进程称为祖先进程,树的根节点作为进程家族的祖先(Ancestor)。
2.3.3 进程的终止
引起进程终止的事件
进程不会自行从系统中消失。要终止进程,通常先遇到以下三类事件,再由内核执行终止原语。
任务完成,准备退出。批处理程序末尾常用一条 Halt 指令通知操作系统;分时系统中用户注销也会产生中断,表示进程已执行完毕。
运行中出现越界、保护错、非法指令、超时、算术错、I/O 故障等,程序无法继续执行。
应外部请求而停止:操作员或操作系统干预、父进程要求,或者父进程自身先终止。
如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按下述过程终止指定的进程。
若被终止进程正处于执行状态,应立即终止其执行,并置调度标志为真,指示该进程被终止后应重新进行调度。
- 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态
- 若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程
- 将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统
- 将被终止进程(PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息
若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
2.3.4 进程的阻塞与唤醒
有几类事件会引起进程阻塞或被唤醒:向系统请求共享资源失败;等待某种操作的完成;新数据尚未到达;等待新任务的到达。
正在执行的进程若发生上述事件,便通过调用阻塞原语block将自己阻塞。阻塞是进程自身的主动行为。
进入block过程后,由于该进程仍处于执行状态,应先立即停止执行,把PCB中的现行状态由「执行」改为阻塞,并将PCB插入阻塞队列。最后转调度程序重新调度,将处理机分配给另一就绪进程并进行切换。
向系统请求共享资源失败;等待某种操作的完成;新数据尚未到达;等待新任务的到达。
执行进程调用block原语主动阻塞自己:先停止执行,将PCB状态由「执行」改为阻塞并插入阻塞队列,再转调度程序重新调度,保留被阻塞进程的处理机状态,按新进程PCB设置CPU环境。
当被阻塞进程所期待的事件发生时,比如它启动的I/O操作已完成,或所期待的数据已经到达,则由有关进程(如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。
wakeup执行过程:把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,再将该PCB插入到就绪队列中。
2.3.5 进程的挂起与激活
本节建立「进程控制」的框架。进程控制负责进程的创建、终止、状态转换等管理工作,由OS内核中的一组原语实现。
依次展开五个小节。
- 操作系统内核
- 进程的创建
- 进程的终止
- 进程的阻塞与唤醒
做 · 实验
- 打开工作台 L08,阅读 kernel/los_task.c 中 Create/Start 相关路径。
- 烧录 01-task-create,串口出现 Task1,且不应出现 Task2。
- 对照头文件,指出 Create 参数里哪些写进了 TCB(入口、栈、优先级)。
- 选做:烧录 04-task-yield,串口应交错出现 A 与 B。
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
进程控制
thread-vs-process
用控件单步操作;日志区记下每一步发生了什么。
代码导读
本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。
总结与提升
- 能指认 Create 参数与 TCB 字段的对应。
- 能说明创建成功后低优先级任务处于就绪,只是暂时抢不到 CPU。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
延伸思考
- 创建后若不 Start,任务处于什么状态?
- 两个任务共用一个数组作栈会怎样?
- 阻塞态谁负责唤醒?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?