第二章:进程管理
1、进程的基本概念
-
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed )。
-
广义定义:进程(Process)是计算机中程序的一次运行过程,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
程序是一个没有生命的实体,只有当CPU执行程序时,我们称其为进程。
一个任务的一次执行对应一个进程;
系统资源以进程为单位分配,如内存、文件、...,每个都具有独立的地址空间
进程是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念。
操作系统引入进程的概念的原因:
- 从理论角度看,是对正在运行的程序过程的抽象;
- 从实现角度看,是一种数据结构;
- 将一个CPU 变换成多个虚拟的 CPU
进程的组成部分:程序段、数据段、PCB。
进程控制块 PCB(Process Control Block)
- PCB 是操作系统用于管理进程的一个专门的数据结构,可以控制进程
- 记录进程的各种属性,描述进程的动态变化过程
- 主要表示进程的状态
- PCB(进程控制块)是系统感知进程存在的唯一标志。
- 进程与PCB是一一对应的
进程表:所有进程的PCB的集合
并发:在一段时间间隔内,程序被CPU交替执行完成。
并行:在同一时刻,程序同时执行
PCB它使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位或一个能与其他进程并发执行的进程。
进程和程序的区别
程序 | 进程 | |
---|---|---|
概念 | 静态 | 动态 |
所在存储器 | 外存 | 内存 |
组成 | 指令和数据的有序集合 | 程序段、数据段、PCB |
存在时间 | 永久 | 有生命期、暂时 |
对应关系 | 一个程序可对于多个进程(多次执行) | 一个进程可对应多个程序(调用关系) |
进程的分类:
- 系统进程和用户进程
- 前台进程和后台进程
- CPU繁忙型进程和 I/O繁忙型进程
创建一个进程所必须的步骤:
- 建立一个PCB
- 为进程分配内存等必要的资源
- 将PCB链入进程就绪队列
2、进程状态及状态装换
2.1、PCB的组成
分为四部分:进程控制信息、进程描述信息、所拥有的资源和使用情况、CPU现场信息。
每一部分详细包含哪些:
进程控制信息
- 当前状态
- 优先级(priority)
- 代码执行入口地址
- 程序的磁盘地址
- 运行统计信息(执行时间、页面调度)
- 进程间同步和通信
- 进程的队列指针
- 进程的消息队列指针
进程描述信息
- 进程标识符(process ID),唯一,通常是一个整数
- 进程名,通常基于可执行文件名,不唯一
- 用户标识符(user ID)
- 进程组关系
所拥有的资源和使用情况
- 虚拟地址空间的状况
- 打开文件列表
CPU现场信息:指进程不运行时,操作系统要保存的硬件的执行状态
- 寄存器值(通用寄存器、程序计数器PC、程序状态字PSW、栈指针)
- 指向该进程页表的指针
注意事项:
- PCB 只是一个通用的名字,它表示这个数据结构的特征。
- 在不同的操作系统中名称不同,例如:
- 在Linux中,是:task_struct
- 在Windows中,是:EPROCESS、KPROCESS、PEB
- PCB的内容和大小随系统不同而异,它不仅和具体系统的管理及控制方法有关,也和系统的规模大小有关。
2.2、进程状态的转换
从上图中可以看出,就绪和执行可以相互转换,而从执行 --> 阻塞 --> 就绪
是单向的。
进程之间的状态转换是相互影响的。
2.3、进程的五状态
进程的五状态分别是:新建、就绪、执行、阻塞、终止。
就绪、执行、阻塞上述已说明,此外还有:新建和终止。
进程的五种状态之间的关系:
此外,进程还有一种挂起状态:
3、进程的互斥与同步的关系
临界资源:在一段时间内,只允许一个进程访问的资源。
临界区:进程中用于实现进程互斥、访问临界资源的代码。
为防止上述情形的发生,使用进程互斥来解决
互斥
进程间通过 中介发生联系
中介:指共同使用的资源或变量。互斥(不同时、独占),又称为临界资源,互斥资源,共享变量。
- 互斥是无意识的,竞争关系。
- 互斥是进程之间的一种间接制约关系。
- 可以发生在相关进程之间,也可以发生的无关进程之间。
同步
进程间的同步,是一个进程运行到某一点时,要求另一个进程为它提供消息,在未获得消息之前,该进程处于等待状态,获得消息后该进程被唤醒进入就绪态。
- 是有意安排的,只发生在相关进程间。
- 一种直接制约关系。
4、信号量及PV原语操作
原语:不可分割、不可中断的连续执行的指令所构成的程序段。
计算机网络中也有“原语”一词,它与操作系统的“原语”概念不同。
服务原语是指协议中的下层协议通过接口为上层协议提供某种服务而发送的原语操作。
在操作系统中,用于进程控制的原语主要有
- 创建原语
- 撤销原语
- 阻塞原语
- 唤醒原语
信号量
信号量(Semaphore)是一个特殊变量,用于进程间传递消息的一个整数值。
信号量的定义:
struc semaphore {
int count; // 当前空闲的资源数
queueType queue; // 等待队列
}
对信号量可以实施的操作:初始化一个非负数的 count 、P 和 V 操作
最初提出的是二元信号量(解决互斥),之后推广到一般信号量(多值)或计数信号量(解决同步问题)
信号量的值:
- 在初始化时被指定一个 非负整数值,表示空闲资源总数。
- 非负值:表示当前空闲资源数。
- 负值:绝对值表示当前等待临界资源的进程数。
P操作的定义
通过
P(s)
{
s.count--;
if (s.count < 0)
{
// 该进程置为阻塞状态;
// 将该进程插入相应的等待队列 s.queue
// 重新调度;
}
}
v操作的定义
V(s)
{
s.count++;
if(s.count <= 0)
{
// 唤醒相应等待队列 s.queue 中等待的一个进程;
// 改变其状态为就绪态,并将其插入就绪队列;
}
}
P、V操作也可以称为 wait 和 signal 操作,或者 up 和 down 操作。