1.生产者和消费者问题
1.1 生产者和消费者背景
- 图示:
- 只有缓冲区没满时,生产者才能把产品放在缓冲区,否则等待(同步)。
- 只有缓冲区不空时,消费者才能取出产品,否则必须等待(同步)。
- 缓冲区是临界资源,各进程必须互斥访问(互斥)。
- 信号量机制可以实现互斥和同步,对这类资源的申请和释放来时实现生产者和消费者问题。
1.2 生产者和消费者解决
- 设置信号量,并确定初值。互斥信号量初值一般为0,同步信号量初值一般为1。
semaphore mutex=1;
semaphore empty=n;
semaphore full=0;
producer(){
while(1){
生产一个产品;
p(empty);
p(mutex);
放入缓冲区;
v(mutex);
v(full);
}
}
consumer(){
while(1){
p(full);
p(mutex);
放入缓冲区;
v(mutex);
v(empty);
使用产品;
}
}
- 不能改变PV操作的顺序:实现同步的P操作一定要放在实现互斥的P操作之前,否则出现死锁。生产者等待消费者释放空闲缓冲区,消费者又等待生产者释放临界区。生产者和消费者循环等待被对方唤醒,出现死锁。
2.哲学家进餐问题
2.1 哲学家进餐问题背景