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