监视器与信号量

监视器和信号灯用于进程同步,并允许进程使用互斥来访问共享资源。但是,监视器和信号灯包含许多差异。关于这两个的详细信息如下-

监控器

监视器是一种同步构造,旨在克服由信号量引起的问题,例如定时错误。

监视器是抽象数据类型,包含共享的数据变量和过程。共享数据变量不能由进程直接访问,并且需要过程才能允许单个进程一次访问共享数据变量。

证明如下:

monitor monitorName
{
   data variables;

   Procedure P1(....)
   {

   }

   Procedure P2(....)
   {

   }

   Procedure Pn(....)
   {

   }

   Initialization Code(....)
   {

   }
}

一次只能在一个监视器中激活一个进程。需要访问监视器中共享变量的其他进程必须排在队列中,并且仅在前一个进程释放共享变量时才提供访问权限。

信号量

信号量是一种信号传递机制,正在等待信号量的线程可以由另一个线程发出信号。这与互斥锁不同,因为互斥锁只能由调用等待功能的线程发出信号。

信号量使用两个原子操作,即等待和信号进行过程同步。

如果为正数,则等待操作会减小其参数S的值。如果S为负或零,则不执行任何操作。

wait(S)
{
   while (S<=0);

   S--;
}

信号运算会增加其参数S的值。

signal(S)
{
   S++;
}

信号量主要有两种类型,即计数信号量和二进制信号量。

计数信号量是整数值信号量,并且具有不受限制的值域。这些信号量用于协调资源访问,其中信号量计数是可用资源的数量。

二进制信号量就像对信号量进行计数一样,但它们的值限制为0和1。仅当信号量为1时,等待操作才有效;当信号量为0时,信号操作才成功。