信号量

生产者—消费者问题

在操作系统中,生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等。
生产者--消费者问题表述如下:有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上,故又叫有界缓冲问题。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;类似地,只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。
缓冲区可以解决处理器处理速度和输出设备输出不匹配的问题

引入信号量

出现不正确结果不是因为并发进程共享了缓冲区,而是因为它们访问缓冲区的速率不匹配,或者说pi,cj的相对速度不协调,需要调整并发进程的进行速度。
并发进程间的这种制约关系称进程同步,交往的并发进程之间通过交换信号或消息来达到调整相互速率,保证进程协调运行的目的。
操作系统实现进程同步的机制称同步机制,它通常由同步原语组成。不同的同步机制采用不同的同步方法,迄今己设计出许多种同步机制,其中最常用的同步机制:信号量,管程和消息传递。

信号量(semaphore)

在多个相互合作的进程之间使用简单的信号来同步,一个进程被强制停止在某一特定状态,直到收到专门的信号为止。
一个信号量被定义为一个整型变量,在其上定义了以下三个操作:
 可以被“初始化”为一个非负数;
(P操作) Wait操作将信号量值减1后,若该值为负,则执行wait操作的进程等待;
(V操作) Signal操作将信号量值增1后,若该值非正,则执行signal操作的进程唤醒等待进程。
(信号量表示可使用资源个数)

用信号量实现进程间互斥

对于两个并发进程,互斥信号量的值仅取1、0和-1三个值:
 若mutex = 1,表示没有进程进入临界区;
 若mutex = 0,表示有一个进程进入临界区;
 若mutex = -1,表示一个进程进入临界区,另一个进程等待进入。

生产者—消费者问题举例

桌上有一只盘子,每次只能放入一只水果。爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔于(orange),一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。

这个问题实际上是两个生产者和两个消费者被连结到仅能放一个产品的缓冲器上。生产者各自生产不同的产品,但就其本质而言,他们是同一类生产者。而消费者则各自取需要的产品消费,他们的消费方式不同。

读者—写者问题

有两组并发进程:读者和写者,共享一个文件F,要求:
 允许多个读者同时执行读操作;
 任一写者在完成写操作之前不允许其它读者或写者工作;
 写者执行写操作前,应让已有的写者和读者全部退出。
单纯使用信号量不能完成读者与写者问题,必须引入计数器rc对读进程计数s是用于对计数器rc互斥的信号量W表示允许写的信号量。
(s控制对rc的访问)