(注:参考教材:计算机操作系统第四版 西安电子科技大学出版社)
问题描述:一群生产者进程在生产产品,并将这些产品提供给消费者去消费。为了使生产者进程与消费者进程能够并发进行,在两者之间设置一个具有n个缓冲区的缓冲池,生产者进程将产品放入一个缓冲区中;消费者可以从一个缓冲区取走产品去消费。尽管所有的生产者进程和消费者进程是以异方式运行,但它们必须保持同步:当一个缓冲区为空时不允许消费者去取走产品,当一个缓冲区满时也不允许生产者去存入产品。
解决方案:我们这里利用一个一个数组buffer来表示这个n个缓冲区的缓冲池,用输入指针和输出指针+1来表示在缓冲池中存入或取出一个产品。由于这里的缓冲池是循环缓冲的,故应把in和out表示成:in = ( in +1 ) % n (或把out表示为 out = ( out +1 ) % n )当( in +1) % n= out的时候说明缓冲池满,in = out 则说明缓冲池空。在这里还要引入一个整型的变量counter(初始值0),每当在缓冲区存入或取走一个产品时,counter +1或-1。那么问题的关键就是,把这个counter作为临界资源处理,即令生产者进程和消费者进程互斥的访问它。
首先解释一下信号量(Semaphores)机制。这是荷兰学者Dijkstra在1965年提出的一种有效的进程同步工具。Dijkstra定义的整型信号量是一个用于表示资源数目的整型量,不同于一般的整型量,它除了初始化以外只能通过两个标准的原子操作(Atomic Operation)waits(S)和signal(S)来访问。很长时间以来这两个操作分别被称为P、V操作。wait和signal操作描述如下:
wait(S){
while (S <= 0); //无可用资源
S-- ;
}
signal(S){
S-