2009 操作系统 inode操作系统 解答题
第 45 题

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

[tag_link]

[tag_link]

互斥资源:缓冲区只能互斥访问,因此设置互斥信号量 mutex。

同步问题: P 1 、 P 2 因为奇数的放置与取用而同步,设同步信号量 odd; P 1 、 P 3 因为偶数的放置与取用而同步,设置同步信号量 even; P 1 、 P 2 、 P 3 因为共享缓冲区,设同步信号量 empty, 初值为 N。程序如下:

semaphore mutex = 1;
semaphore odd = 0, even = 0;
semaphore empty = N;

//生产者:产生数字放入缓冲区
P1()
{
    while (true)
    {
        x = produce();        
        P(empty);        //申请空闲位置
        P(mutex);        //互斥访问缓冲区
        put();
        V(mutex);

        if (x % 2 == 0)
            V(even);
        else
            V(odd);
    }
}

//奇数消费者
P2()
{
    while (true)
    {
        P(odd);
        P(mutex);
        getodd();
        V(mutex);
        V(empty);
        countodd();
    }
}

//偶数消费者
P3()
{
    while (true)
    {
        P(even);
        P(mutex);
        geteven();
        V(mutex);
        V(empty);
        counteven();
    }
}