分享两个用PV操作(signal,wait原语)实现的操作系统综

2020-05-14  本文已影响0人  Your7Maxx

PV操作是操作系统设计中一个核心的概念,PV操作同时与信号量紧密相连。很多经典的问题讨论,由引入了信号量机制而得到很好的解决。

几个概念:

1、临界区:并发进程中与共享变量有关的程序段。
2、信号量: 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。
3、进程的互斥:指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。
4、进程的同步:在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

PV操作也就是signal、wait原语的作用,主要就是对进程控制的信息量的加减控制。

wait用法:

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

signal用法:

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

例题示例:

(一)系统中有三个进程GET、PRO和PUT,共用两个缓冲区BUF1和BUF2。假设BUF1中最多可放11个信息,现已放入了两个信息;BUF2最多可放5个信息,目前为空。GET进程负责不断地将输入信息送入BUF1中,PRO进程负责从BUF1中取出信息进行处理,并将处理结果送到BUF2中,PUT进程负责从BUF2中读取结果并输出。试写出正确实现GET、PRO、PUT的同步与互斥的算法(要求:(1)用类C语言描述,条理清楚,注释恰当;(2)信号量原语统一使用wait和signal)。

代码:

semaphore
empty1=9;  //空buf1的数目
full1=2;  //有数据的buf1的数目
empy2=5;  //空buf2的数目
full1=0;  //有数据的b2的数目
mutex1=mutex2=1: //初始化互斥信号量为1

int main(){
Cobegin //并发开始
GET();
PRO();
PUT();
Coend //并发结束
}
//GET函数:
void GET(){
while(1){
wait(empty1);
wait(mutex1);
->将信息送入BUF1中
signal(mutex1);
signal(full1);
}}
//PRO函数:
void PRO(){
while(1){
wait(full1);
wait(mutex1);
->对取出的信息进行处理
signal(mutex1);
signal(empty1);
wait(empty2);
wait(mutex2);
->将结果送到BUF2中
signal(mutex2);
signal(full2);
}}
//PUT函数:
void PUT(){
while(1){
wait(full2);
wait(mutex2);
->将BUF2中读取结果并输出
signal(mutex2);
signal(empty2)
}}

(二)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。解释你定义的信号量的作用,并给出合适的初值:

代码:

semahpore  empty=N,even=0,odd=0,mutex=1
//P1:
while(1){
x=produce();
wait(empty);
wait(mutex);
put(x);
signal(mutex);
if (x%2 == 0)
    signal(even);
else
    signal(odd)

//P2:
while(1){
wait(odd);
wait(mutex);
getodd();
countodd();
wait(odd);
signal(mutex)
signal(empty)

//P3:
while(1){
wait(even);
wait(mutex);
geteven();
counteven();
wait(even);
signal(mutex)
signal(empty)
上一篇 下一篇

猜你喜欢

热点阅读