首页 > 试题广场 >

设有一缓冲池 P , P 中含有 20 个可用缓冲区,一个输

[问答题]

设有一缓冲池 P , P 中含有 20 个可用缓冲区,一个输入进程将外部数据读入 P ,另有

一个输出进程将 P 中数据取出并输出。若进程每次操作均以一个缓冲区为单位,试用记录

型信号量写出两个进程的同步算法。

Semaphore empty=20; //空缓冲区的大小
Semaphore full=0;  //有数据的缓冲区的大小
Semaphore mutex=1;  //互斥信号量
int in=0,out=0; 

Input()
{
    while(true)
    {
                produce an item in nextp; //产生一个商品暂存在nextp中
        wait(empty);
        wait(mutex); 
                p[in]=nextp; 
            in=(in+1)%20; 
        signal(mutex);
        signal(full); 
    }  
}
Output()
{
    while(true)
    {
        wait(full);
        wait(mutex); 
        nextc=p[out]; 
                out=(out+1)%20; 
        signal(mutex); 
        signal(empty); 
    }
}
 

编辑于 2020-10-12 00:39:34 回复(0)
与生产者和消费者问题一样,只是 empty 的初始值设为 20 即可
发表于 2017-05-16 21:07:31 回复(0)
void put()
{
    while(true)
    {
        wait(empty);
        wait(mutex);
        将数据放入缓冲区buffer[in];
        signal(mutex);
        signal(full);
    }
}
void get()
{
    while(true)
    {
        wait(full);
        wait(mutex);
        从缓冲区buffer[out]取走一个数据;
        signal(mutex);
        signal(empty);
    }
}
semphore mutex=1,empty=n;full=0;
message buffer[n];
int in=0,out=0;
void main{
    parbegin(put,get);
}


发表于 2020-06-29 11:53:48 回复(0)
void put()
{
    while(1)
    {
        wait(empty);
        wait(mutex);
        // write data...
        signal(mutex);
        signal(full);
    }
}
void get()
{
    while(1)
    {
        wait(full);
        wait(mutex);
        // read data...
        signal(mutex);
        signal(empty);
    }
}
void init()
{
    sem empty=20,full=0,mutex=1;
}
发表于 2020-06-23 14:09:34 回复(0)