OS-李治军-L16-进程同步与信号量
进程同步与信号量
引例:
多进程合作要沟通好。
总不能售票员还在卖票的时候就开车。
在停车的时候,司机在等售票员的一个信号,这样他才可以开车。
在开车的时候,售票员也在等司机的一个信号,这样他才可以开门。
形成一种合理有序向前推进的工作。

进程同步的核心:等!等信号!

但是,只发信号还是解决不了全部问题。
如果框满了,来了两个生产者sleep在这里,然后来了一个消费者,发出框没满的信号量。
然后你怎么唤醒别的进程呢?如果一起唤醒,那就会有冲突,如果只唤醒一个,那其他人就一直sleep在那里。
所以不仅要记录框里面东西的数量,所以还需要记录更全面的信息,综合成为最终的信号量。
下面就设计一个量,来解决上面的问题。
再引入sem记录,等的人数,sem=-1表示有一个人sleep
来了两个sleep的人,就sem=-2了。
然后来了个消费者,消费完了一个东西,发现sem=-2,有两个进程在等待,就在阻塞队列里唤醒一个人,然后sem=-1。
然后又消费了一个东西,再唤醒一个人,令sem=0了。
所以合理的方法是使用信号来进行唤醒,而不是仅仅是counter,counter只能表示当前资源容量,但不能表示等待的进程数目。
如果消费者又消费了一个东西,就令sem=1。
这时候再来一个生产者,就sem=0,不需要等待。
所以,信号量就是表明当前缓冲区容量(带符号的)。
实现:数据结构中包含量、以及当前资源个数。

S函数的写法:发现还欠着货,就唤醒别人。这里没有做队列的切换。
S(semaphore s)
{
s.value--;
if(s.value<0){
sleep(s.queue);}
}
}
用信号量解决生产者消费者问题
这里引入了一个mutex进行原子操作,防止没写完、读完就被别人打扰。


浙公网安备 33010602011771号