互斥锁,我们刚刚讨论过了,通常认为是最简单的同步工具。本节将会讨论一个更棒的工具,它的功能类似于互斥锁,但是它能提供更为高级的方法,以便进程能够同步活动。
一个信号量 S 是个整型变量,它除了初始化外只能通过两个标准原子操作:wait () 和 signal() 来访问:
操作 wait() 最初称为 P(荷兰语proberen,测试);
操作 signal() 最初称为 V(荷兰语verhogen,增加);
可按如下来定义wait ():
wait(S){
while (S <= 0)
;// busy wait
S–;
}
可按如下来定义signal():
signal(S) {
S++;
}
在 wait() 和 signal() 操作中,信号量整数值的修改应不可分割地执行。也就是说,当一个进程修改信号量值时,没有其他进程能够同时修改同一信号量的值。另外,对于 wait(S),S 整数值的测试(S < 0)和修改(S–)也不能被中断。
首先,我们看看如何使用信号量。
信号量的使用
操作系统通常区分计数信号量与二进制信号量。计数信号量的值不受限制,而二进制信号量的值只能为 0 或 1。因此,二进制信号量类似于互斥锁。事实上,在没有提供互斥锁的系统上,可以使用二进制信号量来提供互斥。
计数信号量可以用于控制访问具有多个实例的某种资源。信号量的初值为可用资源数量。当进程需要使用资
版权声明:本文为weixin_34269309原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。