操作系统 信号量机制P、V操作习题全解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
量和P,V操作写出汽车过独木桥问题的 同步算法。并说明每个信号量的含义。
• Seamphore stop,wait,mutex1,mutex2; • Stop=1;mutex1=1;mutex2=1;wait=1; • Int counter1=0,counter2=0; • Mutex1互斥信号量,用于锁counter1。 • Mutex2互斥信号量,用于锁counter2。 • stop 用于提出过桥请求。 • wait用于排队过桥,即用于给桥加锁。
Agent() int rr, rr1=4; while (1) { do
rr = random (3); while (rr == rr1);
rr1=rr; wait (done); if (rr == 0) {
put paper and tobacco; signal (PaperTobacco ); } else if (rr == 1) {
wait (full1) wait (s1)
copy data from buffer1 //单缓,无out指针,可写y=buffer1 signal (s1) signal (empty1) wait (empty2) wait (s2)
put data into buffer2 // buffer2=y signal(s2) signal (full2) }
• 进程A while(1){ P(s1); 拣黑子;
V(s2); }
进程B: while(1){
P(s2); 拣白子;
V(s1); }
• 4. 某银行提供一个服务窗口和10个等待的座 位。顾客到达银行时,若有空座位,则到取号 机上领取一个号,等待叫号。取号机每次允许 一位顾客使用。当营业员空闲时,通过叫号选 取一位顾客,并为其服务。顾客和营业员的活 动描述如下:
Process 营业员 while(TRUE)
{ P(s1); V(service); // 叫号; 为顾客提供服务;
}
• 5. 三个进程P1、P2、P3互斥使用一个包含 N(N>0)个单元的缓冲区。P1每次用 produce()生成一个正整数并用put()送入 缓冲区某个空单元中;P2每次用getodd() 从该缓冲区中取出一个奇数并用countodd() 统计奇数个数;P3每次用geteven()从该缓 冲区中取出一个偶数并用counteven()统计 偶数个数。请用信号量描述三个进程的同步 与互斥活动,并说明定义信号量的含义。
• Put process: while(1) {
wait (full2) wait (s2)
get data from buffer2 // z=buffer2 signal (s2) signal (empty2)
print data on printer }
• 3.在一个箱子里混装有数量相等的黑色围棋子 和白色围棋子,现要用自动分拣系统把黑子和 白子分开,该系统由两个并发执行的进程组成, 功能如下:
• 针对一个smoker与agent有两个同步关 系:
• 1)agent放了两样东西,smoker才能 抽烟---三个信号量
• 2)smoker把桌上东西拿走,agent才 能再放---信号量done,初值为1
semaphore PaperTobacco= 0; TobaccoMatch= 0; PaperMatch= 0; done =1;
get paper and tobacco; signal (done); }
smoker2 () /* has paper */ while(1) { wait (TobaccoMatch);
get tobacco and match; signal (done); } Smoker3 () /* has match */ while(1) { wait (PaperMatch); get paper and match; signal (done); }
• 东边要过桥的车:
•
P(stop);
•
P(mutex1);
•
Count1++;
•
If (count1==1) P(wait);
•
V(mutex1);
•
V(stop);
•
{过桥}
•
P(mutex1);
•
Count1--
•
If (count1==0) V(wait);
•
V(mutex1);
• 西边要过桥的车
• 要求说明每个信号量是用于解决什么互斥、 什么同步关系的。
Get
Copy
Put
A
B
卡片机
buffer1
C
D
buffer2
打印机
• 2. 互斥信号量 s1=1, s2=1; • (因为只有一个get、copy和put进程,故可不定
义互斥信号量) • 同步信号量4个: • full1=0, empty1=1; 为一对 • full2=0, empty2=1; 为一对
• Process 顾客 i:
• { 从取号机获取一个号码;
• 等待叫号;
• 获得服务;
•}
• Process 营业员
• while(TRUE)
•{
•
叫号;
•
为顾客提供服务;
•}
• 请用P、V操作实现上述过程中的互斥与 同步。说明信号量的含义并赋初值。
• 两个互斥互斥关系: • 一台叫号机--mutex=1 • 10个座位-- empty=10
• 两个同步关系: • 有顾客营业员才叫号s1=0 • 营业员先叫号,顾客才能被服务service
=0
• Process 顾客 i:
• { P (empty);
• P(mutex);
• 从取号机获取一个号码;
• V(mutex);
• V(s1);
• P(service); //等待叫号;
• V (empty); • 获得服务; •}
• 顾客进程: while (1) {
p(sn); eat;
v(sn); p(s1);
pay; v(s2); p(s3) leave; }
收银员进程: do { p(s2); get the money; v(s1); v(s3); } while(1);
7.独木桥问题:东西方向汽车过独木桥, 为了保证安全,只要桥上无车,则允许 一方的汽车过桥,待一方的汽车全部通 过后,另一方的汽车才允许过桥。但, 当另一方提出过桥时,要阻止对方未上 桥的后继车辆,待桥面上的汽车过完桥 后,另一方的汽车开始过桥。适用信号
} •
P2进程: While(1){
P(odd); P(mutex); getodd(); V(mutex); V(empty); Countodd(); }
• P3进程: • While(1){ • P(even); • P(mutex); • geteven(); • V(mutex); • V(empty); • Counteven(); •}
•
P(stop);
•
P(mutex2);
•
Count2++;
•
If (count2==1) P(wait);
•
V(mutex2);
•
V(stop);
•
{过桥}
•
P(mutex2);
•
Count2--
•
If (count2==0) V(wait);
•
V(mutex2);
• 8. 设系统有三个抽烟者进程和一个供应 者进程。每个抽烟者进程不停地卷烟抽 烟。要抽烟他需要三种材料:烟草、纸 和火柴。一个抽烟者有纸,另一个有烟 草,第三个有火柴。供应者进程无限提 供三种材料,供应者进程每次将两种材 料放在桌子上,拥有另一种材料的抽烟 者取走两种材料抽烟,并给供应者一个 信号告诉他完成了,供应者进程会将另 外两种材料放在桌子上,本过程一直重 复着。用信号量描述三个抽烟者进程和 供应者进程。
– 进程A专门拣黑子,进程B专门拣白子;
– 每个进程每次只拣一个子,当一个进程在拣 子时不允许另一个进程去拣子;
– 当一个进程拣了一个棋子(黑子或白子)以 后,必须让另一个进程拣一个棋子(黑子或 白子),并要求A进程首先开始。
• 定义两个同步信号量源自文库1,s2;
• 因为要求进程A先开始,故S1初值为1;s2初 值为0;
6. 在某餐馆里有一个收银员,且同时最多 允许有30个顾客就餐,我们可以将顾客 和收银员看成是两类不同的进程。
为了利用PV操作正确地协调这两类进程之 间的工作,设置了四个信号量S1、S2、 S3和Sn,且初值分别为1、0、0和30。
有三个同步关系: ①收银员忙,顾客等---S1 ②无人付款,收银员等--S2 ③收银员收完钱,顾客可以离开---S3 一个互斥关系:30张餐桌---Sn
•}
• 2. 从读卡机上读进N张卡片,然后复制一份, 要求复制出来的卡片与读进的卡片完全一样。 该任务由三个进程get,copy和put及两个 缓冲区buffer1和buffer2完成。进程get的 功能是把一张卡片的信息从读卡机读入 buffer1;进程copy是把buffer1中的信息 复制到buffer2;进程put的功能是取出 buffer2中的信息并从打印机上打印。
•
• get process: while (1) {
read data; wait (empty1); wait (s1)
put data into buffer1 //因为是单缓,故无in指针,可写为 // buffer1=x; signal (s1) signal (full1) }
• Copy process: while (1) {
put match and tobacco; signal (MatchTabacco);
}
else { put paper and match; signal (PaperMatch);
} Smaker1 () /* has match */ while(1) { wait (PaperTobacco);
wait (empty); put data into buffer; //单缓,无in指针,可写为 buffer=x
signal (full);}
• 计算进程: • While(1){
wait (full); get data from buffer;
// 单缓,无out指针,可写为 y=buffer signal (empty);
• 对buffer的互斥信号mutex=1
• P1生产,P2消费奇数,一对同步信号量 odd=0, empty=N;
• P1生产,P2消费偶数一对同步信号量 even=0, empty=N;
• P1进程: int num; while(1){ num=produce(); P(empty); P(mutex); put(); V(mutex); if (num%2) V(odd); else V(even);
• 1. 在测量控制系统中的数据采集任务时, 把采集的数据送一个单缓冲区;计算任务 从该缓冲区中取出数据进行计算。利用信 号量实现两者共享缓冲区的同步算法。
• 1. 是producer-consumer问题的简化版 • semphore empty=1, full=0 • 信号量初值必须说明 • 采集进程: • while(1){
• Seamphore stop,wait,mutex1,mutex2; • Stop=1;mutex1=1;mutex2=1;wait=1; • Int counter1=0,counter2=0; • Mutex1互斥信号量,用于锁counter1。 • Mutex2互斥信号量,用于锁counter2。 • stop 用于提出过桥请求。 • wait用于排队过桥,即用于给桥加锁。
Agent() int rr, rr1=4; while (1) { do
rr = random (3); while (rr == rr1);
rr1=rr; wait (done); if (rr == 0) {
put paper and tobacco; signal (PaperTobacco ); } else if (rr == 1) {
wait (full1) wait (s1)
copy data from buffer1 //单缓,无out指针,可写y=buffer1 signal (s1) signal (empty1) wait (empty2) wait (s2)
put data into buffer2 // buffer2=y signal(s2) signal (full2) }
• 进程A while(1){ P(s1); 拣黑子;
V(s2); }
进程B: while(1){
P(s2); 拣白子;
V(s1); }
• 4. 某银行提供一个服务窗口和10个等待的座 位。顾客到达银行时,若有空座位,则到取号 机上领取一个号,等待叫号。取号机每次允许 一位顾客使用。当营业员空闲时,通过叫号选 取一位顾客,并为其服务。顾客和营业员的活 动描述如下:
Process 营业员 while(TRUE)
{ P(s1); V(service); // 叫号; 为顾客提供服务;
}
• 5. 三个进程P1、P2、P3互斥使用一个包含 N(N>0)个单元的缓冲区。P1每次用 produce()生成一个正整数并用put()送入 缓冲区某个空单元中;P2每次用getodd() 从该缓冲区中取出一个奇数并用countodd() 统计奇数个数;P3每次用geteven()从该缓 冲区中取出一个偶数并用counteven()统计 偶数个数。请用信号量描述三个进程的同步 与互斥活动,并说明定义信号量的含义。
• Put process: while(1) {
wait (full2) wait (s2)
get data from buffer2 // z=buffer2 signal (s2) signal (empty2)
print data on printer }
• 3.在一个箱子里混装有数量相等的黑色围棋子 和白色围棋子,现要用自动分拣系统把黑子和 白子分开,该系统由两个并发执行的进程组成, 功能如下:
• 针对一个smoker与agent有两个同步关 系:
• 1)agent放了两样东西,smoker才能 抽烟---三个信号量
• 2)smoker把桌上东西拿走,agent才 能再放---信号量done,初值为1
semaphore PaperTobacco= 0; TobaccoMatch= 0; PaperMatch= 0; done =1;
get paper and tobacco; signal (done); }
smoker2 () /* has paper */ while(1) { wait (TobaccoMatch);
get tobacco and match; signal (done); } Smoker3 () /* has match */ while(1) { wait (PaperMatch); get paper and match; signal (done); }
• 东边要过桥的车:
•
P(stop);
•
P(mutex1);
•
Count1++;
•
If (count1==1) P(wait);
•
V(mutex1);
•
V(stop);
•
{过桥}
•
P(mutex1);
•
Count1--
•
If (count1==0) V(wait);
•
V(mutex1);
• 西边要过桥的车
• 要求说明每个信号量是用于解决什么互斥、 什么同步关系的。
Get
Copy
Put
A
B
卡片机
buffer1
C
D
buffer2
打印机
• 2. 互斥信号量 s1=1, s2=1; • (因为只有一个get、copy和put进程,故可不定
义互斥信号量) • 同步信号量4个: • full1=0, empty1=1; 为一对 • full2=0, empty2=1; 为一对
• Process 顾客 i:
• { 从取号机获取一个号码;
• 等待叫号;
• 获得服务;
•}
• Process 营业员
• while(TRUE)
•{
•
叫号;
•
为顾客提供服务;
•}
• 请用P、V操作实现上述过程中的互斥与 同步。说明信号量的含义并赋初值。
• 两个互斥互斥关系: • 一台叫号机--mutex=1 • 10个座位-- empty=10
• 两个同步关系: • 有顾客营业员才叫号s1=0 • 营业员先叫号,顾客才能被服务service
=0
• Process 顾客 i:
• { P (empty);
• P(mutex);
• 从取号机获取一个号码;
• V(mutex);
• V(s1);
• P(service); //等待叫号;
• V (empty); • 获得服务; •}
• 顾客进程: while (1) {
p(sn); eat;
v(sn); p(s1);
pay; v(s2); p(s3) leave; }
收银员进程: do { p(s2); get the money; v(s1); v(s3); } while(1);
7.独木桥问题:东西方向汽车过独木桥, 为了保证安全,只要桥上无车,则允许 一方的汽车过桥,待一方的汽车全部通 过后,另一方的汽车才允许过桥。但, 当另一方提出过桥时,要阻止对方未上 桥的后继车辆,待桥面上的汽车过完桥 后,另一方的汽车开始过桥。适用信号
} •
P2进程: While(1){
P(odd); P(mutex); getodd(); V(mutex); V(empty); Countodd(); }
• P3进程: • While(1){ • P(even); • P(mutex); • geteven(); • V(mutex); • V(empty); • Counteven(); •}
•
P(stop);
•
P(mutex2);
•
Count2++;
•
If (count2==1) P(wait);
•
V(mutex2);
•
V(stop);
•
{过桥}
•
P(mutex2);
•
Count2--
•
If (count2==0) V(wait);
•
V(mutex2);
• 8. 设系统有三个抽烟者进程和一个供应 者进程。每个抽烟者进程不停地卷烟抽 烟。要抽烟他需要三种材料:烟草、纸 和火柴。一个抽烟者有纸,另一个有烟 草,第三个有火柴。供应者进程无限提 供三种材料,供应者进程每次将两种材 料放在桌子上,拥有另一种材料的抽烟 者取走两种材料抽烟,并给供应者一个 信号告诉他完成了,供应者进程会将另 外两种材料放在桌子上,本过程一直重 复着。用信号量描述三个抽烟者进程和 供应者进程。
– 进程A专门拣黑子,进程B专门拣白子;
– 每个进程每次只拣一个子,当一个进程在拣 子时不允许另一个进程去拣子;
– 当一个进程拣了一个棋子(黑子或白子)以 后,必须让另一个进程拣一个棋子(黑子或 白子),并要求A进程首先开始。
• 定义两个同步信号量源自文库1,s2;
• 因为要求进程A先开始,故S1初值为1;s2初 值为0;
6. 在某餐馆里有一个收银员,且同时最多 允许有30个顾客就餐,我们可以将顾客 和收银员看成是两类不同的进程。
为了利用PV操作正确地协调这两类进程之 间的工作,设置了四个信号量S1、S2、 S3和Sn,且初值分别为1、0、0和30。
有三个同步关系: ①收银员忙,顾客等---S1 ②无人付款,收银员等--S2 ③收银员收完钱,顾客可以离开---S3 一个互斥关系:30张餐桌---Sn
•}
• 2. 从读卡机上读进N张卡片,然后复制一份, 要求复制出来的卡片与读进的卡片完全一样。 该任务由三个进程get,copy和put及两个 缓冲区buffer1和buffer2完成。进程get的 功能是把一张卡片的信息从读卡机读入 buffer1;进程copy是把buffer1中的信息 复制到buffer2;进程put的功能是取出 buffer2中的信息并从打印机上打印。
•
• get process: while (1) {
read data; wait (empty1); wait (s1)
put data into buffer1 //因为是单缓,故无in指针,可写为 // buffer1=x; signal (s1) signal (full1) }
• Copy process: while (1) {
put match and tobacco; signal (MatchTabacco);
}
else { put paper and match; signal (PaperMatch);
} Smaker1 () /* has match */ while(1) { wait (PaperTobacco);
wait (empty); put data into buffer; //单缓,无in指针,可写为 buffer=x
signal (full);}
• 计算进程: • While(1){
wait (full); get data from buffer;
// 单缓,无out指针,可写为 y=buffer signal (empty);
• 对buffer的互斥信号mutex=1
• P1生产,P2消费奇数,一对同步信号量 odd=0, empty=N;
• P1生产,P2消费偶数一对同步信号量 even=0, empty=N;
• P1进程: int num; while(1){ num=produce(); P(empty); P(mutex); put(); V(mutex); if (num%2) V(odd); else V(even);
• 1. 在测量控制系统中的数据采集任务时, 把采集的数据送一个单缓冲区;计算任务 从该缓冲区中取出数据进行计算。利用信 号量实现两者共享缓冲区的同步算法。
• 1. 是producer-consumer问题的简化版 • semphore empty=1, full=0 • 信号量初值必须说明 • 采集进程: • while(1){