什么是信号量?计数、二进制类型及示例

什么是信号量?

信号量只是一个非负且在线程之间共享的变量。信号量是一种信号机制,等待信号量的线程可以被另一个线程信号。它使用两个原子操作,1)Wait,和 2)Signal 来进行进程同步。

信号量根据设置方式,允许或禁止对资源的访问。

信号量的特性

以下是信号量的特性:

  • 它是一种可用于提供任务同步的机制。
  • 它是一种低级同步机制。
  • 信号量始终保持非负整数值。
  • 信号量可以使用测试操作和中断来实现,这些操作应该使用文件描述符执行。

信号量类型

两种常见的信号量是:

  • 计数信号量
  • 二元信号量。

计数信号量

这种类型的信号量使用一个计数器,帮助任务被获取或释放多次。如果初始计数 = 0,则计数信号量应处于不可用状态创建。

Counting Semaphores
计数信号量

但是,如果计数大于 0,则信号量处于可用状态创建,其拥有的令牌数量等于其计数。

二元信号量

二元信号量与计数信号量非常相似,但其值被限制在 0 和 1。在这种类型的信号量中,只有当信号量= 1 时,Wait 操作才有效,而 Signal 操作在信号量= 0 时成功。它比计数信号量更容易实现。

Binary Semaphores

二元信号量

信号量示例

下面的程序是涉及信号量用法和声明的分步实现。

Shared var mutex: semaphore = 1;
Process i
    begin
    .
    .
    P(mutex);
    execute CS;
    V(mutex);
    .
    .
    End;

信号量中的 Wait 和 Signal 操作

这两种操作都用于实现进程同步。此信号量操作的目标是获得互斥。

Wait 操作

这种类型的信号量操作有助于控制任务进入临界区。但是,如果 Wait 的值为正,则 Wait 参数 X 的值将减一。对于负值或零值,则不执行任何操作。它也称为 P(S) 操作。

在信号量值减小且变为负数后,命令将被挂起,直到满足所需条件。

Copy CodeP(S)
{ 
    while (S<=0);
    S--;
}

Signal 操作

这种类型的信号量操作用于控制任务退出临界区。它有助于将参数的值增加 1,表示为 V(S)。

Copy CodeP(S)
{ 
    while (S>=0);
    S++;
}

计数信号量与二元信号量

以下是计数信号量和二元信号量之间的一些主要区别:

计数信号量 二元信号量
无互斥 互斥
任何整数值 值仅为 0 和 1
一个以上的槽 仅一个槽
提供一组进程 它具有互斥机制。

信号量与互斥锁的区别

参数 信号量 互斥锁 (Mutex)
机制 它是一种信号机制。 它是一种锁定机制。
数据类型 信号量是一个整数变量。 互斥锁只是一个对象。
修改 Wait 和 Signal 操作可以修改信号量。 它仅由请求或释放资源的进程修改。
资源管理 如果没有任何资源可用,则需要资源的进程应执行 Wait 操作。它应等待,直到信号量计数大于 0。 如果被锁定,则进程必须等待。进程应置于队列中。这需要在互斥锁解锁后才能访问。
线程 您可以拥有多个程序线程。 您可以拥有多个程序线程,但不能同时使用互斥锁。
所有权 值可以由任何释放或获取资源的进程更改。 对象锁只能由已获取该锁的进程释放。
类型 信号量的类型是计数信号量和二元信号量,而 互斥锁没有子类型。
操作 信号量值通过 wait() 和 signal() 操作进行修改。 互斥锁对象被锁定或解锁。
资源占用 如果所有资源都被使用,并且请求资源的进程执行 Wait() 操作并阻塞自身直到信号量计数大于 1,则会占用。 如果对象已被锁定,则请求资源的进程会等待,并在释放锁之前由系统排队。

信号量的优点

以下是使用信号量的优点/好处:

  • 它允许多个线程访问临界区
  • 信号量是机器无关的。
  • 信号量在微内核的机器无关代码中实现。
  • 它们不允许多个进程进入临界区。
  • 由于信号量中存在忙等待,因此不会浪费进程时间和资源。
  • 它们是机器无关的,应在微内核的机器无关代码中运行。
  • 它们允许灵活管理资源。

信号量的缺点

以下是信号量的缺点/弊端:

  • 信号量最大的限制之一是优先级反转。
  • 操作系统必须跟踪对 Wait 和 Signal 信号量的所有调用。
  • 它们的使用从不强制执行,而只是约定俗成。
  • 为了避免信号量中的死锁,Wait 和 Signal 操作需要按正确的顺序执行。
  • 信号量编程很复杂,因此存在无法实现互斥的可能性。
  • 对于大规模使用,这也不是一种实用的方法,因为它们的使用会导致模块化丢失。
  • 信号量更容易出现程序员错误。
  • 它可能导致死锁或由于程序员错误导致互斥违例。

摘要

  • 信号量定义为线程之间共享的非负变量。
  • 它是一种可用于提供任务同步的机制。
  • 计数信号量使用一个计数器,帮助任务被获取或释放多次。
  • 二元信号量与计数信号量非常相似,但其值被限制在 0 和 1。
  • Wait 操作有助于控制任务进入临界区
  • Signal 信号量操作用于控制任务退出临界区
  • 计数信号量无互斥,而二元信号量有互斥
  • 信号量表示信号机制,而互斥锁表示锁定机制
  • 信号量允许多个线程访问临界区
  • 信号量最大的限制之一是优先级反转。