![016d0612c61a99272d9af6373efbb49c.png](https://img-blog.csdnimg.cn/img_convert/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();
}
最后,这种进程同步互斥的题目真的不是很难
一定要练习几下,注意自己的理解,这样就没什么问题了。
加油