一、什么是进程?
进程的多种定义:
- 一个正在执行的程序。
- 一个正在计算机上执行的程序实例。
- 能分配给处理器并偶处理器执行的实体。
- 由一组命令、一个当前状态、一组相关系统资源表征的活动单元。
- 由一组 “元素” 组成的实体。
二、进程行为模型
进程行为模型用以描述进程所表现出的行为。
1、两态模型
操作系统控制进程的执行,包括确定交替执行方式、给进程分配资源,而我们需要描述进程所表现出的行为。
我们知道,进程要么正在执行、要么未执行,因而构建最简单的两状态模型,进程处于以下两种状态:运行态、非运行态。 操作系统创建进程时,该进程以未运行态加入,等待执行机会。时不时中断当前运行进程,分配器将选择一个新进程运行,前一个进程转换为未运行状态,后一个进程转换为运行状态。
① 进程创建
- 新的任务:任务运行开始
- 交互登录:终端用户登录
- 操作系统创建:操作系统创建进程,代表用户程序执行某些功能
- 现有进程派生:模块化设计,父进程派生子进程
② 进程终止
计算机系统提供表示进程完成的方法,通常批处理作业中包含Halt 指令产生一个中断,告诉操作系统进程已经完成。而对于交互式应用程序,何时终止取决于用户行为。在分时系统中,用户退出系统、关闭终端时,终止该用户的进程。
- 正常完成:任务运行结束
- 超过时限:运行时间超出限制
- 无可用内存:无法满足所需内存空间
- 超出范围:访问不存在的内存单元
- 保护错误:访问不允许使用的资源 / 访问访问方式不正确(向只读文件中写入)
- 算术错误:进行被禁止的运算(除0、大于可接纳数字)
- 时间超出:时间发生时间超过规定最大值
- I/O失败:输入输出错误(找不到文件、遇到磁盘坏区、从打印机中读)
- 无效指令:执行不存在的指令(转移到数据区企图执行数据)
- 特权指令:试图使用为操作系统保留的指令。
- 数据误用:错误类型 / 未初始化的数据
- 操作系统干涉:操作系统终止进程(出现死锁)
- 父进程终止:父进程终止,子进程可能会被自动终止
- 父进程请求:父进程拥有终止子进程的权利
2、五态模型
队列是 “先进先出(FIFO)” 表,对于可运行进程,处理器以一种轮转(round-robin) 方式操作(单纯按时间划分,出队列执行,时限到重新入队列,又称时分复用)。
这种简单的描述方式考虑不够全面:
- 忽略I/O阻塞、优先级等要素,故将非运行态划分为:就绪态(Ready)、阻塞态(Blocked)。
- 部分进程已创建控制块而未入内存,故引入:新建态(New)。
- 进程结束后,为便于操作系统回收、处理相关信息,故引入:退出态(Exit)。
进程状态 | 描述 |
---|
新建态 | 新创建进程,因进程控制块创建但未加载至内存,而未被加入可执行组 | 就绪态 | 进程做好准备,有机会就执行。 | 运行态 | 进程正在执行 | 阻塞态(等待态) | 进程因事件无法执行(如I/O操作) | 推出态 | 从可执行组释放:自身停止 / 被取消 |
状态转换:
状态转换 | 相关事件 |
---|
空 → 新建 | 创建一个执行程序的新进程 | 新建 → 就绪 | 表示操作系统准备好接纳新进程(基于当前进程数限制虚存, 防止性能下降) | 就绪 → 运行 | 调度器 / 分派器选择处于就绪态的新进程进入运行态 | 运行 → 退出 | 进程自身已完成 / 取消 | 运行→ 就绪 | ① 正在运行进程到达“允许不中断执行”的最大时间段 ② 高优先级进程B等待事件发生就绪 → 低优先级进程A被进程B抢占(preempted) 中断进入就绪态 | 运行 → 阻塞 | 进程请求必须等待事件,对操作系统的请求通常以系统服务调用 的形式发出。 | 阻塞 → 就绪 | 进程等待事件发生 | 就绪 → 退出 阻塞 → 退出 | ① 父进程可终止子进程 ② 父进程终止 → 子进程同时终止 |
就绪队列 & 阻塞队列:
3、七态模型
引入“交换”: 前面介绍了三个基本状态:就绪态 、运行态 、阻塞态 ,很多系统都围绕这三种状态具体构建。
但 I/0 活动原慢于CPU,使得后者大多数时间处于空闲状态,队列的改善也为完全解决此问题,可能出现内存中所有进程都在等待 I/0 的现象,所以出现了两种解决方法:
- 扩充内存: 容纳进程数更多,但带来两个问题:①内存大小增加过大价格随之增加。 ② 需求速度快于价格下降速度 。
- 交换: 将进程部分 / 全部转移到磁盘中,内存中不存在就绪进程,将被阻塞进程换出至磁盘中的
挂起队列(suspend queue) ,操作系统要么从挂起队列中取出一个进程,要么接受新进程放入内存运行,由于磁盘 I/0 速度很快 ,因此 交换 通常情况下会提升性能。
为更好的描述交换,进程行为模型必须增加一个状态:挂起态
- 当内存中所有进程处于阻塞态,可将一个进程置为挂起态,并调入另一个进程(内存空间的交换)。
由于将被阻塞的挂起进程取回内存没有意义,事件仍未发生,所以应考虑两个因素:
容纳 2 × 2组合所需的 4个状态:
进程状态 | 描述 |
---|
就绪态 | 进程在内存 可执行 | 阻塞态 | 进程在内存 等待事件 | 就绪 / 挂起态 | 进程在外存 只要载入内存就可执行 | 阻塞 / 挂起态 | 程在内存 等待事件 |
新增状态转换:
状态转换 | 相关事件 |
---|
阻塞 → 阻塞 / 挂起 | | 阻塞 / 挂起 → 就绪 / 挂起 | | 就绪 / 挂起 → 就绪 | | 就绪 → 就绪 / 挂起 | | 新建→ 就绪 / 挂起 新建→ 就绪 | | 阻塞 / 挂起 → 阻塞 | | 运行 → 就绪 / 挂起 | | 各种状态 → 退出 | |
挂起态进程特点:
- 不能立即执行
- 阻塞、挂起分离考虑(阻塞事件的发生不会立即换入内存)
- 为阻止进程运行,可通过代理(进程自身、操作系统)将其置于挂起态。
- 除非代理显式地命令状态转换,否则此状态无法转移。
进程挂起原因:
事件 | 说明 |
---|
交换 | 操作系统需要释放内存空间 | 其他OS原因 | 挂起后台进程、工具进程、可能导致问题的进程 | 交互式用户请求 | 用户请求,便于进行调试、关联资源使用 | 定时 | 周期性执行进程(记账、系统监视进程) | 父进程请求 | ① 父进程检查、修改被挂起进程 ② 父进程协调后台进程间的行为 |
三、进程描述
操作系统分派、调度进程,并为其分配资源,相应基本服务请求。要控制进程并管理资源,需要哪些信息?
1、操作系统控制结构
操作系统为管理进程、资源,掌握状态,构建并维护其每个管理实体的信息表,共有以下四种:
① 内存表(memory table)
跟踪内存(实存)、外存(虚存),内存部分为操作系统保留,其余部分供进程使用,包含信息如下:
- 分配给进程的内存、外存。
- 内存块、虚存块的任何保护属性(哪些进程访问某些共享内存区域)
- 管理虚存所需要的任何信息
② I/O 表(I/O table)
操作系统使用 I/0 表管理计算机中的 I/0 设备、通道,进行 I/0 操作时,操作系统知道 I/0 操作状态、I/0 传送的源头、目标内存单元。
③ 文件表(file table)
包含信息如下:
- 文件存在与否
- 文件在外存中的位置、当前状态、其他属性信息
④ 进程表(process table)
操作系统为方便管理进程,维护进程表。
这 4种表 可以某种方式链接 / 交叉使用,内存、I/0、文件代表进程被管理,所以进程表中有这些资源 直接 / 间接 的引用。
2、进程控制结构
操作系统管理进程需要获得的信息:进程位置、进程属性(进程ID、进程状态)
① 进程位置
进程映像: 程序、数据、栈、属性 的 集合
项目 | 说明 |
---|
用户程序 | 待执行的程序 | 用户数据 | 用户空间可修改部分(程序数据、用户栈区域、可修改的程序) | 栈 | 每个进程都有 一 / 多 个 (LIFO) 栈 用以保存参数、过程调用地址、系统调用地址 | 进程控制块 | 控制进程所需数据 |
② 进程属性
进程标识符(process identification)
为每个进程分配唯一的数字标识符,可以简单的标识为主进程表中的一个索引;否则必须有一个映射,方便定位相应的表。
处理器状态信息(processor statement information)
由处理器寄存器的内容组成,运行要给进程时,进程信息一定在寄存器中。中断进程时,必须保存该寄存器所有信息,以便进程恢复时可以恢复所有这些信息。
进程控制信息(process control information)
操作系统控制、协调各种活动线程的额外信息。
③ 进程控制块
进程控制块信息分为三类:
处理器状态信息 进程控制块中的经典元素:
标识符、用户可见状态寄存器、控制和状态寄存器、栈指针、调度和状态信息、数据结构、进程间通信、进程特权、存储管理、资源所有权及使用情况。
四、进程控制
1、执行模式
- 用户模式(非特权模式): 用户程序通常在该模式下运行
- 内核模式(特权模式、系统模式、控制模式): 操作系统的内核,包含重要系统功能的部分(程序状态字控制、原始 I/0 指令、内存管理、进程管理、中断处理、记账监视)
2、进程创建
进程创建步骤:
- 为新进程分配唯一进程标识符。
- 为进程分配空间。
- 初始化进程控制块。
- 设置正确链接。
- 创建 / 扩充其他数据结构。
3、进程切换
进程切换可在任何时刻发生,操作系统区分两种系统中断:中断、陷阱。 进程执行的中断机制:
机制 | 原因 | 用途 |
---|
中断 | 来自当前执行指令的外部 | 对异步外部事件的反应 | 陷阱 | 与当前执行指令相关 | 处理一个错误 / 异常条件 | 系统调用 | 显式请求 | 调用操作系统函数 |
普通中断(interrupt):
- 时钟中断: 当前执行进程达最大允许执行时间 [时间片],进程置为就绪态。
- I/O中断: 操作系统确认是否已发生 I/0 活动。并决定是否继续执行当前处于运行态的进程,还是让高优先级进程抢占该进程。
- 内存失效: 操作系统遇到引用不在内存的虚存地址,需将内存块从外存调入内存,调如内存 I/0 致使进程置于阻塞态,进程切换。
陷阱(trap):
操作系统确认 错误 / 异常 是否致命:
- 致命: 进程置为退出态,切换进程。
- 不致命: 尝试恢复程序,切换进程 / 继续当前进程。
系统调用(supervisor call):
如用户进程执行 I/0 请求指令,I/0 代码属于操作系统的一部分,此时用户进程转为阻塞态,进程切换。
|