# 进程的概念与特征
# 程序的顺序执行与并发执行
# 程序的顺序执行
- 定义: 系统中只有一个程序在运行,该程序独占所有系统资源。
- 特点:
- 顺序性: 程序必须在前一个程序执行完成后才能开始执行。
- 封闭性: 程序独占资源,计算机状态完全由其控制逻辑决定。
- 可再现性: 初始条件相同,执行结果也相同。
# 程序的并发执行
- 定义: 在一定时间内,系统中有两个或两个以上程序都处于开始运行但尚未结束的状态,并且它们的执行次序不是事先确定的。
- 目的: 提高资源利用率,是目前主流操作系统的执行方式。
- 特点:
- 间断性(异步性): 程序“走走停停”,执行时序关系不再固定。
- 失去封闭性: 程序共享资源,受其他程序控制逻辑的影响。
- 失去可再现性: 由于共享资源和外界环境变化,两次执行的推进时序可能不同,导致结果无法重复。
- 并发执行引发的问题:
- 同步: 需要协调程序的执行顺序。
- 互斥: 多个程序共享资源,可能相互影响。
- 调度: 包括作业调度(选择进入内存的程序)和进程调度(选择哪个程序占用 CPU)。
- 内存管理: 如何高效分配内存。
# 进程的定义与特征
-
定义: 进程是具有独立功能的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。有时也称为任务(Task)。
-
引入目的: 跟踪与描述程序的并发执行。
-
特征:
- 动态性: 进程是动态产生和消亡的,在其生命周期内不断转换状态。
- 独立性: 进程是独立的资源分配单位,拥有独立的地址空间。
- 并发性: 任何进程都可以与其他进程一起向前推进。
- 异步性: 每个进程以相对独立、不可预知的速度推进。
- 交互性: 进程在执行过程中可能与其他进程产生直接或间接关系。
- 结构化: 进程由程序、数据和**进程控制块(PCB)**三部分组成。
-
进程与程序的区别:
- 动静: 进程是动态的,程序是静态的代码集合。
- 时效: 进程是暂时的生命周期,程序是长久的文件。
- 组成: 进程由程序、数据和 PCB 构成,程序仅是代码。
- 对应关系: 一个程序可对应多个进程;一个进程可包括多个程序。
# 进程映像与上下文
# 进程映像
- 定义: 描述一个正在运行的程序在内存中的整体布局和内容。
- 组成:
- 用户程序(代码)
- 用户数据
- 堆(Heap): 用于动态内存分配。
- 栈(Stack): 用于过程调用和参数传递。
- 进程控制块(PCB): 用户程序不能直接访问和修改。

# 进程上下文
- 定义: 描述进程执行过程,由用户地址空间内容、硬件寄存器内容及相关核心数据结构组成。
- 组成:
- 用户级上下文: 进程的用户地址空间,包括正文段、数据段和用户栈。
- 寄存器级上下文: 程序计数器、状态寄存器、栈指针和通用寄存器等的值。
- 系统级上下文: PCB 和资源表格,以及核心栈。
# 进程控制块(PCB)
-
定义: 操作系统用于管理进程的专用数据结构,记录进程的外部特征,描述其运动变化过程。
-
作用: PCB 是系统感知进程存在的唯一标志,进程与 PCB 是一一对应的。
-
内容:
- 进程描述信息: 进程标识符(ID)、进程名、用户标识符(ID)、进程组等。
- 进程控制信息: 当前状态、优先级、代码执行入口地址、运行统计信息、进程间同步与通信信息、阻塞原因等。
- 资源占用信息: 虚拟地址空间的现状、打开文件列表等。
- CPU 现场信息: 寄存器值(通用、PC、PSW)、指向段/页表的指针等。
-
PCB 表的组织形式:
- 定义: 系统将所有 PCB 组织在一起,构成 PCB 表或进程表。其大小决定了系统最多可同时存在的进程数(并发度)。
- 链接结构: 将同一状态的 PCB 组织成链表,不同状态对应不同的链表(如就绪链表、阻塞链表)。

- 索引结构: 将同一状态的进程归入一个索引表,由索引指向 PCB,不同状态对应不同的索引表。

# 操作系统内核与进程的关系
- OS 内核: 不是一个进程,其执行不受调度。
- OS 与进程的关系:
- 传统方法: OS 不作为进程地址空间的一部分。
- 早期 UNIX: OS 作为进程地址空间的一部分。
- Windows、Linux: OS 功能分为核心和系统服务进程,只有 OS 核心作为进程地址空间的一部分。
# 进程的状态与转换
# 进程的三种基本状态
- 运行态(Running): 进程占有 CPU 并在其上运行。
- 就绪态(Ready): 进程已具备运行条件但暂时无 CPU 可用,一旦获得 CPU 即可运行。
- 阻塞态(Blocked): 进程等待某种事件发生而不能运行,即使 CPU 空闲也无法运行。
# 进程状态转换
- 转换图:

- 转换条件:
- 运行 → 阻塞: 等待资源、I/O 操作、其他进程的输入等。
- 运行 → 就绪: 时间片用完或被高优先级进程抢占。
- 就绪 → 运行: 调度程序选择该进程运行。
- 阻塞 → 就绪: 等待的事件发生。
# 五状态进程模型
-
新增状态:
- 新建状态(New): 已完成创建进程的必要工作,但尚未获得执行许可(资源有限)。
- 终止状态(Terminated): 进程撤销后进入此状态,不再有执行资格,但其信息(如资源使用情况)暂时保留。
-
转换图:

# 七状态进程模型
-
新增状态:
- 挂起状态(Suspended): 进程暂时被淘汰出内存的状态(换出状态)。
- 阻塞挂起状态(Suspended and Blocked): 进程在外存并等待某事件。
- 就绪挂起状态(Suspended and Ready): 进程在外存,但一旦进入内存即可运行。
-
引入原因:
- 用户请求: 暂停进程以进行调试。
- 负载调节: 为高优先级实时任务腾出内存。
- 定时任务: 周期性任务执行完毕后挂起以节省内存。
-
转换过程:
- 挂起(Suspend): 将进程从内存转到外存。
- 阻塞 → 阻塞挂起: 内存不足以运行新进程或就绪进程。
- 就绪 → 就绪挂起: 存在高优先级阻塞进程,需挂起低优先级就绪进程。
- 运行 → 就绪挂起: 高优先级阻塞挂起进程因事件发生进入就绪挂起,系统抢占运行进程。
- 激活(Activate): 将进程从外存转到内存。
- 就绪挂起 → 就绪: 没有就绪进程,或挂起就绪进程优先级更高。
- 阻塞挂起 → 阻塞: 内存充足后,系统将高优先级阻塞挂起进程激活。
- 挂起(Suspend): 将进程从内存转到外存。
-
转换图:

# 进程控制
# 进程控制的功能与原语
- 功能: 操作系统通过具有特定功能的程序段(原语)来创建、撤销进程以及完成进程状态转换,从而实现进程的高效并发执行和资源共享。
- 原语(Primitive): 由若干条指令构成的原子操作过程,不可分割。许多系统调用是原语。
# 常用进程控制原语
# 创建原语
- 原因: 系统初始化、执行创建进程的系统调用、用户请求、批处理作业初始化等。
- 过程: 主要任务是为新进程建立 PCB,并填入相关信息。

# 撤销原语
- 原因: 正常退出、出错退出、严重错误、被其他进程杀死等。
- 过程: 进程终止后,系统及时回收其占用的资源。

# 阻塞原语
- 作用: 实现进程从运行状态到阻塞状态的转换。

# 唤醒原语
- 作用: 实现进程从阻塞状态到就绪状态的转换。

# 挂起原语
- 作用: 实现进程从就绪/阻塞状态到就绪挂起/阻塞挂起状态的转换。

# 激活原语
- 作用: 实现进程从就绪挂起/阻塞挂起状态到就绪/阻塞状态的转换。
