生产者-消费者关系
生产者-消费者关系个人首先在操作系统中接触到,它是信号量(Semaphore,资源使用情况的抽象)机制的一种应用。
注意:信号量在 C 语言中是一个结构体型变量,其中 int 型 value 包含表示可用资源数,value = 0:无可用资源,value < 0:有|value|个进程等待此资源。还有 L 为等待此类资源的进程 PCB 表链。一类资源对应一种信号量。
生产者-消费者关系中包含一组生产者和一组消费者,两种角色并发地操作一个共享的缓冲池。生产者向缓冲池中放入数据,消费者从缓冲池中取出并消费数据。缓冲池可以缓解生产者和消费者之间的性能差,但不幸的是缓冲池有一定容量,生产者无法向满的缓冲池再放入数据,消费者也无法从空的缓冲池中取出数据。关系如下:
操作系统中用信号量机制解决生产者-消费者问题
生产者-消费者模式是经典的并发设计模型,操作系统可以对信号量进行 P-V 操作来实现进程间并发,其中 P 操作表示请求系统分配一个单位的资源,V 操作释放一个单位的资源。假设有个信号量 S,由信号量定义可知,P(S) 指请求 S 的一个单位资源,即 S = S - 1;V(S) 释放 S 的一个单位资源,即 S = S + 1。
生产者在向缓存池中放入数据时先检查缓冲池中是否还有容量,对应的先需要执行 P(empty),即向缓冲池请求一个单位资源,每放入一个数据就有 empty.value -= 1。empty 表示缓冲池空闲的资源,empty 值为 0 就表示缓冲池为空,empty 值一般初始为缓冲池的总容量。放入后需要 V(full) 操作来告诉缓冲池放入了新的数据,其中 full 信号量表示缓冲池中已占有的资源,full 值初始为 0。
消费者消费数据时确保缓冲池容量不能为空。先通过 P(full) 从缓冲池中取出资源,然后通过 V(empty) 操作返回资源。