1、 设公共汽车上,司机和售票员的活动分别是:司机的活动:启动车辆;正常行车;到站停车;售票员的活动:关车门;售票;开车门;请用记录型信号量机制实现上述问题的同步。
解答:
Vars1,s2:semaphore:=0,0;(2分)
/*s1表示是否允许司机启动汽车,s2表示是否允许售票员开门*/
begin
parbegin
driver: begin
repeat
wait(s1);
启动车辆;
正常行车;
到站停车;
signal(s2);
until false;
end
busman: begin
repeat
关车门;
signal(s1);
售票;
wait(s2);
开车门;
上下乘客;
until false;
end
parend
end
2、 请用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
将独木桥的两个方向分别标记为A和B;并用整形变量countA和countB分别表示A、B方向上已在独木桥上的行人数,初值为0;再设置三个初值都1的互斥信号量:SA用来实现对countA的互斥访问,SB用来实现对countB的互斥访问,mutex用来实现两个方向的行人对独木桥的互斥使用。则具体描述如下:
Var SA,SB,mutex:semaphore:=1,1,1;
CountA,countB:integer:=0,0:
begin
parbegin
processA: begin
wait(SA);
if(countA=0) thenwait(mutex);
countA:=countA+1;
signal(SA);
过独木桥;
wait(SA);
countA:=countA-1;
if (countA=0) then signal(mutex);
signa(SA);
end
processB: begin
wait(SB);
if(countB=0) thenwait(mutex);
countB:=countB+1;
signal(SB);
过独木桥;
wait(SB);
countB:=countB-1;
if (countB=0) then signal(mutex);
signa(SB);
end
parend
end
3、有一阅览室,共有100个座位。为了很好利用它,读者进入时必须先在登记表上进行登记。该表表目设有座位号和读者姓名;离开时再将其登记项摈除。试问:
⑴为描述读者的动作,应设哪几个进程?它们之间的关系是什么?
⑵试用P、V操作描述进程之间的同步或算法。
(1)答:(1)应设读者进门和读者出门2个进程,它们之间是互斥关系
(2)
semaphore seats=100,readers=0,mutex=1;begin
parbegin
getin:begin
repeat
Wait(seats);
Wait(mutex);
填写登记表,进入阅览室读书
Signal(mutex);
Signal(readers)
until false;
end;
getout:begin
parendrepeat
Wait(readers);Wait(mutex);消掉登记,离开阅览室Signal(mutex);Signal(seats)until false;end;
end
4、某自动质量检测系统有三个进程Q、A、B组成。进程Q每次取一件产品检测,把检测后的产品存放在货架F上,F的容量为每次只能存放一件产品。若货架上存放的是合格产品则让进程A取出,并在产品上贴标签后包装;若货架上存放的是不合格产品则让进程B取出后,将其丢入废物箱。回答下列问题:
(1)写出用PV操作管理时应定义的信号量及初值: ① 。
(2)完成下列算法中的填空,使它们能按上述要求正确地并发执行。
进程Q: | 取一件产品检测; ② ; F:=检测后的产品 If F=合格产品 then ③ else ④
| 进程A: | _____⑤ ; y:=F中产品 ; ______⑥ ; 对产品贴标签且包装; | 进程B: | ____⑦ ; z:=F中产品; ____⑧ ; 把产品丢入废物箱; |
解:(1) ①定义信号量empty,fulla,fullb,初值分别为1,0,0。
(2) ② P(empty); ③ V(fulla); ④ V(fullb);
⑤ P(fulla); ⑥ V(empty);
⑦ P(fullb); ⑧ V(empty);
5、《操作系统》课程的期末考试即将举行,假设把学生和监考老师都看作进程,学生有N人,教师1人。考场门口每次只能进出一个人,进考场的原则是先来先进。当N个学生都进入了考场后,教师才能发卷子。学生交卷后即可离开考场,而教师要等收上来全部卷子并封装卷子后才能离开考场。
(1)问共需设置几个进程?
(2)请用P、V操作解决上述问题中的同步和互斥关系。
解:
semaphore S_Door; // 能否进出门,初值1
semaphore S_StudentReady; // 学生是否到齐,初值为0
semaphore S_ExamBegin; // 开始考试,初值为0
semaphore S_ExamOver; // 考试结束,初值为0
int nStudentNum = 0; // 学生数目
semaphore S_Mutex1; //互斥信号量,初值为1
int nPaperNum = 0; // 已交的卷子数目
semaphore S_Mutex2; //互斥信号量,初值为1
void student( )
{
P(S_Door);
进门;
V(S_Door);
P(S_Mutex1);
nStudentNum ++; // 增加学生的个数
if(nStudentNum == N) V(S_StudentReady);
V(S_Mutex1);
P(S_ExamBegin); // 等老师宣布考试开始
考试中…
交卷;
P(S_Mutex2);
nPaperNum ++; // 增加试卷的份数
if(nPaperNum == N)
V(S_ExamOver);
V(S_Mutex2);
P(S_Door);
出门;V(S_Door);
}
void teacher( )
{
P(S_Door);
进门;
V(S_Door);
P(S_StudentReady); //等待最后一个学生来唤醒
发卷子;
for(i = 1; i <= N; i++)
V(S_ExamBegin);
P(S_ExamOver); //等待考试结束
封装试卷;
P(S_Door);
出门;
V(S_Door);
}