什么是 Semaphore? 计数、二进制类型示例
什么是 Semaphore?
Semaphore 只是一个非负且在线程之间共享的变量。信号量是一种信号机制,等待信号量的线程可以由另一个线程发出信号。它使用两个原子操作,1) 等待,和 2) Signal 用于进程同步。
信号量可以允许或禁止访问资源,这取决于如何设置它。
的特征 Semaphore
以下是信号量的特点:
- 它是一种可用于提供任务同步的机制。
- 它是一种低级同步机制。
- Semaphore 将始终保持非负整数值。
- Semaphore 可以使用测试操作和中断来实现,这应该使用文件描述符来执行。
有哪些 Semaphores
两种常见的信号量是
- 计数信号量
- 二进制信号量。
计数 Semaphores
这类 Semaphore 使用计数来帮助多次获取或释放任务。如果初始计数 = 0,则应在不可用状态下创建计数信号量。
然而,如果计数 > 0,则信号量在可用状态下创建,并且它拥有的令牌数等于它的计数。
二进制 Semaphores
二进制信号量与计数信号量类似,但是它们的值限制为0和1。在这种信号量中,只有当 semaphore = 1 时,等待操作才有效,而当 semaphore = 0 时,信号操作成功。它比计数信号量更容易实现。
示例 Semaphore
下面给出的程序是逐步实现的,其中涉及信号量的使用和声明。
Shared var mutex: semaphore = 1; Process i begin . . P(mutex); execute CS; V(mutex); . . End;
等待 Signal Opera在 Semaphores
这两个操作都用于实现 进程同步.这个信号量操作的目的是为了获得互斥。
等待 OperaTION
这种信号量操作可帮助您控制任务进入临界区。但是,如果 wait 的值为正,则 wait 参数 X 的值会减少。如果为负值或零值,则不执行任何操作。它也被称为 P(S) 操作。
信号量值减少至负值后,命令将被暂停,直到满足所需条件为止。
Copy CodeP(S) { while (S<=0); S--; }
Signal 操作
这类 Semaphore 操作用于控制任务从临界区退出。它有助于将参数的值增加 1,表示为 V(S)。
Copy CodeP(S) { while (S>=0); S++; }
计数 Semaphore 与二进制 Semaphore
这里,是计数和二进制信号量之间的一些主要区别:
计数 Semaphore | 二进制 Semaphore |
---|---|
无互斥 | 相互排斥 |
任意整数值 | 值仅 0 和 1 |
多个插槽 | 只有一个插槽 |
提供一套流程 | 它具有互斥机制。 |
之间的区别 Semaphore 与互斥锁
参数 | Semaphore | 互斥 |
---|---|---|
机制 | 它是一种信号机制。 | 这是一种锁定机制。 |
数据类型 | Semaphore 是一个整型变量。 | 互斥锁只是一个对象。 |
修改 | 等待和信号操作可以修改信号量。 | 它仅可由可能请求或释放资源的进程修改。 |
资源管理 | 如果没有空闲资源,则进程需要资源,并执行等待操作。它应该等待,直到信号量的计数大于 0。 | 如果被锁定,进程必须等待。进程应保存在队列中。仅当互斥锁解锁时才需要访问该队列。 |
Thread | 您可以有多个程序线程。 | 互斥锁中可以有多个程序线程,但不能同时存在。 |
所有权 | 任何释放或获取资源的过程都可以改变该值。 | 对象锁仅由获得该锁的进程释放。 |
类型 | 有哪些 Semaphore 计数信号量和二进制信号量 | Mutex 没有子类型。 |
操作 | Semaphore 使用wait()和signal()操作来修改值。 | 互斥对象被锁定或解锁。 |
资源占用 | 如果所有资源都在使用,则信号量被占用,请求资源的进程执行wait()操作并阻塞自身,直到信号量计数变为>1。 | 如果对象已被锁定,则请求资源的进程将等待,并且会被系统排队,直到锁被释放。 |
的优点 Semaphores
以下是使用的优点/好处 Semaphore:
- 它允许多个线程访问临界区
- Semaphore与机器无关。
- Semaphore是在微内核的机器独立代码中实现的。
- 它们不允许多个进程进入临界区。
- 由于信号量处于忙等待状态,因此不会浪费进程时间和资源。
- 它们是与机器无关的,应该在微内核的机器无关代码中运行。
- 它们允许灵活地管理资源。
信号量的缺点
以下是信号量的缺点
- 信号量的最大限制之一是优先级反转。
- 操作系统必须跟踪所有等待和信号信号量的调用。
- 它们的使用从未被强制执行,而只是按照惯例。
- 为了避免信号量中的死锁,Wait 和 Signal 操作需要按照正确的顺序执行。
- Semaphore 编程很复杂,因此有可能无法实现互斥。
- 这也不是一种适合大规模使用的实用方法,因为使用它们会导致模块化的丧失。
- Semaphore 更容易出现程序员错误。
- 可能导致 僵局 或由于程序员错误而违反互斥规定。
结语
- Semaphore 被定义为非负且在线程之间共享的变量。
- 它是一种可用于提供任务同步的机制。
- 计数信号量使用计数来帮助多次获取或释放任务。
- 二进制信号量与计数信号量非常相似,但是其值限制为 0 和 1。
- 等待操作可帮助您控制任务进入临界区
- Signal 信号量操作用于控制任务从临界区退出
- 计数 Semaphore 没有互斥,而二进制 Semaphore 具有互斥性
- Semaphore 表示信号机制,而 Mutex 表示锁定机制
- Semaphore 允许多个线程访问临界区
- 信号量的最大限制之一是优先级反转。