进程同步问题实例

合集下载

OS进程同步(信号量典型题)

OS进程同步(信号量典型题)

例题1(北京大学1999年)有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,但要求:(1)一次只能存人一种产品((A或B);(2)一N< A产品数量一B产品数量<M其中,N和M是正整数。

试用“存放A’和‘存放B’以及P操作和V操作描述产品A和产品B的人库过程。

解答:应先将表达式转换成制约条件,不可在程序中直接使用该表达式将表达式分解为:B产品数量—A产品数量<NA产品数量—B产品数量<M可这样理解:(1)若只放人A产品,而不放入B产品,则A产品最多可放M—1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为M—1),当计数器值为0时,进程程A被阻塞;每当放入一个B产品,则可令A产品的计数器增加1,表明A产品可以多一次放入产品的机会;同理,(2)若只放人B产品,而不放入A产品,则B产品最多可;放N一1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为N—1)。

当计数器值为0时,进程B被阻塞;每当放人一个A产品,则可令B产品的计数器增加1,表明B产品可以多一次放入产品的机会。

由此可见,该问题是一个同步控制问题。

又因为一次仅允许一种产品人库,设置信号量mutex控制粮进程互斥访问临界资源(仓库)。

过程如下:beginmutex:=1;Sa := M-1;Sb := N-1;ParbeginA产品beginrepeatP (Sa);P (mutex);A人库;V (mutex);V (Sb);Until false;End;B产品beginrepeatP (Sb);P (mutex);B人库;V (mutex);V (Sa);Until false;End;rend;例题2(华中理工大学1999年试题)设公共汽车上,司机和售票员的活动分别是:司机:售票员:启动车辆上乘客正常行车关车门到站停车售票开车门下乘客在汽车不断地到站,停车,行驶过程中,这两个活动有什么同步关系?并用信号灯的P, V操作实现它们的同步。

进程同步模拟设计——哲学家就餐问题

进程同步模拟设计——哲学家就餐问题

课程设计题目进程同步模拟设计—哲学家就餐学院计算机科学与技术专业计算机科学与技术班级计算机姓名指导教师20011 年 1 月19 日需求分析1.1问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子,即共5只筷子。

每个哲学家的行为是思考和进餐。

为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

思考时则同时将两支筷子放回原处(此图中以叉子代表筷子)规则:只有拿到两只筷子时,哲学家才能吃饭;如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。

由此出现的问题:可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐1.2问题分析该问题可用记录型信号量或者是AND型信号量解决。

记录型信号量解决:经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。

当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。

进餐完,又先放下他左边的筷子,再放下右边筷子。

这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。

AND型信号量解决:在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后方能就餐,这在本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。

1.3解决方法对于死锁问题可采取这样的几种解决方法:(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;(2)仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐(3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。

(4)把筷子顺序编号 fk0, fk1, fk2, fk3, fk4,给每个哲学家分配筷子时,必须依从小号到大号(或者相反顺序)进行。

经典进程同步问题

经典进程同步问题
19
一、利用记录型信号量
解决哲学家进餐问题
假设每一位哲学家拿筷子的方法都是:先 拿起左边的筷子,再拿起右边的筷子,则第i 位哲学家的活动可描述为:
20
第i位哲学家的活动可描述为: repeat wait(chopstick[i]); wait(chopstick[i+1] mod 5); …. eat; …. signal(chopstick[i]); signal(chopstick[i+1] mod 5); …. think; until false;
full:=full - 1; if full <0 then block; mutex:=mutex-1; if mutex<0 then block; mutex:=mutex+1; if mutex<=0 then wakeup; empty:=empty+1; if empty<=0 then wakeup;
9
Wait操作不能颠倒!! P:wait(empty) wait(mutex)
C:wait(full) wait(mutex)
如果颠倒 P:wait(mutex) mutexl.value=0 wait(empty) 如果此时缓冲池满empty=-1,P阻塞 C:wait(mutex) mutex.value=-1, C阻塞 wait(full) P阻塞在empty队列中,等待一个空缓冲 C阻塞在mutex队列中,等待公共缓冲池访问权
6
consumer://消费者进程 begin repeat wait(full); wait(mutex); nextc:=buffer[out]; out∶=(out+1) mod n; signal(mutex); signal(empty); 消费这件产品; until false; end

第10课进程间的制约关系(经典同步问题)

第10课进程间的制约关系(经典同步问题)


顾客程序 customer() { V(custs); //释放顾客 P(barbs); //申请理发师 get_haircut(); }
“理发店”问题---P、V信号量解法

设置同步信号量
custs:记录等待理发的顾客数(不包括正在理
发的顾客),初值为0; barbs:正在等待为顾客理发的理发师数,初值 为k;
为防止死锁发生可采取的措施:

最多允许4个哲学家同时坐在桌子周围 仅当一个哲学家左右两边的筷子都可用时, 才允许他拿筷子 给所有哲学家编号,奇数号的哲学家必须首 先拿左边的筷子,偶数号的哲学家则反之
哲学家就餐问题—解法2
0
设置5个互斥信号量: chopstick[i] (0≤i≤4) //对应筷子 初值=1 设置信号量seat // 代表了座位数 初始值=4;

设置变量waiting,它的初值为0。
记录等待理发的顾客数
“理发店”问题---P、V信号量解法

理发师程序 barber() { P(custs); cut_hair(); V(barbs); }

顾客程序 customer() { if(waiting<n) { waiting=waiting+1; V(custs); P(barbs); get_haircut(); } }
第i个哲学家的“思考-就餐-思考”过程可描述为:
philosopher(i) { while(TRUE) { think(); P(chopstick[i]); P(chopstick[(i+1) mod 5)]; eat(); V(chopstick[i]); V(chopstick[(i+1) mod 5)]; } }

进程同步习题全

进程同步习题全
进程管理
【例】一个buffer,一个生产者,一个消费者,生产者 只生产一个东西,消费者只进行一次消费,即:生 产者只进行一次putdata操作,消费者只进行一次 getdata操作。
进程管理
【解答】
设置信号量full,表示buffer是否有数据,初值为0
生产者
消费者
putdata
P(full)
V(full)
getEBuffer()返回空的buffer号 getEBuffer()
return (pbuffer+1)mod n getDBuffer()返回有数据的buffer号 getDBuffer()
return (pdata+1)mod n
进程管理
semaphore mutex,empty,full=1,n,0
getdata
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者不断进行putdata操作,消费者不断进行 getdata操作,即生产者不断生产,消费者不断 消费。
【解答】buffer为空时,才能进行putdata操作, 只有buffer有数据时,才能进行getdata操作
信号量 full:是否有数据初值为0 empty:是否为空,初值为1
integer pbuff,pdata=0,0
生产者i
消费者j
repeat
repeat
P(empty)
P(full)
P(mutex)
P(mutex)
in=getEBuffer()
out=getDBuffer()
V(mutex)
V(mutex)
putdata(in)
getdata(out)
V(full)

计算机操作系统进程同步算法习题选

计算机操作系统进程同步算法习题选

s
t
解:
设置四个信号量Sin=1,Sout=0,Tin=1,Tout=0; get: while(1) { wait(Sin); 将数放入S; signal (Sout); } copy: while(1) { wait (Sout); wait (Tin); 将数从S取出放入T; signal (Tout); signal (Sin); } put: while(1) { wait (Tout); 将数从T取走; signal(Tin); }

A1: while (1) { wait(Sin[1]); wait(Sin[2]); 将数据放入缓冲区 signal(Sout[1]); signal(Sout[2]); }
Bi: while (1) { wait(Sout[i]); 从缓冲区取数 signal(Sin[i]); }
向目标前进一步:
司机进程: while(1) { 启动车辆
正常驾驶 到站停车 }…
售票 员 进程 : while(1) { 关门
售票
}…
开门
分析:
为保证车辆行驶安全,售票员必须关好车门, 然后通知司机启动车辆,在行驶过程中售票员不 能打开车门,待车到站停稳后,司机通知售票员 才能打开车门,如此不断重复。为此,须设置两 个信号量S1,S2用来控制司机和售票员的行为, 初值都为0。
解:
算法如下: 司机进程: while(1) { wait(S1) 启动车辆 正常驾驶 到站停车 signal(S2) }… 售票员进 程: while(1) { 关门 signal(S1)
售票
wait(S2) 开门 }…
【例题2】
1.用wait、signal操作解决下图之同步问题 提示:分别考虑对缓冲区S和T的同步,再 合并考虑 get copy put

进程同步经典问题

进程同步经典问题
in1:=in2:=out1:=out2:=0;
cobegin
{
process producer A
{ repeat
P(empty1);
P(sa);
P(mutex);
buffer1[in1]:=A零件;
in1:=(in1+1) mod m;
V(mutex);
V(sb);
V(full1);
untile false;
B1empty缓冲区B1空,初值1
B2full缓冲区B2满,初值0
B2empty缓冲区B2空,初值1
3、有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试用PV操作描述读者进程之间的同步关系。
算法的信号量有三个:seats——表示阅览室是否有座位(初值为100,代表阅览室的空座位数);readers——表示阅览室里的读者数,初值为0;用于互斥的mutex,初值为1。
}பைடு நூலகம்
process producerB
{ repeat
P(empty2);
P(sb);
P(mutex);
Buffer2[in2]:=B零件;
in2:=(in2+1) mod m;
V(mutex);
V(sa);
V(full2);
untile false;
}
process take
{ repeat
P(full1);
}
}
coend.
2、设有输入进程INPUT,缓冲区B1接纳输入内容。进程MAKER对B1中的内容加工后移送到B2。进程OUTPUT负责从B2中取出内容进行打印。设有一个无穷序列供INPUT输入,B1与B2的大小相同。请用PV过程写出三个进程同步工作的过程。

进程同步模拟设计--吃水果问题

进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4
读者-作者问题
一个数据对象可以为多个并发进程所共享。其 中有的进程可能只需要读共享对象的内容,而 其他进程可能要更新共享对象(即读和写)。
将只对读感兴趣的进程称为读者 其他则称为作者
第一读者-作者问题
仅当无读者等待时,才允许写者执行
第二读者-作者问题
在读者与作者同时申请资源的时候,写者优先。
8
2 缓冲区问题(生产者-消费者问题)
三个进程P1、P2、P3 互斥使用一个包含N(N>0)个单 元的缓冲区。P1 每次用produce()生成一个正整数并 用put()送入缓冲区某一个空单元中;P2 每次用 getodd()从该缓冲区中取出一个奇数并用countodd() 统计奇数个数;P3 每次用geteven()从该缓冲区中取 出一个偶数并用counteven()统计偶数个数。请用信号 量机制实现这三个进程的同步与互斥活动,并说明所 定义的信号量的含义。要求用伪代码描述。
的吸烟。当吸烟者完成吸烟后唤醒供应者,供应者再放两样东西 (随机地)在桌面上,然后唤醒另一个吸烟者。 试为吸烟者和供应者用同步法解决问题。
14
4 吸烟者问题
供应者需要3个进程 X:提供tobacco和match Y:提供match和wrapper Z:提供wrapper和tobacco
3个吸烟者进程 A:只有tobacco B:只有match C:只有wrapper
9
缓冲区问题求解
(1) 缓冲区是一互斥资源,因此设互斥信号量mutex。 (2) 同步问题:P1、P2 因为奇数的放置与取用而同步,设同步信号量odd;P1、
P3 因为偶数的放置于取用而同步,设同步信号量even;P1、P2、P3 因为共享 缓冲区,设同步信号量empty。
semaphore mutex = 1,odd = 0,even = 0,empty = N;
P(Sa);
从plate中取苹果;
V(S); 吃苹mutex);
getodd();
V(mutex);V(empty);
countodd();
}
Process P3:
while(true){
P(even); P(mutex);
geteven();
V(mutex);V(empty);
counteven();
}
11
3 嗜睡理发师问题
signal(wrt); signal(mutex);
6
哲学家就餐问题
7
共享数据 semaphore chopstick[5];
哲学家i结构 do { wait(chopstick[i]); wait(chopstick[(I + 1) % 5]); … eat … signal(chopstick[i]); signal(chopstick[(I + 1) % 5]); … think … } while (1);
Barber进程: while(TRUE){
P(cutomers); //若无顾客,理发师睡眠 P(mutex); //进程互斥,要求顾客等候 waiting = waiting – 1;//等候顾客数少一个 V(barbers); //理发师去为一个顾客理发 V(mutex); //开放临界区 cut-hair( ); //正在理发(非临界区操作)
13
4 吸烟者问题
三个吸烟者在一间房间内,还有一个香烟供应者。 (1)为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火
柴。 (2)供应者有丰富的货物提供。 (3)三个吸烟者中,第一个有自己的烟草,第二个有自己的纸,第三
个有自己的火柴。 (4)供应者将两样东西放在桌子上,允许一个吸烟者进行对健康不利
则 一次只能有X,Y,Z中的一个执行(供应);X,Y,Z只能在 消耗完一个后才能供应下一个
15
4 吸烟者问题
Semaphore tobacco=0, match=0, wrapper=0, mutex=1;
Process X: P(mutex); V(tobacco); V(match);
Process Y: P(mutex); V(match); V(wrapper);
5
第一读者-作者问题
wait(wrt); … writing is performed … signal(wrt);
wait(mutex); readcount ++; if (readcount == 1)
wait(wrt); signal(mutex); … reading is performed … wait(mutex); readcount --; if (readcount == 0)
一个理发店里有一个理发师,一张理发椅子, 多张等候的椅子,当没有顾客的时候,理发师 就睡觉。当一个顾客来到店里时,如果理发师 在睡觉,则叫醒理发师;否则便坐着等;如果 等待的椅子都满了就离开。
12
3 嗜睡理发师问题
int waiting=0 ; //等候理发的顾客数 int chairs=5; //为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1;
}
Customer进程: P(mutex); //进入临界区 if (waiting<chairs){
waiting = waiting+1; //等候顾客数加1 V(customers); //必要的话唤醒理发师 V(mutex); //开放临界区 P(barbers); //无理发师, 顾客坐着养神 get-haircut( ); //一个顾客坐下等候服务 } else V(mutex); //人满了,上自习去!
操作系统概念
进程同步问题实例
本章主要内容
经典同步问题 生产者-消费者问题:缓冲区问题 嗜睡理发师问题 吸烟者问题 吃水果问题
2
1 经典同步问题
有限缓冲问题 读者-作者问题 哲学家进餐问题
3
有限缓冲问题(生产者-消费者问题)
do { … produce an item in nextp … wait(empty); wait(mutex); … add nextp to buffer … signal(mutex); signal(full);
Process Z: P(mutex); V(wrapper); V(tobacco);
Process A: P(match); P(wrapper); Smoke; V(mutex);
Process B: P(wrapper); P(tobacco); Smoke; V(mutex);
Process C: P(tobacco); P(match); Smoke; V(mutex);
Process P1:
while(true){
number = produce();
P(empty);P(mutex);
put();
V(mutex);
If number % 2 == 0
V(even);
else
V(odd);
}
10
缓冲区问题求解
Process P2:
while(true){
Semaphor S=1, So=Sa=0;
Process father: Process mother: Process son:
Process daughter:
P(S);
把苹果放入plate;
V(So);
P(S);
把橘子放入plate;
V(Sa);
P(So);
从plate中取橘子;
V(S); 吃橘子;
} while (1);
do { wait(full); wait(mutex); … remove an item from buffer to nextc … signal(mutex); signal(empty); … consume the item in nextc …
} while (1);
16
5 吃水果问题
桌上有一空盘,允许存放一只水果。爸爸向盘中放苹 果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女 儿专等吃盘中的苹果。规定当盘空时一次只能放一只 水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿 子、女儿三个并发进程的同步。
爸爸 儿子
plate
妈妈 女儿
17
5 吃水果问题
应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值 为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘 中是否有苹果,其初值为0。同步描述如下:
相关文档
最新文档