【复习408】操作系统进程描述与控制详解
文章目录
- 一、进程的基本概念
- 1.1 进程定义
- 1.2 进程与程序的区别
- 二、进程的描述:进程控制块(PCB)
- 2.1 PCB的概念与作用
- 2.2 PCB的主要内容
- 三、进程状态与转换
- 3.1 基本状态模型
- 3.1.1 三态模型
- 3.1.2 五态模型
- 3.1.3 七态模型
- 3.2 状态转换图
- 四、进程控制操作
- 4.1 进程创建与终止
- 4.1.1 fork()系统调用
- 4.1.2 exec()系列系统调用
- 4.1.3 wait()和waitpid()系统调用
- 4.1.4 exit()和\_exit()系统调用
- 五、进程调度
- 5.1 调度的基本概念
- 5.2 常见调度算法
- 5.2.1 先来先服务(FCFS)
- 5.2.2 短任务优先(SJF)
- 5.2.3 时间片轮转(RR)
- 5.2.4 多级反馈队列调度(MLFQ)
- 5.3 Linux调度策略
- 六、进程间通信(IPC)
- 6.1 IPC的基本概念
- 6.2 主要IPC机制
- 七、进程同步
- 7.1 同步的基本概念
- 7.2 信号量机制
- 7.2.1 PV操作
- 7.2.2 信号量类型
- 7.3 经典同步问题
- 八、进程死锁
- 8.1 死锁的基本概念
- 8.2 死锁的四个必要条件
- 8.3 死锁处理策略
- 8.3.1 预防死锁
- 8.3.2 避免死锁
- 8.3.3 检测和解除死锁
- 8.4 死锁检测算法
- 总结
一、进程的基本概念
1.1 进程定义
进程是程序在数据集上的一次执行过程,是操作系统进行资源分配和调度的最小单位。它包含了程序代码、相关数据以及内核为该进程分配的资源信息。每个进程都有自己的地址空间、内存空间和资源,具有动态性和并发性特点。
1.2 进程与程序的区别
- 程序:静态概念,是一系列指令的集合,存储在外部介质上
- 进程:动态概念,是程序的执行过程,具有生命周期,包括创建、执行和终止
二、进程的描述:进程控制块(PCB)
2.1 PCB的概念与作用
进程控制块(Process Control Block, PCB),又称进程描述符,是操作系统内核用于记录进程相关信息的关键数据结构。每个进程都有一个唯一的PCB,操作系统通过PCB来管理和控制进程。
在Linux系统中,PCB通过task_struct结构体实现,包含了描述进程状态的全部信息。
2.2 PCB的主要内容
PCB包含但不仅限于以下信息:
| 类别 | 内容描述 | 具体信息 |
|---|---|---|
| 进程标识符 | 唯一标识进程 | PID、PPID(父进程ID) |
| 处理器状态 | CPU上下文 | 寄存器集合、程序计数器PC |
| 调度信息 | 调度相关的参数 | 优先级、时间片、调度策略 |
| 资源信息 | 分配的资源 | 内存、文件描述符、信号量 |
| 状态信息 | 当前进程状态 | 就绪、运行、阻塞等 |
| 链接信息 | 队列指针 | 同步和通信机制指针 |
三、进程状态与转换
3.1 基本状态模型
3.1.1 三态模型
| 状态 | 描述 | 转换条件 |
|---|---|---|
| 运行态(Running) | 进程正在CPU上执行 | 时间片用完 → 就绪态等待资源 → 阻塞态 |
| 就绪态(Ready) | 进程具备运行条件,等待分配CPU | CPU空闲 → 运行态 |
| 阻塞态(Blocked/Waiting) | 进程等待某个事件发生 | 事件发生 → 就绪态 |
3.1.2 五态模型
在三态模型基础上增加了新建态和终止态:
| 状态 | 描述 |
|---|---|
| 新建态(New) | 进程刚被创建,尚未进入就绪队列 |
| 终止态(Terminated) | 进程完成任务或异常终止,等待被清除 |
3.1.3 七态模型
在五态模型基础上增加了挂起就绪态和挂起阻塞态,用于内存不足时的内存管理:
| 状态 | 描述 |
|---|---|
| 挂起就绪态(Ready Suspended) | 进程在外存中,具备运行条件 |
| 挂起阻塞态(Blocked Suspended) | 进程在外存中,正在等待某事件 |
3.2 状态转换图
新建态 → 就绪态 → 运行态 → {终止态或阻塞态}↗ ↕{时间片用完、更高优先级进程到达}
四、进程控制操作
4.1 进程创建与终止
4.1.1 fork()系统调用
fork()是用于创建新进程的系统调用,其定义在<unistd.h>头文件中:
pid_t fork(void);
- 返回值:
- 在父进程中返回子进程的PID
- 在子进程中返回0
- 失败时返回-1
fork()创建的子进程是父进程的几乎完全复制,包括:
- 栈、数据段、堆和执行文本段的拷贝
- 相同的程序计数器PC和寄存器集合
- 相同的虚拟地址空间映射
- 复制的文件描述符和信号处理动作
4.1.2 exec()系列系统调用
exec()用于加载并运行新程序,取代原调用进程的数据段、代码段和堆栈段:
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg, ..., char *const envp[]);
4.1.3 wait()和waitpid()系统调用
wait()让父进程等待子进程结束,获取子进程的退出状态:
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
4.1.4 exit()和_exit()系统调用
exit()用于终止当前进程,释放占用的资源:
void exit(int status);
void _exit(int status);
五、进程调度
5.1 调度的基本概念
进程调度是操作系统的核心功能之一,决定了进程如何以及何时获得CPU资源。调度目标是在公平性、响应时间和吞吐量之间取得平衡。
5.2 常见调度算法
5.2.1 先来先服务(FCFS)
按照进程到达就绪队列的顺序调度,实现简单但可能效率不高。
5.2.2 短任务优先(SJF)
优先调度预计执行时间短的进程,可降低平均等待时间。
5.2.3 时间片轮转(RR)
给每个进程分配一个时间片,轮流执行。时间片过小增加上下文切换开销,时间片过大则退化为FCFS调度。
5.2.4 多级反馈队列调度(MLFQ)
最复杂也是最灵活的调度算法,结合了多种算法的优点。包含多个优先级不同的就绪队列,每个队列采用不同的时间片。进程在队列间动态移动,以平衡不同类型的进程需求。
5.3 Linux调度策略
Linux使用CFS(完全公平调度器),目标是提供公平的CPU分配,确保所有可运行进程获得近似相等的CPU时间。
六、进程间通信(IPC)
6.1 IPC的基本概念
进程间通信机制允许不同进程之间交换信息和协同工作。不同IPC机制在效率、功能和适用场景上各有特点。
6.2 主要IPC机制
| IPC机制 | 特点 | 适用场景 |
|---|---|---|
| 管道(Pipe) | 单向通信,只能在有亲缘关系的进程间使用 | 简单数据传输 |
| 命名管道(Named Pipe) | 允许无亲缘关系的进程通信 | 文件系统命名的进程间通信 |
| 消息队列(Message Queue) | 交换结构化消息,大小有限制 | 需要消息队列的场景 |
| 共享内存(Shared Memory) | 最快捷的通信方式,多个进程访问同一块内存区域 | 高效数据交换 |
| 信号量(Semaphore) | 用于同步和互斥的计数器,配合PV操作使用 | 进程同步和互斥控制 |
| 套接字(Socket) | 可用于同一台机器上进程间的通信,也可用于网络进程间通信 | 网络通信和本地通信 |
七、进程同步
7.1 同步的基本概念
进程同步机制用于协调相关进程的执行顺序,确保它们按照正确的顺序访问共享资源。
7.2 信号量机制
信号量是解决进程同步与互斥的核心机制,通过P、V操作控制资源访问。
7.2.1 PV操作
PV操作由两个不可中断的原语组成:
P(S): S = S - 1if (S < 0) 阻塞进程,等待信号量V(S):S = S + 1if (S <= 0) 唤醒等待信号量的进程
7.2.2 信号量类型
| 信号量类型 | 描述 | 应用场景 |
|---|---|---|
| 互斥信号量 | 用于进程互斥访问临界资源 | 互斥控制 |
| 同步信号量 | 用于进程同步 | 进程同步 |
7.3 经典同步问题
经典的生产者-消费者问题、读者-写者问题等都可以通过信号量机制得到有效解决。
八、进程死锁
8.1 死锁的基本概念
死锁是指多个进程因竞争资源而造成互相等待的现象,每个进程都在等待某个被其他进程占有的资源[83†]。
8.2 死锁的四个必要条件
| 条件 | 描述 | 说明 |
|---|---|---|
| 互斥条件 | 只有互斥使用的资源才会导致死锁 | 资源不能共享 |
| 持有并等待条件 | 进程持有资源的同时等待其他资源 | 不释放已占用资源 |
| 不可剥夺条件 | 资源不能从进程处强行剥夺 | 资源只能由进程主动释放 |
| 环路等待条件 | 进程间形成循环等待资源的环路 | 资源循环等待 |
8.3 死锁处理策略
8.3.1 预防死锁
通过破坏产生死锁的必要条件来预防死锁:
- 禁止进程持有资源的同时请求其他资源
- 允许强制剥夺进程占有的资源
- 建立资源分级使用规则
8.3.2 避免死锁
系统对进程发出的资源申请进行动态检查,预测资源分配后的安全性,如果安全则分配资源。
8.3.3 检测和解除死锁
定期检测系统状态,使用算法(如银行家算法)发现死锁并终止部分进程以解除死锁。
8.4 死锁检测算法
常见的死锁检测算法包括资源分配图法和深度优先搜索法,通过检测资源分配图中是否存在环路来判断系统中是否存在死锁。
总结
进程的描述与控制是操作系统的核心功能之一,涉及进程的基本概念、进程控制块、进程状态转换、进程控制操作、进程调度、进程间通信、进程同步以及进程死锁等多个方面。深入理解这些概念和机制,有助于更好地设计和优化多进程应用程序,提高系统的性能和可靠性。
