📜  信号量及其类型

📅  最后修改于: 2021-09-28 10:16:18             🧑  作者: Mango

概述 :
信号量是具有两个字段的复合数据类型,一个是非负整数 SV,第二个是队列中的进程集 SL 用于解决临界区问题,通过使用两个原子操作来解决。在此,等待和用于进程同步的信号。

进程状态:
让我们来看看流程生命周期中的各个阶段。这将有助于理解信号量。

  1. 跑步 –
    它指出正在执行的流程。
  2. 准备好 –
    它指出进程要运行。
  3. 空闲 –
    当没有进程正在运行时,进程运行
  4. 阻止 –
    未准备好的进程不是正在运行的进程的候选者。它可以被一些外部动作唤醒。
  5. 不活动 –
    进程的初始状态。该过程在某个时刻被激活并准备就绪。
  6. 完全的 –
    当进程执行其最终语句时。

信号量的初始化:
信号量 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

结论 :
在本节中,我们讨论了信号量及其类型,还讨论了它的原子操作。这些是用于解决临界区问题的信号量的基础知识。