同步与互斥实例
解释一下进程同步和互斥的概念,并提供一些实际应用的例子。
解释一下进程同步和互斥的概念,并提供一些实际应用的例子。
解释进程同步和互斥的概念,并提供实际应用例子
进程同步和互斥是操作系统中重要的概念,用于确保并发执行的进程能够正确地共享资源和避免竞争条件的发生。以下是对这两个概念的解释以及一些实际应用的例子:
进程同步的概念
进程同步是指多个进程在执行过程中按照一定的顺序和规则进行协调以达到预期的结果。在并行执行的环境下,进程可能会相互依赖或者依赖于某些共享资源,因此需要通过某种机制来保证进程之间的协调与同步。
常见的进程同步机制有:
1. 互斥锁(Mutex):一种二进制信号量,用于确保在某一时刻只有一个进程访问共享资源,其他进程需要等待。
2. 信号量(Semaphore):用于控制多个进程对共享资源的访问,可以通过增减信号量的值来实现协调。
3. 条件变量(Condition Variable):用于在某一进程等待某个条件满足时暂停执行,直到条件满足后继续执行。
进程互斥的概念
进程互斥是指多个进程对于共享资源的访问被限制为互斥的,即同一时刻只能有一个进程访问共享资源。这样可以防止并发时的竞争状况,确保每个进程得到正确的结果。
实际应用例子:
1. 银行账户:多个用户同时进行转账或查询操作时,需要对账户进行同步操作,避免出现数据不一致的情况。
2. 打印机:多个进程同时请求打印机,需要通过互斥机制来控制打印机资源的访问顺序,避免打印内容交叉或重叠。
3. 多线程编程:在多线程编程中,多个线程共享同一数据结构时,需要使用锁或信号量等机制来保证线程之间的同步和互斥。
同步与互斥例题
1、有一个东西方向的独木桥,如下图所示,每次只能有一个通过,
且不允许人在桥上停留。东、西两端各有若干人在等待过桥。请用P、V操作来实现东西两端人过桥的问题。
解:设bridge代表独木桥这一临界资源,初值为1。东西两边的人用进程表示;其中P east i(i=1,2,…,n)代表东边的人的进程;P west i(i=1,2,…,n)代表西边的人的进程。现用P、V操作实现东西两端人过桥问题描述如下:
semaphore brigde=1;
main()
{
cobegin
{
P east i(i=1,2,…,n)
while (true) {
p(bridge);
从东向西过桥;
v(bridge); }
P west i(i=1,2,…,n)
while (true){
p(bridge);
从西向东过桥;
v(bridge); }
} coend }
2、对于生产者—消费者问题,若缓冲区单元中有一个,生产者和
消费者只有一个,如图所示。用P、V原语实现生产者和消费者的操作。
解:此是典型的同步问题。设置两个信号量,bufferempty为生产者的私有信号量,初值为1,代表最初可用的空单元数;bufferfull为消费者的私有信号量,初值为0,代表最初可消费的产品个数;producer 代表生产者进程,consumer代表消费者进程。现将用P、V实现此生产者和消费者问题的控制描述如下:
semaphore bufferempty=1;
semaphore bufferfull=0;
main()
{
cobegin
{
procedure
进程同步与互斥应用例子
process P ( ) { while(1) { 从输入设备上读入信息; P(empty1); 将信息放入缓冲区1; V(full1); } } process R ( ) { while(1) {
P(full2); 从缓冲区2取出信息; V(empty2); 将信息打印输出 ;
}
}
process Q ( ) { while(1) { P(full1); 从缓冲区1取出信息; V(empty1); P(empty2); 将信息放入缓冲区2; V(full2); } }
进程的同步
解:这是一个同步问题,信号量初值:S2=0,S3=0,S4=0, S5=0,S6=0
进程P1 执行P1 V(S2) V(S3) 进程P4 P(S4) 执行P4 V(S6) 进程P2 P(S2) 执行P2 V(S4) 进程P5 P(S5) 执行P5 V(S6) 进程P3 P(S3) 执行P3 V(S5) 进程P6 P(S6) P(S6) 执行P6
解题步骤:
1. 2. 3. 4. 确定临界资源及个数; 确定进程的关键工作步(使用临界资源的); 确定信号量的初值(临界资源的个数); 写出伪代码。 使用P(wait)操作和V(signal)操作对进程互斥进 行控制。
进程的互斥
例1:过独木桥。
源自文库P1
P2
P1 { 由西向东过独木桥; }
互斥和同步练习题解析
例1.在一个仅允许单向行驶的单排车道十字路口,只允许车 辆从南向北和从西向东行驶,如图8.1所示;为了安全起见, 每次仅允许一辆汽车通过十字路口;当有车辆通过路口时其 它车辆必须等待,当无车辆在路口行驶时则一次仅允许一辆 汽车通过。请用P、V原语及信号量实现十字路口的交通控制 系统,并描述具体的控制算法。
• 答;设信号量SP,表示信箱是否允许放报纸,值为1时表 示允许放报纸,初值为1;信号量SA,表示信箱中是否有 生活报,值为1时表示有,初值为0;信号量SB,表示信 箱中是否有晚报,值为1时表示有,初值为0。
投递员C、D和A、B两人的进程描述如下:
A() begin L3:P(SA) 取《生活报》 V(SP) goto L3 End B() begin L4:P(SB) 取《晚报》 V(SP) goto L4 end
解:设信号量dooropen表示是否允许开门,值为1时 表示是允许开门,初值为0;doorclose1表示前们是 否关上;值为1时表示已关上,初值为1;doorclose2 表示后们是否关上;值为1时表示已关上,初值为1;
司机和两名售票员所 对应的进程描述如下: driver() begin L1:开车 停车 V(dooropen) 等待 P(doorclose1) P(doorclose2) 启动车辆 goto L1 end
例4:公交车上司机负责驾驶汽车,而售票员 负责开关车门,他们之间必须协同工作。一方 面售票员关好车门并通知司机后,司机才能开 车;另一方面,司机将车停稳并通知售票员后, 售票员才能打开车门上下乘客。假设某辆公交 车上有一名司机和两名售票员,每个售票员各 负责一个车门,请设适当的信号量,并用P、V 原语描述他们的同步过程。
操作系统同步互斥练习题
操作系统同步试题
1、设公共汽车上,司机和售票员的活动分别是:
司机的活动:启动车辆;
正常行车;
到站停车;
售票员的活动:
关车门;
售票;
开车门;
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用P、V操作实现它们的同步。
设两个信号量S和C,初值为S=0;C=0;
司机:L1:正常行车售票员:L2:售票
到站停车P(S)
V(S)开车门
P(C)关车门
启动开车V(C)
GO TO L1 GO TO L2
2、桌子上有一个空盘子,允许存放一只水果,爸爸可以向盘中放苹果,妈妈向盘子中放橘子,女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。规定当盘子空的时候一次只能放一只水果,请用信号量实现他们之间的同步与互斥。
S, S1, S2 :semaphore=1,0,0;
Cobegin:
Process Father:
Begin:
L1: P(S);
Put Apple;
V(S1);
GO TO L1;
End;
Process Mother:
Begin:
L2: P(S);
Put Orange;
V(S2);
GO TO L2;
End;
Process Son:
Begin:
L3: P(S2);
Get Orange;
V(S);
GO TO L1;
End;
Process Daughter:
Begin:
L4: P(S1);
Get Apple;
V(S);
GO TO L4;
End;
CoEnd;
2、写者优先的“读者――写者”问题:
1)共享读
2)互斥写、读写互斥
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
同步与互斥实现方法
同步与互斥实现方法
同步与互斥是并发编程中重要的概念,用于解决多个线程访问共享资
源的问题。同步是指多个线程按照一定的顺序执行,以避免产生竞争条件
和数据不一致的问题;而互斥是指多个线程不能同时访问一些共享资源,
而需要按照一定的顺序进行访问。下面将介绍几种常见的同步与互斥实现
方法。
1. 互斥锁(Mutex)
互斥锁是最常见和最基本的同步与互斥机制。互斥锁提供了两个操作,即上锁(lock)和解锁(unlock)。一个线程在执行临界区代码时会上锁,其他线程在发现互斥锁已经被锁定时,则需要等待。直到执行完临界区代
码后,线程解锁,其他线程才能继续执行。互斥锁的实现可以是通过硬件
原子指令或通过操作系统的系统调用进行。
2. 信号量(Semaphore)
信号量是另一种常见的同步与互斥机制。信号量有一个计数器,用来
表示资源的可用数量。一个线程在访问共享资源之前需要申请信号量,如
果信号量的计数器大于零,说明资源可用,线程可以继续执行;如果计数
器等于零,说明资源不可用,线程需要等待。当线程使用完共享资源后,
需要释放信号量,使得其他线程可以继续申请资源。
3. 读写锁(ReadWrite Lock)
读写锁是用于读写操作频繁且对数据一致性要求较高的情况下,提高
并发性能的一种同步与互斥机制。读写锁分为两种锁,即读锁和写锁。多
个线程可以同时持有读锁来读取共享资源,但是只有一个线程可以持有写
锁进行写操作。当存在写锁时,其他线程无法获得读锁或写锁。
4. 条件变量(Condition Variable)
条件变量用于等待一些条件的成立或通知一些条件的变化。线程可以
第三章同步和互斥
• "二进制信号量(binary semaphore)":只允许信 号量取0或1值
相互不感知(完全不了 竞争(competition) 解其它进程的存在)
一个进程的操作对其他 互斥,死锁(可释放的资 进程的结果无影响 源),饥饿
间接感知(双方都与第 通过共享进行协作 一个进程的结果依赖于 互斥,死锁(可释放的资 三方交互,如共享资 从其他进程获得的信息 源),饥饿,数据一致性 源) 直接感知(双方直接交 通过通信进行协作 一个进程的结果依赖于 死锁,饥饿 互,如通信) 从其他进程获得的信息
来自百度文库
while TS(&lock); critical section lock = FALSE; remainder section
• 利用TS实现进程互斥:每个临界资源设置一个 公共布尔变量lock,初值为FALSE • 在进入区利用TS进行检查:有进程在临界区时, 重复检查;直到其它进程退出时,检查通过;
算法4(Peterson’s Algorithm): 先修改、后检查、后修改者等待
05-互斥与同步
第5章互斥和同步
第5章互斥和同步
●进程间交互
●临界区
●互斥
●信号量
●管程
●进程间通信
进程的交互——协作和竞争
●在多道程序设计系统中,同一时刻可能有许多进程,这些进程之间存在两种基本关系:
竞争关系和协作关系。
●竞争关系:(系统中的多个进程之间彼此无关,它们并不知道其他进程的存在,但由于共享系统资源,就会
出现竞争。当多个进程竞争共享硬设备、变量、表格、链表、文件等资源时,可能导致处理出错。)
死锁、饥饿(资源的竞争出现了这两个控制问题)
进程的互斥(临界区管理)
●协作关系:(某些进程为完成同一任务需要分工协作。例如:input, compute, output ,协作进程之间
各自知道对方的存在)
进程的同步(解决进程间协作关系的手段)
●进程互斥关系是一种特殊的进程同步关系,即逐次使用共享资源。
临界区
●临界区(critical sections)
进程中访问共享变量的代码段
不同进程关于同一变量的临界段代码可能是完全不同的 临界资源—共享变量
临界区
使用临界区的互斥
临界区
●临界区的互斥要求
进程对共享变量的读写操作必须互斥的进行;
对进程互斥地使用临界区有以下原则:
•在共享同一个临界资源的所有进程中,每次只允许有一个进程处于它的临界区;
•若有多个进程同时要求进入它们的临界区时,应在有限的时间内让其中之一进入临界区,而不应相互阻塞;
•进程只应在临界区内逗留有限时间;
•不应使要进入临界区的进程无限期地等待在临界区之外;
•在临界区之外运行的进程不可以阻止其他的进程进入临界区;
•不要预期和假定进程进展的相对速度以及可用的处理器数目,因为这是不可预期的。
unix系统中同步问题和互斥问题例子
unix系统中同步问题和互斥问题例子
同步问题和互斥问题是在多进程或者多线程编程中经常遇到的共享资源管理问题。在Unix系统中,同步问题和互斥问题具体体现在进程间共享的文件、共享内存和信号量等资源的访问过程中。
一、同步问题
同步问题指的是多个进程或线程需要按照一定的次序执行,以实现特定的功能或保证数据的一致性。以下是一些在Unix系统中常见的同步问题例子:
1.多进程文件写入
在多个进程同时对同一个文件进行写入操作时,可能会出现数据混乱的问题。例如,两个进程同时向同一个文件写入一段数据,如果操作不加以控制,可能会导致两个进程的数据交错。为了解决这一问题,可以使用文件锁(flock)或者互斥锁(mutex)来实现对文件的互斥访问,保证每个进程对文件的独占写入操作。
2.生产者和消费者问题
生产者和消费者问题是一种经典的同步问题,常用于描述多个进程或线程之间的协作关系。在Unix系统中,可以通过共享内存、信号量等机制来实现生产者和消费者之间的同步。例如,一个进程负责生产数据,另一个进程负责消耗数据,通过信号量来控制两个进程之间的同步,保证数据的正确交换和处理。
3.进程间通信
在Unix系统中,进程间通信(IPC)是一种常见的同步问题。例如,两个进程需要完成某个任务,但是任务的执行需要依赖于另一个进程的结果。可以通过管道、套接字或者共享内存等方式来实现进程间的通信,保证同步和协作的顺利进行。
二、互斥问题
互斥问题是指多个进程或线程对共享资源的访问需要互斥进行,以避免数据竞争和冲突。以下是一些在Unix系统中常见的互斥问题例子:
进程同步、互斥--哲学家进餐问题
进程同步、互斥--哲学家进餐问题
1、问题描述
⼀张圆桌上有5名哲学家,没两个哲学家之间有⼀根筷⼦,桌⼦中间由⼀碗⽶饭。当哲学家饥饿时会试图分别拿起左右两根筷⼦,如果筷⼦已在他⼈⼿上则需等待。饥饿的哲学家只有拿起两根筷⼦才能进餐,吃完后才能放下筷⼦。
2、问题分析
对哲学家分别编号0,1,2,3,4,对筷⼦编号0,1,2,3,4。i号哲学家左边筷⼦编号为i,右边编号为(i+1)%5。
(1)⽅案1
最多允许4个哲学家同时申请进餐,这样可以保证⾄少有⼀个哲学家有两根筷⼦
(2)⽅案2
要求奇数号的哲学家先拿左边的筷⼦,然后拿右边的筷⼦,偶数号哲学家相反
semaphore chopstick[5]={1,1,1,1,1};
Pi(){
while(1){
if(i%2!=0){
P(chopstick[i]);
P(chopstick[(i+1)%5]);
}else{
P(chopstick[(i+1)%5]);
P(chopstick[i]);
}
进餐
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}
}
(3)⽅案3
仅当哲学家两边的筷⼦都可以拿起的时候才能申请进餐
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;
Pi(){
while(1){
P(mutex);
P(chopstick[i]);
P(chopstick[(i+1)%5]);
V(mutex);
吃饭
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}
}
进程同步互斥练习
1.如果信号量S的初值是5,现在信号量的值是-5,那么系统中的相关进程至少执行了几个P(S)操作?与信号量S相关的处于阻塞状态的进程有几个?为使信号量S的值大于0,应进行怎样的操作?答案:
1)5-(-5)=10,因此系统中的相关进程至少执行了10个P(S)操作。因为每执行一次P(S)操作就会将信号量S减去1。
2)与信号量S相关的处于阻塞状态的进程有|-5|=5个。
3)为使信号量S的值大于0,应当有至少6个执行了P(S)但还没来得及执行V(S)的进程去执行V(S)操作。
2.一售票厅只能容纳300人,当少于300人时,可以进入;否则,需在外等候。若将每一个购票者作为一个进程,请用P、V操作编程,并写出信号量的初值。
答案:
设置信号量NUM表示售票厅当前还可以进入的人数,初值为300.
购票者进程:
do{
P(NUM);
进入售票厅;
V(NUM);
} While(1);
3.桌上有一空盘,只允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘中空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
答案:
设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S=1; int Sa=0; int So=0;
main( )
{
father();
son();
daughter();
}
father()
{
while(1)
同步与互斥练习
课堂练习题
Var mutex,full,empty:semaphore:=1,0,8; Begin Parbegin consumer: begin repeat wait ( full );
procedure: begin
repeat 生产一个成品; wait ( empty ); wait( mutex ); 将产品存入仓库; signal (mutex ); signal ( full ); until false; end end
输入进程 buf1 计算进程 buf2 打印进程
4、设有一个成品仓库,总共能够存放8台 成品,生产者生产产品放入仓库,消费者从 仓库中取出成品消费。为了防止积压,仓库 满时就停止生产。由于仓库搬运设备只有一 套,故成品的存入和取出只能分别执行,使 用 wait () 和 signal() 操作来实现该方案。
caculating wait(empty2); wait(mutex2); take a character from ch1; add to buffer2 signal(mutex2); signal(full2); until false end
OP:begin repeat wait(full2); wait(mutex2); take a character from buffer2; add to printer controler; signal(mutex2); signal(empty2); start printer; until false end parend
同步和互斥实验-吃水果问题、消费者问题
实验3 报告
源程序1
/**
作者:wwj
时间:2012/4/12
功能:实现吃水果问题
**题目内容:桌子有一只盘子,只允许放一个水果,父亲专向盘子放苹果,母亲专向盘子放桔子儿子专等吃盘子的桔子,女儿专等吃盘子的苹果。只要盘子为空,父亲或母亲就可以向盘子放水果,仅当盘子有自己需要的水果时,儿子和女儿可从盘子取出。请给出四个人之间的同步关系,并用pv操作实现四个人的正确活动的问题。**
**题目分析:父亲和女儿是相互制约的,父亲进程执行完即往盘中放入苹果后,女儿进程才能执行即吃苹果,是同步关系;
母亲和儿子是相互制约的,母亲进程执行完即往盘中放入桔子,儿子进程才能执行即吃桔子,也是同步关系
而父亲和母亲这两个进程不能同时进行,是互斥关系;**
**/
#include<windows.h>
#include<iostream>
using namespace std;
//声明句柄
HANDLE EmptyPlate;
HANDLE Apple;
HANDLE orange;
HANDLE fatherThread;
HANDLE motherThread;
HANDLE sonThread;
HANDLE daughterThread;
//线程函数声明
DWORD WINAPI father(LPVOID IpParameter);
DWORD WINAPI mother(LPVOID IpParameter);
DWORD WINAPI daughter(LPVOID IpParameter);
DWORD WINAPI son(LPVOID IpParameter);
同步与互斥实例
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问 题(具有前后执行顺序要求的)。
②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个 或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允 许一个进程对临界资源访问。
③对同步问题要设置同步信号量,通常同步信号量的个数与参与 同步的进程种类有关,即同步关系涉及几类进程,就有几个同步 信号量。同步信号量表示该进程是否可以开始或该进程是否已经 结束。
end
独木桥问题。某条河上只有一座独木桥,以便 行人过河。现在河的两边都有人要过桥,按照 下面的规则过桥。为了保证过桥安全,请用P、 V操作分别实现正确的管理。
过桥的规则是:每次只有一个人通过桥。
Fra Baidu bibliotek Var mutex: semaphore;
process (E-W)i: begin P(mutex); 过桥; V(mutex);
习题
1.司机和售票员问题 问题描述: 在公共汽车上,司机和售票员的活动分别是: 司机的活动: 启动车辆
正常运行 到站停车 售票员的活动: 关车门 售票 开车门 在汽车不断的到站,停车,行驶过程中,这两个活动有 什么同步关系?用信号量和P,V操作实现.
2.吸烟者问题
三个吸烟者在一间房间内,还有一个香烟 供应者。为了制造并抽掉香烟,每个吸烟者需 要三样东西:烟草、纸和火柴。供应者有丰富 的货物提供。三个吸烟者中,第一个有自己的 烟草,第二个有自己的纸,第三个有自己的火 柴。供应者将两样东西放在桌子上,允许一个 吸烟者进行对健康不利的吸烟。当吸烟者完成 吸烟后唤醒供应者,供应者再放两样东西(随 机地)在桌面上,然后唤醒另一个吸烟者。试 为吸烟者和供应者采用信号量机制解决问题。
同步与互斥实例
各进程的代码如下 :
进程A
进程B
进程C
...
…
...
...
…
...
P(mutex)
P(mutex)
P(mutex)
申请打印机
申请打印机 申请打印机
来自百度文库
使用打印机
使用打印机 使用打印机
V(mutex)
V(mutex) V(mutex)
购物问题。某超级市场,可容纳100个人同时 购物,入口处备有篮子,每个购物者可持一个 篮子入内购物。出口处结账,并归还篮子(出、 入口仅容纳一人通过)。请用P、V操作完成 购物同步算法。
while(TRUE);
/*理完一人,还有顾客吗?*/
P(cutomers);
/*若无顾客,理发师睡眠*/
P(mutex);
/*进程互斥*/
waiting := waiting – 1; /*等候顾客数少一个*/
V(barbers);
/*理发师去为一个顾客理发*/
V(mutex);
/*开放临界区*/
V(empty);
V(full);
Consume a product;
Goto L1;
Goto L2;
end;
coend
end;
2.实例
设某台机挂有两个I/O通道:分别挂一 台输入机和一台打印机。卡片机上有 一叠数据卡片,现在要把这些数据逐 一输入到缓冲区B1,然后再复制到缓 冲区B2,并在打印机上打印出来。
实验四-同步与互斥-Linux实验报告
实验四-同步与互斥-Linux实验报告实验四同步与互斥 Linux 实验报告
一、实验目的
本次实验旨在深入理解操作系统中进程的同步与互斥概念,通过在Linux 环境下进行编程实践,掌握相关的实现方法和技术,提高对并发控制的认识和应用能力。
二、实验环境
操作系统:Linux(Ubuntu 2004)
编程语言:C 语言
开发工具:GCC 编译器
三、实验原理
(一)同步
同步是指多个进程在执行过程中需要按照一定的顺序协调工作,以确保它们之间的操作具有正确的逻辑关系。常见的同步机制包括信号量、条件变量等。
(二)互斥
互斥是指在同一时刻,只允许一个进程访问共享资源,以避免多个进程同时操作导致的数据不一致或错误。实现互斥的常见方法有互斥锁、临界区等。
四、实验内容
(一)使用信号量实现生产者消费者问题
1、问题描述
生产者不断生产产品并放入缓冲区,消费者从缓冲区取出产品进行消费。缓冲区大小有限,当缓冲区满时生产者停止生产,当缓冲区为空时消费者停止消费。
2、实现思路
创建一个信号量来表示缓冲区的可用空间数量,另一个信号量表示缓冲区中已有的产品数量。生产者在生产前检查可用空间信号量,消费者在消费前检查产品数量信号量。
3、代码实现
```c
include <stdioh>
include <stdlibh>
include <pthreadh>
include <semaphoreh>
define BUFFER_SIZE 5
int bufferBUFFER_SIZE;
int in = 0;
int out = 0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) A、B、C三个进程之间存在互斥的制约关系。因 为打印机属于临界资源,必须一个进程使用完之后另 一个进程才能使用。 (2)mutex:用于互斥的信号量,初值为1。 各进程的代码如下 : 进程A 进程B 进程C ... … ... ... … ... P(mutex) P(mutex) P(mutex) 申请打印机 申请打印机 申请打印机 使用打印机 使用打印机 使用打印机 V(mutex) V(mutex) V(mutex)
rc1:=rc1+1;
if rc1=1 then P(S); V(S1);
V(S2);
过桥; P(S2);
过桥;
P(S1); rc1:=rc1-1; if rc1=0 then V(S); V(S1); end
rc2:=rc2-1;
if rc2=0 then V(S);
V(S2);
end
Var mutex1, mutex2, empty, full, count: semaphore; mutex1:=1; mutex2:=1; empty:=10; full:=0; count:=3;
process 老和尚:
begin repeat P(full); P(count); P(mutex2); 从缸中取水; V(mutex2); V(empty);
2.吸烟者问题 三个吸烟者在一间房间内,还有一个香烟 供应者。为了制造并抽掉香烟,每个吸烟者需 要三样东西:烟草、纸和火柴。供应者有丰富 的货物提供。三个吸烟者中,第一个有自己的 烟草,第二个有自己的纸,第三个有自己的火 柴。供应者将两样东西放在桌子上,允许一个 吸烟者进行对健康不利的吸烟。当吸烟者完成 吸烟后唤醒供应者,供应者再放两样东西(随 机地)在桌面上,然后唤醒另一个吸烟者。试 为吸烟者和供应者采用信号量机制解决问题。
begin
P(S); P(mutex1);
进入口处,取一只篮子;
V(mutex1); 选购商品;
P(mutex2);
结账,并归还篮子; V(mutex2);
V(S);
end
独木桥问题。某条河上只有一座独木桥,以便 行人过河。现在河的两边都有人要过桥,按照 下面的规则过桥。为了保证过桥安全,请用P、 V操作分别实现正确的管理。 过桥的规则是:每次只有一个人通过桥。
V(mutex1);
P(mutex2); 送水入水缸;
V(mutex2);
V(count); V(full);
until false;
end
V(count);
until false;
习题
1.司机和售票员问题 问题描述: 在公共汽车上,司机和售票员的活动分别是: 司机的活动: 启动车辆 正常运行 到站停车 售票员的活动: 关车门 售票 开车门 在汽车不断的到站,停车,行驶过程中,这两个活动有 什么同步关系?用信号量和P,V操作实现.
拣棋子问题。生产围棋的工人不小心把相等数 量的黑棋子和白棋混装在一个箱子里,先要用 自动分拣系统把黑棋子和白棋子分开,该系统 由两个并发执行的进程组成,系统功能如下: (1)进程A专门拣黑子,进程B专门拣白子; (2)每个进程每次只拣一个子,当一个进程在 拣子时不允许另一进程去拣子; (3)当一个进程拣了一个子(黑或白)以后, 必让另一个进程拣一个子(黑或白) 。 请用P、V操作管理两个并发进程,使其能正 确实现上述功能。
提水入缸供老和尚饮用。水缸可以容纳10桶水,
水取自同一井水。水井狭窄,每次只能容一个
桶取水。水桶总数为Baidu Nhomakorabea3 个。每次入、出水缸仅
一桶,且不可同时进行。试给出有关取水、入 水的算法描述。
process 小和尚: begin repeat P(empty); P(count); P(mutex1); 从井中取水;
Var S1, S2: semaphore:=1,0; process A:
process B:
begin
repeat P(S1);
begin
repeat P(S2); 拣白子; V(S1); until false end
拣黑子;
V(S2); until false; end
某寺庙有小、老和尚若干,有一水缸,由小和尚
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问 题(具有前后执行顺序要求的)。 ②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个 或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允 许一个进程对临界资源访问。 ③对同步问题要设置同步信号量,通常同步信号量的个数与参与 同步的进程种类有关,即同步关系涉及几类进程,就有几个同步 信号量。同步信号量表示该进程是否可以开始或该进程是否已经 结束。 ④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现 同步的PV操作也必须成对出现,但可以分别出现在不同的进程中; 在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠 倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P 操作,但V操作的顺序没有严格要求。
2.实例
设某台机挂有两个I/O通道:分别挂一 台输入机和一台打印机。卡片机上有 一叠数据卡片,现在要把这些数据逐 一输入到缓冲区 B1 ,然后再复制到缓 冲区B2,并在打印机上打印出来。 问:系统可设哪些进程来完成这个任 务?用P-V原语写这些进程的同步算法。
解:由上图可见,系统可设 3 个进程:输入进程、复制进 程、打印进程;分别用进程R、进程C、进程P来表示。 这些进程之间的相互制约关系: R受C的约束;C受R、P的约束;P受C的约束。 设4个信号量:S1=1,S2=0,S3=1,S4=0 同步算法如下:
互斥实例
有三个用户进程A、B和C,在运行过程中都要使 用系统中的一台打印机输出计算结果。 试说明A、B、C进程之间存在什么样的制约关 系? 为保证这三个进程能正确地打印出各自的结果, 请用信号量和P、V操作写出各自的有关申请、 使用打印机的代码。要求给出信号量的含义和 初值。
同步与互斥的解题步骤
( 1 )确定进程。包括进程的数量、进程的工 作内容,可以用流程图描述。 ( 2 )确定同步互斥关系。根据是否使用的是 临界资源,还是处理的前后关系,确定同步与 互斥,然后确定信号量的个数、含义,以及对 信号量的P、V操作。 (3)用类C语言描述同步或互斥算法。
Var mutex: semaphore;
process (E-W)i:
process (W-E)j: begin P(mutex); 过桥; V(mutex); end
begin
P(mutex); 过桥; V(mutex); end
.独木桥问题。某条河上只有一座独木桥,以 便行人过河。现在河的两边都有人要过桥,按 照下面的规则过桥。为了保证过桥安全,请用 P、V操作分别实现正确的管理。 过桥的规则是:同一方向的可连续过桥, 某方向有人过桥时另一方向的人要等待。
进程同步与互斥实例
同步实例
1.经典的生产者─消费者问题
生产者 消费者
1.经典的生产者─消费者问题
var B : integer; empty:semaphore; /* 可以使用的空缓冲区数 */ full:semaphore; /* 缓冲区内可以使用的产品数 */ empty := 1; /* 缓冲区内允许放入一件产品 */ full := 0; /* 缓冲区内没有产品 */ cobegin /*多个子进程并发执行函数*/ Process producer process consumer begin begin L1: L2: Produce a product; P(full); P(empty); 取产品 直到取为空 放产品; 直到为满; V(empty); V(full); Consume a product; Goto L1; Goto L2; end; end; coend
Var S, S1, S2: semaphore; process (E-W)i: begin P(S1);
rc1,rc2: integer;
S, S1, S2:=1; rc1,rc2:=0;
process (W-E)j: begin
P(S2);
rc2:=rc2+1; if rc2=1 then P(S);
购物问题。某超级市场,可容纳100个人同时 购物,入口处备有篮子,每个购物者可持一个 篮子入内购物。出口处结账,并归还篮子(出、 入口仅容纳一人通过)。请用P、V操作完成 购物同步算法。
Var S, mutex1, mutex2: semaphore;
S:=100; mutex1:=1; mutex2:=1 process Pi:
3.理发师问题
理发店里有一位理发师、一把理发椅和 n 把供
等候理发的顾客坐的椅子
如果没有顾客,理发师便在理发椅上睡觉
一个顾客到来时,它必须叫醒理发师
如果理发师正在理发时又有顾客来到,则如果
有空椅子可坐,就坐下来等待,否则就离开
记 录 型 信 号 量 解 决 理 发 师 问 题
var waiting : integer; /*等候理发的顾客数*/ CHAIRS:integer; /*为顾客准备的椅子数*/ customers, barbers,mutex : semaphore; customers := 0; barbers := 0; waiting := 0; mutex := 1; Process barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end; process customer begin P(mutex); /*进程互斥*/ if waiting<CHAIRS begin /*看看有没有空椅子*/ waiting := waiting+1; /* 等候顾客数加1*/ V(customers); /*必要的话唤醒理发师*/ V(mutex); /*开放临界区*/ P(barbers); /*无理发师, 顾客坐着养神*/ get-haircut( ); /*一个顾客坐下等理发*/ end V(mutex); /*人满了,走吧!*/ end;