什么是信号量?计数、二进制类型及示例
什么是信号量?
信号量只是一个非负且在线程之间共享的变量。信号量是一种信号机制,等待信号量的线程可以被另一个线程信号。它使用两个原子操作,1)Wait,和 2)Signal 来进行进程同步。
信号量根据设置方式,允许或禁止对资源的访问。
信号量的特性
以下是信号量的特性:
- 它是一种可用于提供任务同步的机制。
- 它是一种低级同步机制。
- 信号量始终保持非负整数值。
- 信号量可以使用测试操作和中断来实现,这些操作应该使用文件描述符执行。
信号量类型
两种常见的信号量是:
- 计数信号量
- 二元信号量。
计数信号量
这种类型的信号量使用一个计数器,帮助任务被获取或释放多次。如果初始计数 = 0,则计数信号量应处于不可用状态创建。
但是,如果计数大于 0,则信号量处于可用状态创建,其拥有的令牌数量等于其计数。
二元信号量
二元信号量与计数信号量非常相似,但其值被限制在 0 和 1。在这种类型的信号量中,只有当信号量= 1 时,Wait 操作才有效,而 Signal 操作在信号量= 0 时成功。它比计数信号量更容易实现。
信号量示例
下面的程序是涉及信号量用法和声明的分步实现。
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 信号量操作用于控制任务退出临界区
- 计数信号量无互斥,而二元信号量有互斥
- 信号量表示信号机制,而互斥锁表示锁定机制
- 信号量允许多个线程访问临界区
- 信号量最大的限制之一是优先级反转。