监视器和信号灯用于进程同步,并允许进程使用互斥来访问共享资源。但是,监视器和信号灯包含许多差异。关于这两个的详细信息如下-
监视器是一种同步构造,旨在克服由信号量引起的问题,例如定时错误。
监视器是抽象数据类型,包含共享的数据变量和过程。共享数据变量不能由进程直接访问,并且需要过程才能允许单个进程一次访问共享数据变量。
证明如下:
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时,信号操作才成功。