进程控制

本文最后更新于:2025年10月16日 下午

进程控制是操作系统中进程管理的核心功能,负责进程从创建到终止的全生命周期管理,以及运行过程中的状态转换。其本质是通过操作系统内核中的原语(执行原子操作的程序段)实现,确保操作的完整性和不可中断性,避免并发环境下的执行混乱。

一、进程控制的核心基础:原语

1. 原语的定义与特性

  • 定义:原语是操作系统内核中执行特定功能的程序段,运行在系统态,用于完成进程控制中的关键操作(如创建、终止进程)。
  • 核心特性:执行原子操作——要么完整执行,要么完全不执行,中途不允许被中断(如CPU调度、中断处理),确保进程状态转换和资源操作的一致性。

二、进程的创建

进程创建是从“无进程实体”到“可调度就绪进程”的过程,遵循层次化管理逻辑,由父进程创建子进程,形成进程家族树。

1. 进程的层次结构

  • 父子进程关系:创建进程的为父进程,被创建的为子进程;子进程可进一步创建孙进程,形成树状层次结构(进程图)。
  • 资源继承规则:子进程默认继承父进程的部分资源(如内存空间、打开的文件、信号量),子进程终止后需将资源归还给父进程;若父进程终止,其所有子孙进程必须同时被终止,避免“孤儿进程”。

2. 引起进程创建的典型事件

进程创建由系统或用户触发,具体场景分为四类:

触发事件 适用系统 创建主体 示例
用户登录 分时系统(如Linux终端登录) 操作系统内核 用户输入账号密码登录后,系统为其创建Shell进程
作业调度 批处理系统 操作系统内核 作业调度程序从后备队列中选择作业,为其创建进程并分配资源
提供服务 通用OS 操作系统内核 用户请求打印服务时,系统创建打印进程处理任务
应用请求 多进程应用 用户进程(父进程) 浏览器进程为新标签页创建子进程,实现多标签并发

3. 进程创建的步骤(创建原语Creat执行流程)

  1. 申请空白PCB:为新进程分配唯一的内部标识符(如进程ID),并从系统PCB集合中获取一个空白PCB(进程存在的唯一标志)。
  2. 分配资源:为新进程分配运行所需的资源,包括物理资源(内存块、I/O设备)和逻辑资源(文件句柄、信号量);若资源不足,进程可能暂存于“创建状态”,等待资源释放。
  3. 初始化PCB:填写PCB中的关键信息,包括:
    • 进程标识符(内部ID、外部名称);
    • 处理机状态(初始化通用寄存器、程序计数器PC指向进程入口地址);
    • 进程调度信息(初始状态设为“就绪”、默认优先级);
    • 资源清单(记录已分配的资源地址)。
  4. 插入就绪队列:若就绪队列未满,将新进程的PCB插入就绪队列,等待CPU调度。

三、进程的终止

进程终止是从“运行/阻塞/就绪状态”到“释放所有资源并消亡”的过程,需处理资源回收和子进程清理。

1. 引起进程终止的典型事件

进程终止分为正常结束、异常结束和外界干预三类:

终止类型 具体场景 示例
正常结束 进程完成预定任务 计算进程完成数据运算后主动终止
异常结束 进程运行中出现不可恢复错误 越界访问内存(越界错)、执行非法指令、I/O设备故障
外界干预 外部请求强制终止进程 操作员通过命令杀死进程(如kill命令)、父进程请求终止子进程、父进程自身终止

2. 进程终止的步骤(终止原语执行流程)

  1. 定位PCB:根据被终止进程的标识符(如PID),从系统PCB集合中检索其PCB,获取进程当前状态(执行/就绪/阻塞)。
  2. 终止执行(若需):若进程正处于“执行状态”,立即终止其CPU执行,设置“调度标志”为真,通知调度程序重新选择就绪进程。
  3. 清理子孙进程:若该进程有子孙进程,需递归终止所有子孙进程,避免其成为无管理的“孤儿进程”。
  4. 回收资源:将进程占用的所有资源归还给父进程(继承的资源)或系统(全局资源,如内存、I/O设备)。
  5. 移除PCB:将被终止进程的PCB从所在队列(就绪队列/阻塞队列)中移出,清空PCB内容并释放PCB空间给系统。

四、进程的阻塞与唤醒

阻塞与唤醒是进程“主动暂停”与“被动恢复”的一对操作,针对进程等待某事件(如I/O完成、资源可用)的场景,需配合执行以避免“永久阻塞”。

1. 引起阻塞/唤醒的典型事件

进程因等待特定事件而阻塞,事件完成后被唤醒,具体场景包括:

  • 向系统请求共享资源失败(如申请打印机时,打印机正被占用);
  • 等待某操作完成(如进程发起磁盘读操作后,等待I/O完成);
  • 等待新数据到达(如网络进程等待客户端发送的数据包);
  • 等待新任务分配(如服务器进程等待用户请求)。

2. 进程阻塞过程(阻塞原语block执行流程)

阻塞是进程的主动行为(进程自身因等待事件而放弃CPU),步骤如下:

  1. 暂停执行:若进程当前处于“执行状态”,立即停止其CPU执行,保存处理机上下文(通用寄存器、PC、PSW)到PCB。
  2. 修改状态:将PCB中的进程状态从“执行”改为“阻塞”,并记录阻塞原因(如“等待I/O”)。
  3. 插入阻塞队列:根据阻塞原因,将PCB插入对应事件的阻塞队列(如I/O阻塞队列、资源阻塞队列);若系统仅设一个通用阻塞队列,则直接插入队尾。
  4. 重新调度:触发CPU调度程序,从就绪队列中选择新进程分配CPU,切换处理机上下文(加载新进程的PCB信息)。

3. 进程唤醒过程(唤醒原语wakeup执行流程)

唤醒是进程的被动行为(由其他进程或系统触发),步骤如下:

  1. 移出阻塞队列:当阻塞进程等待的事件发生(如I/O完成),由触发事件的进程(如I/O进程)调用唤醒原语,将该进程的PCB从对应阻塞队列中移出。
  2. 修改状态:将PCB中的进程状态从“阻塞”改为“就绪”。
  3. 插入就绪队列:将PCB插入就绪队列,等待CPU调度;若系统采用优先级调度,按进程优先级插入对应位置。

4. 关键约束

阻塞与唤醒必须成对出现:若某进程调用阻塞原语,必须在另一进程(或系统)中安排唤醒原语;否则阻塞进程会因无人唤醒而永久处于“阻塞状态”,浪费系统资源。

五、进程的挂起与激活

挂起与激活是进程“静止”与“活动”的切换,用于满足用户调试、系统负荷调节等需求,使进程暂时脱离调度队列。

1. 引入挂起状态的原因

挂起操作将进程从“可调度状态”转为“静止状态”,核心目的包括:

  • 终端用户需求:用户调试程序时,暂停进程运行以查看中间结果;
  • 父进程请求:父进程暂停子进程,避免其干扰其他进程(如子进程异常时挂起排查);
  • 负荷调节:系统负载过高(如CPU利用率达100%)时,挂起部分非关键进程,释放资源;
  • 操作系统需求:系统进行内存对换时,将暂时不用的进程挂起并换出到外存,释放内存空间。

2. 进程的挂起(挂起原语Suspend执行流程)

挂起的核心是改变进程的“活动/静止”属性,不释放进程已占用的资源,步骤如下:

  1. 检查进程状态
    • 若进程处于“活动就绪”状态,将其改为“静止就绪”(暂不参与CPU调度);
    • 若进程处于“活动阻塞”状态,将其改为“静止阻塞”(即使等待事件发生,仍需激活后才能就绪);
    • 若进程处于“执行状态”,立即暂停其CPU执行,改为“静止就绪”,并触发重新调度。

3. 进程的激活(激活原语Active执行流程)

激活是挂起的逆操作,将进程从外存或静止队列恢复为可调度状态,步骤如下:

  1. 资源恢复(若需):若进程被挂起时换出到外存,先将其代码和数据调入内存。
  2. 检查进程状态
    • 若进程处于“静止就绪”状态,将其改为“活动就绪”,插入就绪队列;
    • 若进程处于“静止阻塞”状态,将其改为“活动阻塞”,插入对应阻塞队列(等待事件发生后可转为就绪)。

六、核心总结:进程控制的本质与关键逻辑

  1. 生命周期闭环:进程控制覆盖“创建→就绪→执行→阻塞→唤醒→终止”全流程,通过原语确保每个环节的原子性和一致性。
  2. 状态转换核心:所有控制操作围绕“进程状态变更”展开,核心状态转换路径为:
    创建→就绪→执行→(时间片完→就绪)/(等待事件→阻塞→唤醒→就绪)→终止
  3. 资源与调度分离:进程创建/终止负责“资源分配与回收”,阻塞/唤醒、挂起/激活负责“调度资格管理”,二者配合实现高效的多进程并发。

进程控制
https://hellowydwyd.github.io/2025/10/16/进程控制/
作者
YuDong Wang
发布于
2025年10月16日
许可协议