作业帮 > 数学 > 作业

操作系统写pV原语的思路以生产者消费者为题解说

来源:学生作业帮 编辑:神马作文网作业帮 分类:数学作业 时间:2024/11/16 09:12:27
操作系统写pV原语的思路以生产者消费者为题解说
希望简单明了一看就懂一写就会
操作系统写pV原语的思路以生产者消费者为题解说
生产者-消费者问题
在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题,而生产者-消费者问题是其中一个有代表性的进程同步问题.下面我们给出了各种情况下的生产者-消费者问题,深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助.
(1)一个生产者,一个消费者,公用一个缓冲区.
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为1.
full——表示缓冲区中是否为满,初值为0.
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往Buffer;
V(full);
}
(2)一个生产者,一个消费者,公用n个环形缓冲区.
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为n.
full——表示缓冲区中是否为满,初值为0.
设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区.
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往buffer(in);
in=(in+1)mod n;
V(full);
}
(3)一组生产者,一组消费者,公用n个环形缓冲区
在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区.
定义四个信号量:
empty——表示缓冲区是否为空,初值为n.
full——表示缓冲区中是否为满,初值为0.
mutex1——生产者之间的互斥信号量,初值为1.
mutex2——消费者之间的互斥信号量,初值为1.
设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区.
生产者进程
while(TRUE){
生产一个产品;
P(empty);
P(mutex1);
产品送往buffer(in);
in=(in+1)mod n;
V(mutex1);
V(full);
}
需要注意的是无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒.应先执行同步信号量的P操作,然后再执行互斥信号量的P操作,否则可能造成进程死锁.