提示:如果已经掌握了基础知识可以看我的 经典的进程同步问题 做题练习。
内容主要来源:汤小丹_计算机操作系统_教材
教材内容十分的详细,大家可以直接看教材哦,这个主要是个人笔记
进程同步问题相关基础知识
一、进程同步的基本概念
1.进程同步概念的引入
- 我们把异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程,称为进程同步。
- 进程同步机制的主要任务:在执行次序上对多个协作进程进行协调,使并发执行的诸多协作进程之间能够按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使得程序的执行具有可再现性。
(1)两种形式的制约关系
- 在多道程序环境下,对于同处于一个系统中的多个进程,由于它们共享系统资源,或为完成某一任务而相互合作,它们之间可能存在以下两种形式的制约关系。
- 同步强调的是保证进程之间操作的先后次序的约束,而互斥强调的是对共享资源的互斥访问。
间接相互制约关系(互斥关系)
- 多个进程对某些系统资源只能进行互斥访问,由此在这些进程间,形成了源于对该类资源共享的所谓间接相互制约关系,也可称为互斥关系。
- 为了保证这些进程能有序地运行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用这类资源之前应先提出申请,而不能直接使用。
直接相互制约关系(同步关系)
- 某些应用程序为了完成某项任务,会建立两个或多个进程。这些进程会为了完成某一任务而相互合作。进程间的直接制约关系就是源于它们之间的相互合作。
(2)临界资源
- 进程在使用资源时需要采用互斥访问方式的,这样的资源被称为临界资源(critical resource)。
- 临界资源可以是硬件资源,也可以是软件资源。
2.临界区问题
- 人们把每个进程中访问临界资源的那段代码称为临界区(critical section)。
while(ture) {
进入区 //检查与访问的临界区是否正在被访问,如果未访问这修改访问标志为正被访问,并且进入临界区。
临界区
退出区 //用于将临界区正被访问的标志恢复为未被访问的标志。
剩余区 //其他部分的代码
}
- 解决临界区问题的同步机制都应遵循下述4条准则:
- (1)空闲让进。 当无进程处于临界区时,表明临界资源处于空闲状态,应允许1个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界区资源。
- (2)忙则等待。 当已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- (3)有限等待。 对于要求访问临界资源的进程,应保证其在有限时间内能进入自己的临界区,以免陷入“死等”状态。
- (4)让权等待。(原则上应遵顼,但非必须)。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
二、软件同步机制
- 一个经典的基于软件的临界区问题的解决方案是 Peterson 解决方案。
- Peterson 解决方案适用于两个进程交替执行临界区的情况。
- 软件同步机制不满足让权等待原则。
三、硬件同步机制
- 实际上,在对临界区进行管理时,可以将标志看作一个锁,“锁开”进入,“锁关”等待,初始时锁是打开的。每个要进入临界区的进程,必须先对所进行测试,当锁未打开时,则必须等待,直到锁打开。当锁打开时,则应立即把其锁上,以阻止其他进程进入临界区。
- 测试和关锁操作必须时连续的,不允许分开进行。
- 硬件同步机制不满足让权等待原则。
1.关中断
2.利用 Test-and-Set 指令实现互斥
3.利用 swap 指令实现进程互斥
三、信号量机制
- OS 中的信号量机制类似于信号灯,起着规范进程允许的作用。
1.信号量机制简介
(1)整型信号量
- 该方式未满足让权等待原则。
- 整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能用过两个标准的原子操作(Atomic operation)来访问,即 wait(S) 和 single(S)操作。这两个操作一直被称为 P 操作和 V 操作。
(2)记录型信号量
- **该方式满足让权等待原则。 **
- 在信号量机制中,除了需要一个用于代表资源数目的整型变量 value 以外,还应增加一个进程链表指针 list,用于链接所有等待进程。
typedef struct{
int value;
struct process_control_block *list;
} semaphore;
(3)AND 型信号量
- 基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源,也不分配给它。
(4)信号量集
2.信号量的应用
(1)利用信号量实现进程互斥
- 为使多个进程能互斥地访问某临界资源,只须为该资源设置一个互斥型信号量 mutex,并设其初始值为1,然后将各进程访问该资源的临界区置于wait(mutex) 和 single(mutex) 操作之间即可。
(2)利用信号量实现进程同步
- 同步型信号量的使用通常比互斥型信号量的使用要复杂。一般情况下,同步型信号量的 wait(S) 和 single(S) 操作位于两个不同的进程中。
- 另外还有一种比较复杂的同步,如 C1 和 C2 没有一种固定的执行次序,在某种条件下,C1 要先于 C2 执行;而在另一种条件下,C2 要先于 C1 执行。