进程同步与信号量
一.进程合作
每个进程都有自己的执行方案,自己的一套执行程序,但不是每个进程程序都可以随便执行的,有时候需要停下来等待,需要另外的进程发送一些信号,才能继续执行
二.等待是进程同步的核心
停更加重要,找到停之后思考下一步就可以找到走了,先分析哪里会停,再分析哪里会发信号
消费者C执行第一次循环唤醒了P1,消费者C执行第二次循环counter!=0不会进入休眠,counter减一
这时counter!=BUFFER_SIZE-1,counter==BUFFR_SIZE-2无法唤醒P2
三.信号量
信号量记录更加复杂的信号
(4)C再执行1次循环,发现1个进程等待,再wakeup 1个
(5) C再次执行1次循环,不再 wakeup,因为没有进行在等待,此时再来P3也不会weakup,因为并没有进程在等待
总结:当执行P时sem--, 执行C时sem++,sem<0时P休眠,sem<=0时唤醒P
信号量的当前值说是2,有2个资源可以使用
信号量的当前值说是-2,有2个进程等待资这个资源
V(semaphore s)
{
s.value++;
if(s.value<=0){
wakeup(s.queue);
}
}
empty:空闲缓冲区,full:已经生产的内容个数,mutex:互斥信号量
生产者 Producer P(empty)首先测试 空闲缓冲区是为0,为0表示缓冲区已满,生产者进入休眠,消费者 Consumer V(empty)增加空闲缓冲区,唤醒生产者,消费者 Consumer P(full)测试生产个数是否为0, 为0消费者进入休眠,生产者的V(full)怎加生产个数,唤醒消费者,P(mutex)mutex=1进入休眠mutex=0,不允许其它进程进入共享缓冲区,V(full)进行唤醒允许,mutex=1,允许其它进程进入