一、进程与线程

1. 核心定义

  • 进程:操作系统资源分配的最小单位,拥有独立内存空间、文件资源,是资源调度的基本单元。进程的组成:进程控制块PCB(唯一标志)、程序(描述进程要做什么)、数据(存放进程执行时所需数据)

  • 线程:操作系统CPU调度与执行的最小单位,无独立资源,共享所属进程全部资源,切换开销极低。

简单总结:进程管资源,线程管执行。

2. 进程与线程完整对比

对比维度

进程(Process)

线程(Thread)

资源归属

独立内存、独立文件句柄、独占系统资源

共享进程资源,无独立地址空间

切换开销

大(需刷新页表、上下文、缓存)

极小(仅切换栈与寄存器)

通信方式

IPC通信(管道、消息队列、共享内存、信号量)

直接读写共享变量,无需复杂通信机制

容错性

进程崩溃相互隔离,不影响其他进程

单线程异常崩溃,整个进程直接终止

创建销毁

成本高、速度慢

成本低、速度快,支持高并发

3. 共享与非共享资源

  • 同一进程线程共享:代码段、全局变量、打开的文件、进程ID、工作目录、定时器

  • 线程私有不共享:线程栈、局部变量、寄存器、线程优先级、栈指针


二、进程状态图(三态+五态模型)

1. 进程三态基础模型

三种状态定义

  • 就绪态:资源全部就绪,仅等待CPU调度

  • 运行态:占用CPU,正在执行代码指令

  • 阻塞态(等待态):等待IO、资源、信号,主动放弃CPU

标准流转图

就绪态 ——(CPU调度选中)——> 运行态 运行态 ——(时间片用完/被抢占)——> 就绪态 运行态 ——(等待IO/资源)——> 阻塞态 阻塞态 ——(事件完成/资源就绪)——> 就绪态

三态绝对禁忌

  • ❌ 阻塞态 → 运行态(必须先转为就绪态排队)

  • ❌ 就绪态 → 阻塞态(未运行进程不会主动等待资源)

2. 进程五态进阶模型(含挂起|难点)

三态模型无法解决内存不足问题,五态模型新增挂起机制(中级内存调度),将闲置进程换出至外存,释放内存资源。

五大状态

就绪、运行、阻塞、就绪挂起(静止就绪)阻塞挂起(静止阻塞)

五态完整流转图

// 内存常规流转 就绪态 ——(调度选中)——> 运行态 运行态 ——(时间片到)——> 就绪态 运行态 ——(IO等待)——> 阻塞态 阻塞态 ——(事件完成)——> 就绪态 // 内存紧张:进程换出外存(挂起) 就绪态 ——(内存不足)——> 就绪挂起 阻塞态 ——(内存不足)——> 阻塞挂起 // 内存充足:进程调入内存(激活) 就绪挂起 ——(内存空闲)——> 就绪态 // 唯一特殊跨态转换 阻塞挂起 ——(事件在外存完成)——> 就绪挂起

  • 就绪挂起:进程具备运行条件,驻留外存,缺内存资源

  • 阻塞挂起:进程等待事件,同时驻留外存

  • 所有挂起态进程无法直接进入运行态

  • 特殊转换:阻塞挂起 → 就绪挂起(无需调入内存,事件直接完成)


三、进程资源图

1.什么是进程资源图

进程资源图是用于直观表示进程与资源之间分配、请求关系的图形工具,是操作系统死锁章节必考内容,可快速判断系统是否发生死锁。

图形符号规范:

  • 圆形:代表进程 P图中 P1、P2、P3 均为进程节点。
  • 矩形:代表资源 R矩形内部圆球数量 = 该类资源总数量

    • 示例:R1 框内 2 个圆球 → 系统共有 2 个 R1 资源;

    • R2 框内 3 个圆球 → 系统共有 3 个 R2 资源。

  • 资源→进程 的箭头(分配边)含义:该资源已分配给对应进程。例:R1 指向 P1 = 1 份 R1 资源分配给 P1。

  • 进程→资源 的箭头(请求边)含义:该进程还需要申请一份对应资源才能继续执行。例:P1 指向 R2 = P1 需要请求 1 个 R2 资源。

2.阻塞节点判断

  • 阻塞节点定义:进程当前申请的资源已全部分配完毕、无剩余可用资源,进程无法拿到资源,进入阻塞等待状态。文中示例:P2 为阻塞节点。
  • 非阻塞节点:进程申请的资源仍有剩余空闲资源,系统可分配资源,进程能继续运行。文中示例:P1、P3 为非阻塞节点。

四、信号量

P操作:申请资源,S=S-1,若S>=0,则执行P操作的进程继续执行;若S<0,则置该进程为阻塞状态( 因为无可用资源),并将其插入阻塞队列。

V操作:释放资源,S=S+1,若S>0,代表此时资源有空余,没有阻塞的进程,则该进程继续执行;若 S<=0,代表此时线程在被阻塞,所以需要从阻塞状态唤醒一个进程,并将其插入就绪队列(此时因为缺 少资源被P操作阻塞的进程可以继续执行),然后执行V操作的进程继续。

五、前驱图

前趋图:用来表示哪些任务可以并行执行,哪些任务之间有顺序关系,具体如下图:

图中,ABC可以并行执行,但是必须ABC都执行完后,才能执行D,这就确定了两点:任务间的并行、任务间的先后顺序。

六、进程三级调度与调度算法

1. 三级调度体系

  • 高级调度(作业调度):外存作业调入内存,仅批处理系统存在,调度频率最低

  • 中级调度(内存调度):负责进程挂起/激活,内外存置换,缓解内存压力

  • 低级调度(进程调度):分配CPU资源,调度频率最高、最核心

2. 四大经典调度算法(优劣对比)

调度算法

核心特点

优点

缺点

适用场景

FCFS先来先服务

按到达顺序依次执行

公平简单、无饥饿

短作业等待久、吞吐量低

批处理系统

SJF短作业优先

优先执行运行时间短的进程

吞吐量高、资源利用率高

长作业饥饿、无法预知时长

后台批处理

RR时间片轮转

固定时间片轮换占用CPU

响应快、多用户公平

时间片过小开销大

分时操作系统

优先级调度

高优先级进程优先抢占CPU

关键任务优先、响应及时

低优先级进程易饥饿

实时操作系统


七、进程同步与互斥

1. 同步与互斥定义

  • 互斥:多个进程不能同时访问临界资源,排他性访问(如打印机、共享变量)

  • 同步:多个进程按固定先后顺序协同执行,存在执行时序约束

2. 信号量初值规则

  • 互斥信号量:初值固定为1,保证临界资源唯一访问

  • 同步信号量:初值为初始可用资源数量,用于控制进程执行顺序


八、死锁原理与银行家算法(案例题重难点)

1. 死锁定义

多个并发进程互相持有对方所需资源,互相无限等待,所有进程无法推进,陷入永久阻塞状态。

2. 死锁四大必要条件(Coffman条件,必须同时满足)

  • 互斥条件:资源独占访问,不可共享

  • 持有并等待:进程已持有资源,同时等待其他资源

  • 不可剥夺:资源只能主动释放,无法强制抢占

  • 环路等待:进程资源依赖形成闭环链路

💡 核心结论:产生死锁必须同时满足四条件;预防死锁只需破坏任意一个条件

3. 死锁四种处理策略

  • 预防死锁:事前破坏四大条件之一,开销大、资源利用率低

  • 避免死锁:事前动态预判安全序列,经典算法:银行家算法

  • 检测与解除死锁:事后检测,通过撤销进程、剥夺资源解除死锁

  • 忽略死锁:默认死锁概率极低,家用系统主流方案

4. 银行家算法核心逻辑(软考案例必考)

核心作用:动态分配资源,预判系统是否存在安全序列,避免死锁发生

执行步骤
  1. 计算每个进程剩余资源最大需求(Max - Allocation)

  2. 判断当前系统剩余资源 Available 是否满足进程剩余需求

  3. 满足则分配资源,执行完成后回收进程全部资源

  4. 遍历所有进程,若能全部执行完毕,系统为安全状态,无死锁风险


九、高频易错总结

  1. 进程是资源分配单位,线程是CPU调度单位,二者不可混淆。

  2. 三态转换无:就绪→阻塞、阻塞→运行,考试高频纠错点。

  3. 分时系统靠时间片轮转,实时系统靠优先级抢占调度。

  4. 互斥信号量初值为1,同步信号量初值为资源数。

  5. 银行家算法是避免死锁,不是预防死锁。

  6. 死锁四条件同时成立才会死锁,破坏任意一条即可预防。

  7. 单CPU系统微观串行,任一时刻最多只有一个进程处于运行态。

下期预告:系统架构师备考:操作系统基础 | 存储管理

系统架构师备考:操作系统基础 | 存储管理

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐