目录
2.1 进程的基本概念: 状态转换
2.1.1 程序执行状态
程序执行分为顺序执行与并发执行。
顺序执行:
程序顺序执行特点:
顺序性:处理机的操作严格按程序所规定的顺序执行,即每一操作必须在上一个操作结束后开始。
封闭性:程序执行得到的最终结果由给定的初始条件决定,不受外界因素的影响。
可再现性:只要输入的初始条件相同,则无论何时重复执行该程序都会得到相同的结果。
(程序顺序执行的特性为程序员检测和校正程序错误带来很大的方便!)
程序并发执行:
- 程序内保持 Ii→Ci→Pi 程序逻辑顺序性。
- 存在Ii→Ii+1;Ci→Ci+1; Pi→Pi+1:表明系统资源竞争带来顺序性前趋关系。
- 不同程序之间 Ii+2、Ci+1 和Pi ,没有前趋关系,说明可以并发执行,这是系统的并发性。
程序并发执行的特征:
- 间断性/异步性:程序在并发执行时,由于它们共享资源或为完成某一项任务而合作,致使在并发程序之间存在相互制约的关系。(当完成C2 ,但尚未完成I3 ,则无法进行C3 处理(暂停)。这时程序的顺序性演变成间断性。)
- 非封闭性:程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。(如:当处理机资源被其它程序占用时,有条件运行的任何程序都必须等待。)
- 不可再现性:程序在并发执行时,由于失去了封闭性,也导致失去了可再现性。
在某些情况下,程序的并发执行使得执行结果不再具有封闭性和可再现性,且可能造成出现错误(执行结果受执行速度影响的结果)。为了使在并发执行时不出现错误结果,必须采取某些措施来制约、控制各并发程序段执行速度(并发控制)。为了控制和协调各程序执行过程中的软、硬件资源的共享和竞争,显然,必须应有一个描述各程序段执行过程和共享资源的基本单位,称为进程(或任务)。
2.1.2 进程的定义、特征
本质定义:进程是一个动态的执行过程。
进程process的基本特征:
- 结构性
为了描述和记录进程的运动变化过程,并使之能正确运行,每个进程都应配置一个PCB。所以,从结构上看,每个进程(进程实体)都是由程序段、相关数据段及进程控制块(PCB)组成。(进程=PCB+程序+数据集合) - 动态性
进程的实质是程序在处理机上的一次执行过程,因此是动态的。所以动态性是进程的最基本的特征。同时动态性还表现在进程是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停,因撤消而消亡。 - 并发性
指多个进程实体同时存在于内存中,能在一段时间内同时运行。 - 独立性
指进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。 - 异步性
指进程以各自独立的、不可预知的速度向前推进。
注:进程与程序的主要区别:
进程是动态的程序执行过程,程序是静态的指令序列描述。
进程是暂时的(从创建到撤消),程序是永久的。
组成不同:进程(程序+数据+PCB)、程序(代码的集合)。
存在形式不同:进程存在于内存(至少其PCB在内存,如挂起状态时),程序存在于外存或纸张上甚至大脑里
进程与程序之间不是一一对应的。
程序 | 进程 | |
---|---|---|
概念 | 静态 | 动态 |
所在存储器 | 外存 | 内存 |
存在时间 | 永久 | 有生命周期 |
组成 | 有序指令 | 程序段、数据段、PCB |
对应关系 | 一个程序可以对应一个或多个进程 一个进程可以对应一段程序、一个程序或(通过调用)多个程序 |
2.1.3 进程状态
由于多道程序系统中各进程之间存在相互制约关系,使得进程的状态不断发生变化(OS的异步性)。
进程的活动规律:执行—>暂停—>执行。
进程的三种基本状态:
进程可能由于等待I/O操作、竞争资源、以及相互协作等原因产生了“走走停停”的动态性。因此,进程在生存期内至少具有三种基本状态:就绪、运行、阻塞
进程在生存期间,可以多次地从一个状态转换到另一个状态,即多次地处于运行状态、就绪状态、阻塞状态,反映了并发程序“走走停停”的运行轨迹。进程不断地从一个状态转换到另一个状态是有条件或原因的。这些状态随着进程的执行和外界条件发生变化而转换。
2.2 进程控制:PCB
2.2.1 简介
进程控制块:是OS为了管理和控制进程的运行,而为每一个进程定义的一个数据结构,它记录了系统管理进程所需的全部信息。系统根据PCB而感知进程的存在,PCB是进程存在的唯一标志。
进程控制块PCB中的信息主要包括4部分:
- 标识符信息:进程标识符PID、用户标识符UID
- 处理机状态信息:如PSW、PC等各寄存器的值(用于实现进程切换)
- 进程调度信息:进程状态(如就绪运行阻塞)
- 进程控制信息:如资源分配,程序和数据地址
2.2.2 进程控制块PCB的组织方式
常用组织方式:
-
链接方式
把同一状态的PCB链接成一个队列,这样就形成了就绪队列、阻塞队列等。
-
索引方式
将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB ,不同状态对应不同的索引表。
2.2.3 补充:进程的创建、撤销、阻塞、唤醒
原语: OS内核中由若干条指令构成的用于完成特定功能的“原子操作”过程,作为一个整体且****不可分割—要么全部都完成,要么全部都不做。
进程的创建:
OS一旦发现了要求创建进程的事件后,便调用进程创建原语create()按以下过程创建一新进程:
进程的撤销:
如果系统中发生了要求撤消进程的事件,OS便调用撤消原语destroy()去撤消进程。
进程的阻塞与唤醒:
当一个进程期待的事件尚未出现时,该进程调用阻塞原语block()将自己阻塞起来。对于处于阻塞状态的进程,当该进程期待的事件出现时,由其它相关进程调用唤醒原语wakeup()将阻塞的进程唤醒,使其进入就绪状态。
2.3 进程同步:临界区、信号量
进程同步是指对多个相关进程在执行次序上进行协调。
用来实现同步的机制称为同步机制。如:信号量机制。
2.3.1 进程同步的基本概念
两种进程关系:
- 进程同步:直接制约关系,进程之间为了协作完成某项任务而有意识地相互“交换信息”。如前分别将I、C和P都看成是进程。 (有先后次序关系)
- 进程互斥:间接制约关系,进程之间通过竞争系统某些资源产生的关系。原因是某些资源不能同时被 多个进程使用。
临界资源、临界区:
-
临界资源 (critical resource)
系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。 -
临界区(互斥区,critical section )
在进程中涉及到临界资源的程序段叫临界区,
多个进程的临界区称为相关临界区。 -
实现各进程互斥进入临界区
进程须在临界区前面增加一段用于进行上述检查的代码,称为进入区(entry section)。在临界区后面加上一段称为退出区(exit section) 的代码。
同步机制应遵循的规则:
各进程需要互斥访问临界资源,即不能同时进入各自的临界区。应遵守的原则: -
有空让进:无进程在临界区时,要求进入临界区的进程可进入。
-
忙则等待:不允许两个以上的进程同时进入临界区(互斥访问)。
-
有限等待:要求进入临界区的进程不能无限等待,以免陷入“死等(饥饿)”。
-
让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”。
2.3.2 信号量机制
基本原则:在多个相互制约的进程之间使用简单的信号来同步,一个进程被强制停止在一个特定的地方直到收到一个专门的信号。
整型信号量:
除了初始化外,只能通过两个原子操作wait(P)和signal(V)来访问。
主要问题:只要S<=0, wait操作就不断地测试(忙等),因而,未做到“让权等待”。
记录型信号量:
基本思想
- 设置一个整型变量value代表资源数目。
- 设置一个链接所有等待进程的链表。
- 初始化一次后,仅能被wait(S)和signal(S)两个原语操作(同步原语,也称为P、V操作)访问。
S.value的物理含义(P/V操作开始前)
- S.value >0:表示有S.value个资源可用。S.value的初值应≥0
- =0:表示无资源可用且无进程在等待该资源
- <0:表示有|S.value|个进程在等待该资源
P、V操作的含义
- P(S):表示申请一个资源(结果成功或不成功)
- V(S):表示释放一个资源
2.3.3 信号量的应用
利用信号量实现进程互斥:
有多个进程互斥访问某类资源,则互斥进程Pi的代码如图所示(mutex初值为该类资源初始可用个数)
进程互斥问题解题思路
- 一类临界资源设置一个互斥信号量 mutex,初值为其可用个数(如打印机台数),如:只有一台打印机可设置为1
- 所有互斥进程在进入区执行P(mutex),退出区执行V(mutex);次序不能颠倒
- P和V操作成对出现。遗漏P操作则不能保证互斥访问,遗漏V操作则可能造成死锁。
利用信号量实现前驱关系(同步):
为该前趋关系设置一个同步信号量S,其初值为0
如此即可实现先执行P1,再执行P2
进程同步问题的解题思路
- 有几个同步关系,就设几个同步信号量。
- 设定信号量初值=0。
- 同一信号量的P、V操作要成对出现,但分别出现在不同进程的代码中。
2.4 经典进程的同步问题:3类
2.4.1 生产者—消费者问题
- 生产者生产产品,放入缓冲区
- 消费者从缓冲区取出产品消费
- 生产者与消费者互斥访问缓冲区
2.4.2 “哲学家进餐”问题
5个哲学家围圆桌而坐,每人面前有一只空盘子,每2人之间放一只筷子;哲学家的动作包括思考和进餐,进餐时需要拿起他左右两边的两只筷子,思考时则将两只筷子放回原处。如何保证哲学家们的动作有序进行?
求解进程同步与互斥问题注意事项
- 进程应该先申请同步信号量,再申请互斥信号量;释放顺序不要求,但建议嵌套出现
- 任何信号量的P和V操作都必须成对出现
- 对互斥信号量的操作成对出现在同一进程中
- 对同步信号量的操作成对出现在不同进程中