文章目录
4.1 进程同步的基本概念
4.1.1 进程同步概念的引入
1、我们把异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程,称为进程同步。具有同步关系的一组并发进程称为协作进程。
2、主要任务
使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
3、进程间的制约关系
间接相互制约关系(互斥关系):进程互斥使用临界资源
直接相互制约关系(同步关系):进程间相互合作
4、临界资源
系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。
诸进程间应采取互斥方式,实现对这种资源的共享
临界资源既可以是硬件资源,也可以是软件资源。
5、生产者消费者问题
6、共享变量
缓冲池buffer:用数组来表示具有n个缓冲区的缓冲池
输入指针in:指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1,初值为0
输出指针out:指示下一个可获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1,初值为0
整型变量count:初值为0,表示缓冲区中的产品个数
4.1.2 临界区问题
1、临界区:进程中涉及临界资源的代码段
进入区:用于检查是否可以进入临界区的代码段。
退出区:将临界区正被访问的标志恢复为未被访问标志。
剩余区:其他代码
2、一个访问临界资源的循环进程的描述
While(TRUE){
进入区
临界区
退出区
剩余区
}
3、解决临界区问题的同步机制都应该遵循下述4条准则:
空闲让进:当无进程处于临界区,应允许一个请求进入临界区的进程立即进入自己的临界区;
忙则等待:已有进程处于其临界区,其它试图进入临界区的进程必须等待;
有限等待:等待进入临界区的进程不能"死等";
让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)
4.2 软件同步机制
4.3 硬件同步机制
1、关中断
进入锁测试之前关闭中断,完成锁测试并上锁之后才打开中断
可有效保证互斥,但存在许多缺点
2、利用Tesr—and—Set指令实现互斥
3、利用swap指令实现进程互斥
4、信号量机制
4.4 信号量机制
4.4.1 信号量机制介绍
1、信号量-软件解决方案:
- 保证两个或多个代码段不被并发调用
- 在进入关键代码段前,进程必须获取一个信号量,否则不能运行
- 执行完该关键代码段,必须释放信号量
- 信号量有值,为正说明它空闲,为负说明其忙碌
2、整型信号量
提供两个不可分割的[原子操作]访问信号量
wait(S):
while s<=0 ; /*do no-op*/
s:=s-1;
signal(S):
s:=s+1;
- Wait(s)又称为P(S)
- Signal(s)又称为V(S)
- 缺点:进程忙等
3、记录型信号量:去除忙等的信号量
每个信号量S除一个整数值S.value外,还有一个进程等待队列S.list,存放阻塞在该信号量的各个进程PCB
- 信号量只能通过初始化和两个标准的原语PV来访问--作为OS核心代码执行,不受进程调度的打断
- 初始化指定一个非负整数值,表示空闲资源总数(又称为"资源信号量")--若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数
4、AND型信号量
AND型信号量同步的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。
对若干个临界资源的分配,采用原子操作。
在wait(S)操作中增加了一个“AND”条件,故称之为AND同步,或同时wait(S)操作,即Swait(Simultaneous wait)。
5、信号量集
在记录型信号量中,wait或signal仅能对某类临界资源进行一个单位的申请和释放,当需要对N个单位进行操作时,需要N次wait/signal操作,效率低下
扩充AND信号量:对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放
- 进程对信号量Si的测试值是该资源的分配下限值ti,即要求Si≥ti,否则不予分配。一旦允许分配,进程对该资源的需求值为di,即表示资源占用量,进行Si= Si-di操作
- Swait(S1,t1,d1,…,Sn,tn,dn)
- Ssignal(S1,d1,…,Sn,dn)
4.4.2 信号量的应用
1、利用信号量实现进程互斥
2、利用信号量实现前驱关系
3、利用信号量实现进程同步
4.5 管理机制
1、管程定义
一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据
2、管程功能
①互斥
- 管程中的变量只能被管程中的操作访问
- 任何时候只有一个进程在管程中操作
- 类似临界区
- 由编译器完成
②同步
- 条件变量
- 唤醒和阻塞操作
3、条件变量
管程内可能存在不止1个进程。
例如:进程P调用signal操作唤醒进程Q后。
4、存在的可能处理方式:
P等待,直到Q离开管程或等待另一条件(Hoare)。
Q等待,直到P离开管程或等待另一条件(Hansen)。
4.6 经典的进程同步问题
4.6.1 生产者——消费者问题
1、生产者-消费者问题是相互合作进程关系的一种抽象
2、利用记录型信号量实现:
假定,在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,可利用互斥信号量mutex使诸进程实现对缓冲池的互斥使用;
利用资源信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息
3、其它解决方案:AND信号集、管程
4、互斥分析
4.6.2 哲学家就餐问题
1、问题描述
五个哲学家的生活方式:交替思考和进餐 共用一张圆桌,分别坐在五张椅子上 在圆桌上有五个碗和五支筷子 平时哲学家思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在拿到两支筷子时才能进餐 进餐毕,放下筷子又继续思考
2、存在问题
可能引起死锁,如五个哲学家同时饥饿而各自拿起左筷子时,会使信号量chopstick均为0;因此他们试图去拿右筷子时,无法拿到而无限期等待。
3、解决方法
①最多允许4个哲学家同时坐在桌子周围
②仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。
③给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之
4.6.3 读者——写者问题
1、有两组并发进程:读者和写者,共享一组数据区。
2、要求:允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。
3、分类:
①读者优先(第一类读者写者问题)
如果读者来: 无读者、写者,新读者可以读。 有写者等,但有其它读者正在读,则新读者也可以读。 有写者写,新读者等
如果写者来:无读者,新写者可以写。有读者,新写者等待。有其它写者,新写者等待。
②写者优先(第二类读者写者问题)
多个读者可以同时进行
读写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
4.7 Linux进程同步机制
1、Linux并发的主要来源:中断处理、内核态抢占、多处理器的并发。
2、同步方法:
- 原子操作
- 自旋锁(spin lock) 不会引起调用者阻塞
- 信号量(Semaphore)
- 互斥锁(Mutex)
- 禁止中断(单处理器不可抢占系统)