一、生产者-消费者问题
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)生产者、消费者共享一个 初始为空、大小为 n 的缓冲区 。只有 缓冲区没满 时,生产者才能把产品放入缓冲区,否则必须等待。只有 缓冲区不空 时,消费者才能从中取出产品,否则必须等待。缓冲区是临界资源,各进程必须 互斥地访问 。
二、多生产者-多消费者问题(分苹果和桔子)
同步关系:爸爸-妈妈
互斥关系: 爸爸-女儿 妈妈-儿子
三、吸烟者问题
semaphore offer1 = 0;
semaphore offer2 = 0;
semaphore offer3 = 0;
semaphore finish = 0;
int i = 0;
provider()
{
while(1){
if(i==0){
将组合一放桌上;
V(offer1);
}else if(i==1){
将组合二放桌上;
V(offer2);
}else if(i==2){
将组合三放桌上;
V(offer3);
}
i=(i+1)%3;
P(finish);
}
}
四、读者-写者 问题
semaphore rw = 1; //用于实现对共享文件的互斥访问
int count = 0; //记录当前有几个读进程在访问文件
semaphore mutex = 1;//用于保证对count变量的互斥访问
writer(){
while(1)
{
P(rw); //写之前加锁
write();
V(rw); //写完以后解锁
}
}
reader()
{
while(1)
{
P(mutex); //各读进程互斥访问count
if(count==0) //由第一个读进程负责
P(rw); //读之前“加锁”
count++; //访问文件前读进程数+1
V(mutex);
read();
P(mutex); //各读进程互斥访问count
count--; //访问文件的读进程数-1
if(count==0) //由最后一个读进程负责
V(rw); //读完了‘解锁’
V(mutex);
}
}
五、哲学家进餐问题
注意死锁的问题