信号量是整数变量,用于通过使用两个原子操作(用于等待进程和信号)来解决临界区问题,它们用于进程同步。
等待和信号的定义如下-
等待
如果为正数,则等待操作会减小其参数S的值。如果S为负或零,则不执行任何操作。
wait(S) { while (S<=0); S--; }
信号
信号运算会增加其参数S的值。
signal(S) { S++; }
信号量有两种主要类型,即计数信号量和二进制信号量。有关这些的详细信息如下-
计数信号量
这些是整数值信号量,并且具有不受限制的值域。这些信号量用于协调资源访问,其中信号量计数是可用资源的数量。如果添加了资源,则信号灯计数会自动增加;如果删除了资源,则计数将减少。
二进制信号量
二进制信号量类似于计数信号量,但是它们的值限制为0和1。仅当信号量为1时,等待操作才有效;当信号量为0时,信号操作成功。与对信号量进行计数相比,实现二进制信号量有时更容易。
信号量的一些优点如下-
信号量仅允许进入关键部分的一个过程。它们严格遵循互斥原理,比其他同步方法要有效得多。
由于在信号量中忙于等待,因此不会浪费资源,因为不会不必要地浪费处理器时间来检查是否满足条件以允许进程访问关键部分。
信号量是通过微内核的与机器无关的代码实现的。因此它们是与机器无关的。
信号量的一些缺点如下-
信号量很复杂,因此必须以正确的顺序执行等待和信号操作以防止死锁。
信号量对于最终规模的使用不切实际,因为它们的使用会导致模块化的丧失。发生这种情况是因为等待和信号操作阻止了系统的结构化布局的创建。
信号量可能导致优先级倒置,其中低优先级进程可以先访问关键部分,然后再访问高优先级进程。