|
信号量机制是一种有效的进程同步与互斥工具。目前主要有:整型信号量、记录型信号量、信号量集机制。
|
|
|
|
信号量是一个整型变量,根据控制对象的不同被赋予不同的值。信号量分为两类:公用信号量,实现进程间的互斥,初值为1或资源的数目;私用信号量,实现进程间的同步,初值为0或某个正整数。
|
|
|
信号量S的物理意义:S≥0表示某资源的可用数,若S<0,则其绝对值表示阻塞队列中等待该资源的进程数。
|
|
|
除了设置初值外,对信号量只能进行特殊的操作:P操作和V操作。P操作和V操作都是不可分割的原子动作,也称为原语,其中P操作表示申请一个资源,V操作表示释放一个资源。
|
|
|
P操作和V操作都是原语。利用信号量S的取值表示共享资源的使用情况。在使用时,把信号量S放在进程运行的环境中,赋予其不同的初值,并在其上实施P操作和V操作,以实现进程间的同步与互斥。
|
|
|
|
P(S):①S=S-1;②若S<0,则该进程进入S信号量的队列中等待。
|
|
|
V(S):①S=S+1; ②若S≤0,则释放S信号量队列上的一个等待进程,使之进入就绪队列。
|
|
|
当S>0时,表示还有资源可以分配;当S<0时,其绝对值表示信号量等待队列中进程的数目。每执行一次P操作,意味着要求分配一个资源;每执行一次V操作,就意味着释放一个资源。
|
|
|
|
令信号量mutex的初值为1,进入临界区时执行P操作,退出临界区时执行V操作,于是临界区就改写成下列形式的代码段:
|
|
|
|
由于mutex初值为1, P、V是原子操作,可以实现互斥。
|
|
|