概述 :
信号量是具有两个字段的复合数据类型,一个是非负整数 SV,第二个是队列中的进程集 SL 用于解决临界区问题,通过使用两个原子操作来解决。在此,等待和用于进程同步的信号。
进程状态:
让我们来看看流程生命周期中的各个阶段。这将有助于理解信号量。
- 跑步 –
它指出正在执行的流程。 - 准备好 –
它指出进程要运行。 - 空闲 –
当没有进程正在运行时,进程运行 - 阻止 –
未准备好的进程不是正在运行的进程的候选者。它可以被一些外部动作唤醒。 - 不活动 –
进程的初始状态。该过程在某个时刻被激活并准备就绪。 - 完全的 –
当进程执行其最终语句时。
信号量的初始化:
信号量 S 必须用 SV > 0 的值和空的 SL 初始化
Semaphore S <- (k,φ)
信号量中的原子操作:
这里我们将讨论如下两个原子操作wait和signal。
操作-1:
等待(S):
根据SV的值,如果它不为零,递减它的值,进程p可以继续执行,如果为零,进程p被添加到设置组件中,进程p的状态在这种情况下被阻塞在这种情况下进程p据说在信号量上被阻塞了。
算法 –
if(S.V > 0)
{
S.V. = S.V -1
}
else{
S.L. = S.L. U p
p.state = blocked
}
操作-2:
信号(S) :
根据 SL 的值,如果它是空的,则增加整数的值,如果它是非空的,则 unblock q 阻塞 o SL 的进程集合中的任意一个,并将 p 的状态更改为就绪。
算法 –
if(S.L. == φ){
S.V. = S.V.+1
}
else{
Let q be some process in S.L. S
S.L. = S.L. - {q}
q.state = ready
}
信号量的类型:
下面我们将讨论信号量的类型。
类型 1 :
通用信号量:
一个信号量,其整数分量可以采用 SL 的任意非负值,称为通用信号量。它们是一种弱信号量。
类型 2 :
二进制信号量:
整数分量 SL 仅取值 0 和 1 的信号量称为二进制信号量。这也称为“互斥”,代表互斥。
初始化 –
S <- (0, φ) or S <- (1, φ)
等待操作——
它保持不变,如上所述。
信号操作 –
它略有变化如下
算法 :
Signal(S)
:
if (S.V.== 1)
{
// Undefined
// Return
}
else if (S.L == empty) { S.V.= 1 }
else
{
Let q be some process in
S.L.
S.L.
= S.L.
- { q }
q.state
= ready
}
类型 3 :
强信号量:
在强信号量中,SL 像弱信号量一样保持不变,而 SV 被队列替换。由于删除了弱信号量中的任意进程,它可能会导致饥饿,而在这种情况下,它仍然没有饥饿。
初始化 –
S <- (0,empty)
等待操作——
算法 :
Wait(S) :
if (S.V > 0)
{
S.V.= S.V - 1
}
else
{
S.L.= S.L.U p
p.state
= blocked
}
信号操作 –
算法 :
Signal(S)
:
if (S.L.== empty)
{
S.V.= S.V.+ 1
}
else
{
q = head(S.L.)
S.L.
= S.L.
- { q }
q.state
= ready
}
类型 4 :
忙等待信号量:
它没有组件 SL 并且信号量 S 仅由 SVBusy-Wait 标识 信号量适用于多处理器系统,其中等待进程有自己的处理器并且不会浪费可用于计算的 CPU 时间。
等待操作——
算法 :
Wait(S):
await S>0
S = S - 1
信号操作 –
算法 :
Signal(S):
S = S + 1
结论 :
在本节中,我们讨论了信号量及其类型,还讨论了它的原子操作。这些是用于解决临界区问题的信号量的基础知识。