解惑1:
为使多个进程能互斥的访问某临界资源,只须为该资源设置
一个互斥信号量 mutex,初值为 1(代表临界资源只有一个)
mutex初值为1.取值范围为[-1,0,1]
当mutex=1时,表示两个进程皆未进入需要互斥访问的临界区;
当mutex=0时,表示有一个进程进入临界区运行,另一个必须等待,挂入阻塞队列;
当mutex=-1时,表示有一个进程正在临界区运行,而另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒。
mutex为0和为1的区别是:为0的时候等待的进程没有申请该资源,为-1的时候申请了,即进行了P操作,所以阻塞了。
解惑2:
信号量的初值表示系统中资源的数目。
解惑3:
empty代表空闲缓冲区的数量;full代表产品的数量。
根据进程同步的前V后P。
缓冲区没满,生产者才可以生产
缓冲区没空,消费者才可消费。设置同步信号量:full=0,empty=N。
从而画出下面的图:
消费者消费产品,非空闲缓冲区个数减一,所以针对full是P操作。空闲缓冲区加一,所以针对empty是V操作。
生产者生产产品,使用一个空闲缓冲区,所以空闲缓冲区减一,所以针对empty是P操作,但是非空闲缓冲区个数加一,所以针对full是V操作。
那么,为什么生产者消费者问题,为什么不能用一个信号量实现同步?
解释一:
如果缓冲区满,生产者是不能生产的,所以生产者进程受到消费者进程的制约;
如果缓冲区空,消费者是不能消费的,所以消费者进程受到生产者进程的制约
所以 需要两个同步信号量
解释二:
首先,假设只有一个同步信号量empty=5,也就是缓冲区有5个空位;
生产者每次生产就申请一个空位,即p(empty)。
假设5次生产之后,满了,临界区满了=生产者不生产了,现在生产者被阻塞,cpu切换到消费者;
消费者在每次消费成功后,执行v(buffer),但是在消费前并没有受到任何制约!这时候的效果就是,消费者可以无限消费,然后empty的值会无限增加,消费者已经消费了刚才生产的5个产品之后都还可以继续消费。
或者假设现在有另一个同步信号量full=0,也就是,缓冲区有0个产品,但是不知道缓冲区有多大的限制。现在每次生产都在生产之后执行v(full),也就是full++,然而full可以一直增加,因为没有上限,也就是消费者被制约但是生产者没被制约。
2个信号量,一个限制生产者,一个限制消费者;1个信号量无法同事限制他们2个。
解惑4
实现写优先代码:
当顺序为:读者1-写者1-读者2时:
读者进程在读文件时,发生进程调度,写者进程执行,此时,写者进程阻塞在P(rw)中,当再有读者进程2执行时,会阻塞到P(W)中,此时,读者进程释放rw后,写者进程最先被唤醒,然后执行,实现了先来先服务。