0%

进程管理

进程管理:操作系统的核心调度与控制机制

进程是操作系统中最核心的概念之一,它是程序的动态执行过程,也是系统资源分配和调度的基本单位。进程管理通过对进程的创建、状态转换、同步、通信及死锁处理等机制的设计,实现了多程序并发执行,大幅提升了计算机系统的资源利用率。本文将系统解析进程管理的核心内容。

进程的基本概念与组成

进程的定义

进程是执行中的程序,是一个动态的概念。与静态的程序(存储在磁盘上的指令和数据)不同,进程具有生命周期,会经历创建、运行、暂停、终止等状态变化。

进程的组成

一个完整的进程由三部分构成:

  • 程序块:进程执行的指令集合(即程序本身)。
  • 数据块:程序运行时所需的数据(如变量、常量、输入输出数据)。
  • 进程控制块(PCB,Process Control Block):描述和控制进程运行的核心数据结构,是进程存在的唯一标识。

进程控制块(PCB):进程的 “身份证”

PCB 是操作系统管理进程的关键数据结构,常驻内存,记录了进程的全部状态信息。其主要字段包括:

字段 作用描述
标识符(PID) 唯一标识一个进程的数字编号(如 Linux 中的pid),用于进程间区分。
状态 记录进程当前的状态(如运行态、就绪态、阻塞态),是调度的重要依据。
优先级 决定进程获取 CPU 的优先顺序(数值越高,优先级越高)。
程序计数器(PC) 指向进程即将执行的下一条指令的地址,用于进程切换时恢复执行位置。
内存指针 包括程序代码的内存地址(代码段)、数据的内存地址(数据段)和堆栈地址。
上下文数据 进程执行时 CPU 寄存器中的数据(如累加器、通用寄存器值),用于进程切换时保存现场。
I/O 状态信息 记录进程打开的文件描述符、I/O 设备使用情况等。
记账信息 进程占用 CPU 的时间、内存使用量、磁盘 I/O 次数等统计数据,用于资源计费或性能分析。

示例:当进程被暂停时,操作系统会将其上下文数据存入 PCB;当进程恢复运行时,再从 PCB 中读取数据恢复到 CPU 寄存器,确保进程能继续执行。

进程与线程:资源与调度的最小单位

进程和线程是多任务并发的核心载体,二者既有联系又有区别:

核心区别

维度 进程(Process) 线程(Thread)
资源分配单位 系统进行资源分配的基本单位(拥有独立的内存、文件描述符等)。 操作系统调度的最小单位(不拥有独立资源,共享进程资源)。
上下文切换开销 大(需切换 PCB、内存映射等)。 小(只需切换线程上下文,共享进程资源)。
独立性 高(一个进程崩溃不影响其他进程)。 低(同一进程内线程共享资源,一个线程崩溃可能导致进程崩溃)。
通信方式 需通过进程间通信(IPC)机制(如管道、消息队列)。 可直接通过共享内存通信(如全局变量)。

线程的优势

在多任务场景中,线程比进程更轻量:

  • 创建速度快:无需分配独立内存,仅创建线程控制块(TCB)。
  • 切换效率高:上下文切换无需修改内存映射,开销仅为进程的 1/10~1/100。
  • 资源共享便捷:同一进程的线程共享代码段、数据段和文件资源,通信成本低。

示例:浏览器的多个标签页通常对应多个进程(相互隔离,一个崩溃不影响其他),而单个标签页内的渲染、网络请求等任务则由多个线程协作完成(共享页面资源)。

进程的状态模型与转换

进程在生命周期中会经历多种状态,最经典的是三态模型,扩展后还包括创建态、终止态等。

三态模型核心状态

  • 运行态(Running):进程正在 CPU 上执行(单 CPU 系统中,同一时刻只有一个进程处于此状态)。
  • 就绪态(Ready):进程已获得除 CPU 外的所有资源,等待调度器分配 CPU。
  • 阻塞态(Blocked/Waiting):进程因等待某一事件(如 I/O 完成、信号量释放)而暂停,即使分配 CPU 也无法执行。

状态转换规则

  • 就绪态 → 运行态:调度器选中该进程,分配 CPU(唯一能直接进入运行态的状态)。
  • 运行态 → 就绪态:
    • 时间片用完(如时间片轮转调度)。
    • 被高优先级进程抢占(抢占式调度)。
  • 运行态 → 阻塞态:进程请求资源(如读文件)或等待事件(如sleep()),主动放弃 CPU。
  • 阻塞态 → 就绪态:进程等待的事件完成(如 I/O 结束),重新具备运行条件,进入就绪队列等待调度。

示例:当你在编辑器中按下 “保存” 按钮时,进程从运行态转为阻塞态(等待磁盘写入完成);写入完成后,进程从阻塞态转为就绪态,等待 CPU 调度继续运行。

进程同步:解决并发冲突的机制

多个进程并发执行时,若共享资源(如打印机、共享变量),可能因操作顺序不当导致数据不一致(如 “丢失更新”)。进程同步的目标是协调进程执行顺序,确保资源使用的安全性。

同步机制的四大原则

  • 空闲让进:当资源空闲时,允许等待的进程立即使用。
  • 忙则等待:当资源被占用时,其他进程必须等待,不能强行占用。
  • 有限等待:进程等待资源的时间必须有限(避免 “饿死”)。
  • 让权等待:进程等待时需释放 CPU(避免 “忙等”,提高 CPU 利用率)。

经典同步工具:信号量与 PV 操作

信号量(Semaphore)是一种特殊变量,用于表示资源的可用数量,通过 PV 操作实现同步与互斥:

  • P 操作(Proberen,测试):请求资源
    S = S - 1
    S ≥ 0:进程获得资源,继续执行。
    S < 0:进程阻塞,加入等待队列。
  • V 操作(Verhogen,增加):释放资源
    S = S + 1
    S > 0:资源仍有剩余,无进程等待。
    S ≤ 0:唤醒等待队列中的一个进程,使其获得资源。
(1)互斥模型(解决资源独占问题)

当资源只能被一个进程使用时(如打印机),信号量S初始值为 1:

  • 进程使用资源前执行P(S)(申请),使用后执行V(S)(释放)。

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    semaphore S = 1; // 初始化信号量,表示1个资源
    process P1() {
    P(S); // 申请打印机
    使用打印机;
    V(S); // 释放打印机
    }
    process P2() {
    P(S); // 若P1未释放,P2会阻塞
    使用打印机;
    V(S);
    }
(2)同步模型(解决执行顺序问题)

当进程需按特定顺序执行时(如 A 完成后才能执行 B),信号量S初始值为 0:

  • 前驱进程执行完后执行V(S),后继进程开始前执行P(S)

  • 示例(A→B):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    semaphore S = 0; // 初始无资源
    process A() {
    执行操作;
    V(S); // A完成,释放信号量
    }
    process B() {
    P(S); // 等待A完成(S=0时阻塞,A执行V后S=1,B继续)
    执行操作;
    }
(3)前趋图(描述同步关系)

前趋图是一种有向无环图(DAG),用于表示进程间的执行顺序:

  • 节点表示进程或操作,有向边X→Y表示 “X 完成后 Y 才能开始”。

  • 示例:若前趋图为X→Y→Z,则需设置两个信号量S1和S2

    (初始值 0):

    • X 执行完V(S1),Y 开始前P(S1)
    • Y 执行完V(S2),Z 开始前P(S2)

可以通过前趋图来推出来PV操作

该对应的PV操作如下

死锁:进程间的无限等待

死锁是多进程并发时的经典问题,指两个或多个进程互相等待对方占用的资源,导致所有进程无法继续执行。

死锁产生的四大必要条件

  • 互斥条件:资源只能被一个进程占用(如打印机)。
  • 持有并等待:进程持有部分资源,同时等待其他资源。
  • 不剥夺条件:已分配的资源不能被强制收回。
  • 环路等待:多个进程形成资源请求循环链(如 P1 等待 P2 的资源,P2 等待 P1 的资源)。

示例

  • 进程 P1 占用打印机,请求扫描仪;
  • 进程 P2 占用扫描仪,请求打印机;
  • 两者形成环路等待,导致死锁。

进程资源图:死锁检测的可视化工具

进程资源图(Process-Resource Graph)是描述进程与资源关系的有向图,可直观判断系统是否存在死锁。

组成元素
  • 进程节点:用圆圈表示,标注进程名称(如P1)。
  • 资源节点:用方框表示资源类型,方框内的小圆圈数量表示该资源的实例数(如R1方框内有 2 个小圆圈,表示R1有 2 个实例)。
  • 有向边:
    • 申请边:进程→资源(如P1→R2,表示 P1 申请 R2)。
    • 分配边:资源→进程(如R1→P1,表示 R1 的一个实例已分配给 P1)。
通过资源图化简判断死锁

资源图的可化简性是死锁的判断依据,化简步骤如下:

  1. 寻找非阻塞进程:进程申请的资源均可被满足(即申请边对应的资源有空闲实例),该进程可执行至完成。
  2. 化简进程:假设非阻塞进程完成,释放其占有的所有资源(移除分配边和申请边,删除进程节点)。
  3. 重复化简:若所有进程节点都被移除(完全化简),则无死锁;若剩余进程无法化简(形成循环等待),则存在死锁。

示例

  • 资源图中P1→R2(申请)、R2→P2(分配)、P2→R1(申请)、R1→P1(分配),且R1R2均只有 1 个实例。
  • 化简时无任何非阻塞进程(P1 和 P2 的申请均无法满足),剩余进程形成环路,故存在死锁。

死锁的处理策略

策略 核心思想 示例方法
预防死锁 破坏四大条件中的至少一个。 按序分配资源(破坏环路等待);允许资源剥夺(破坏不剥夺条件)。
避免死锁 动态检测资源分配状态,确保系统处于 “安全状态”(即存在一个序列使所有进程能完成)。 银行家算法(模拟资源分配,判断是否会进入不安全状态)。
检测与解除 允许死锁发生,通过算法检测死锁,再手工或自动解除。 资源分配图化简法(检测死锁);撤销进程、剥夺资源(解除死锁)。

银行家算法:类似银行贷款,每次分配资源前计算 “最大需求”“已分配” 和 “剩余资源”,确保分配后仍有足够资源让部分进程完成,避免死锁。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10