5个经典PV操作题(附答案)

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

repeat

Wait(readers);
Wait(mutex);
消掉登记,离开阅览室
Signal(mutex);
Signal(seats)
until false;

end;

parend

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);

}

 

 

  • 75
    点赞
  • 741
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
操作系统中的PV操作是指进程之间通过信号量来实现同步和互斥的一种机制。PV操作主要包括信号量的P操作和V操作。 P操作又称为申请操作。当进程需要使用一个资源时,它需要执行P操作。P操作会检查该资源的信号量值,若值大于0,则表示资源可用,进程可以继续执行,并将信号量值减1;若值等于0,则表示资源不可用,进程需要等待。 V操作又称为释放操作。当进程释放一个资源时,它需要执行V操作。V操作会将该资源的信号量值加1。如果有其他进程正在等待该资源,V操作会唤醒其中一个进程,使其继续执行。 下面通过一个简单的例子来说明PV操作的使用: 假设有两个进程P1和P2,它们都需要访问一个临界资源,同时只能有一个进程访问该资源。 1. 初始化一个二进制信号量sem,初始值为1,表示资源可用。 2. P1进程执行时,先执行P操作,检查sem的值。由于sem的值为1,P1可以继续执行,sem的值变为0,表示资源已被占用。 3. P1进程访问资源进行操作。 4. P1进程操作完成后,执行V操作,将sem的值加1。由于没有其他进程等待该资源,操作结束。 5. P2进程执行时,先执行P操作,检查sem的值。由于sem的值为1,P2可以继续执行,sem的值变为0,表示资源已被占用。 6. P2进程访问资源进行操作。 7. P2进程操作完成后,执行V操作,将sem的值加1。由于没有其他进程等待该资源,操作结束。 通过PV操作的使用,可以实现进程之间的同步和互斥。只有当资源可用时,进程才能访问该资源,否则需要等待。这样可以有效避免进程之间的冲突和竞争。对于并发程序的正确执行具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值