操作系统P,V(wait,signal原语)操作讲解,以及两个例题(答案仅供参考)

操作系统的pv操作是很核心的概念。

临界区 : 我们把并发进程中与共享变量有关的程序段称为临界区。

信号量 : 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

进程的互斥:是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。
进程的同步:是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

pv操作又称wait,signal原语。
主要是操作进程中对进程控制的信息量的加减控制

wait用法:
wait(num),num是目标参数,wait的作用是使其(信息量)减一。
如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
signal用法:
signal(num),num是目标参数,signal的作用是使其(信息量)加一。
如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

一下提供两个例题,答案仅供参考。
1.有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。
操作系统P,V(wait,signal原语)操作讲解,以及两个例题(答案仅供参考)_第1张图片
首先提供一份我参考的答案网址
https://www.ppkao.com/tiku/shiti/10058883.html
然后·我个人理解的代码(解释基本在注释中):

定义seats为阅览室剩余座位,初值100

定义r_num为当前阅览室内读者人数,初值0

定义互斥描述 m,初值1

定义读者进入的进程定义为in(),反之out()

则:in(){//进入

while(1){

wait(seats);//seats>0有位置,否则离开

位置信息量减1,
填表是大家的共享资源,既是临界区
wait(m);开始填表;
signal(m)结束填表;
读者信息量加1;

signal(r_num)//添加一个读者人数,r_num+1

}

}

out(){

while(1){

wait(r_num)//读者数>0有人离开,减少一个读者人数,r_num-1

读者信息量减1;

wait(m);拿其表;
signal(m)勾选表,放下表;
消除表登记信息;

位置信息量加1;

signal(seats);//人离开阅览室,释放位置资源

}

}


2.这个题是按我自己理解写的,无任何参考(可能有错)

操作系统P,V(wait,signal原语)操作讲解,以及两个例题(答案仅供参考)_第2张图片
(1)小问可以看成经典的生产消费模型,
共用资源是独木桥,且同时只允许一人通过。

定义上桥为walkUp(),是生产者进程,
反之walkDown(),是消费者进程。

定义桥上有人isTrue初值为0
定义桥上无人isFalse初值为1

walkUp(){
while(1){
P(isFalse);//无人则上桥,代表现在有人了
无人信息减一;
有人加一代表有人;
V(isTrue);//有人了
}
}
walkDown(){

while(1){
P(isTrue);//现在走下来了,就没人了

有人信息减一,代表无人
V(isFalse);//加一代表没人
}
}

(2)小问

设信号量: MUTEX=1 (东西方互斥)
      MD=1    (东向西使用计数变量互斥)
   MX=1    (西向东使用计数变量互斥)
设整型变量: CD=0  (东向西的已上桥人数)
        CX=0  (西向东的已上桥人数)

从东向西:
P (MD)
IF (CD=0)
{P (MUTEX)  }
CD=CD+1
V (MD)
过桥
P (MD)
CD=CD-1
IF (CD=0)
{V (MUTEX)  }
V (MD)
从西向东:
P (MX)
IF (CX=0)
{P (MUTEX)  }
CX=CX+1
V (MX)
过桥
P (MX)
CX=CX-1
IF (CX=0)
{V (MUTEX)  }
V (MX)

有些不规范,如果有错,希望大家多多指教!

加油!

ps:第二次修改,学艺不精,例题坑了(少写,有错)部分同学!不好意思!现在改了,我把例题及一些其他概念也补充了一些,虽然可能还是不太好!

你可能感兴趣的:(其他编程知识,技术性)