进程互斥与同步计算机操作系统_操作系统同步互斥大题

016d0612c61a99272d9af6373efbb49c.png

操作系统进程同步互斥问题

PV操作加信号量来实现进程的同步互斥

解题步骤

首先要分析题目中近程的同步关系和互斥关系

同步关系 用前V后P实现

互斥关系,一般都是对于一个缓冲区或者本质上是缓冲区的变量进行访问,这时候就要用PV操作将对于这个信号量的访问夹在中间

解题精髓就这两句

下面以408 2009年的真题为例进行讲解

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

首先 很明确的就是三个进程互斥的使用缓冲区,所以要设置一个互斥信号量mutex,

然后缓冲区单元是N,所以要设置一个信号量empty=N

然后P1进程分别和统计偶数和统计奇数的进程形成同步关系(理解,就是只有P1进程生成偶数,统计偶数的进程才能运行..)

所以设置两个同步信号量even =0,odd=0

下面就进行代码书写

//semaphore这个单词请一定要会写,不然太low了


semaphore odd = 0, even = 0, empty = N, mutex = 1;
P1( )
{ x = produce(); ∥生成一个数

P(empty); ∥判断缓冲区是否有空单元

P(mutex); ∥缓冲区是否被占用

Put();

V(mutex); ∥释放缓冲区

if(x%2 == 0)

V(even); ∥如果是偶数, 向 P3 发出信号

else V(odd); ∥如果是奇数, 向 P2 发出信号
} P2( ) {
P(odd); ∥收到 P1 发来的信号,已产生一个奇数

P(mutex); ∥缓冲区是否被占用

getodd();

V(mutex); ∥释放缓冲区

V(empty); ∥向 P1 发信号,多出一个空单元

countodd();
}

P3( ) {
P(even); ∥收到 P1 发来的信号,已产生一个偶数

P(mutext); ∥缓冲区是否被占用

geteven();

V(mutex); ∥释放缓冲区

V(empty); ∥向 P1 发信号,多出一个空单元

counteven();
}

最后,这种进程同步互斥的题目真的不是很难

一定要练习几下,注意自己的理解,这样就没什么问题了。

加油

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值