信号量与监视器的区别

2025年4月22日 | 阅读6分钟

在本文中,您将学习信号量和监视器之间的区别。但在讨论差异之前,您需要了解信号量和监视器。

Semaphore vs Monitor

什么是信号量?

信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。它是一个整数变量 (S),并使用系统中的资源数量进行初始化。wait()signal() 方法是唯一可以修改信号量 (S) 值的两个方法。当一个进程修改信号量值时,其他进程不能同时修改信号量值。

此外,操作系统将信号量分为两类

  1. 计数信号量
  2. 二元信号量

计数信号量

在计数信号量中,信号量S的值初始化为系统中资源的数量。当一个进程需要访问共享资源时,它会在信号量上调用wait() 方法,将其值减一。当共享资源被释放时,它会调用signal() 方法,将值增加1

当信号量计数达到0时,表示进程已使用所有资源。假设一个进程在信号量计数为0时需要使用资源。在这种情况下,它会执行wait() 方法,并且会被阻塞,直到另一个使用共享资源的进程释放它,并且信号量的值增加到1

二元信号量

二进制信号量的值在01之间。它与互斥锁相似,不同之处在于互斥锁是锁定方法,而信号量是信号方法。当一个进程需要访问二进制信号量资源时,它使用wait() 方法将信号量的值从1减至0

当进程释放资源时,它使用signal() 方法将信号量的值增加至1。当信号量值为0,并且一个进程需要使用该资源时,它会使用wait() 方法等待,直到当前使用该资源的进程释放它。

语法

信号量的语法可如下使用:

信号量的优点和缺点

信号量的各种优点和缺点如下:

优点:

  1. 它们不允许多个进程同时进入临界区。通过这种方式实现了互斥,使其比其他同步技术效率更高。
  2. 由于信号量中的忙等待,不会浪费进程时间或资源。这是因为只有当满足特定条件时,进程才被允许访问临界区。
  3. 它们支持灵活的资源管理。
  4. 它们是机器无关的,因为它们在微内核的机器无关代码中执行。

缺点

  1. 可能出现优先级反转的情况,即低优先级的进程比高优先级的进程获得对临界区的访问权。
  2. 信号量编程复杂,存在无法实现互斥的风险。
  3. 必须正确执行wait()signal() 方法以避免死锁。

什么是监视器?

它是一种同步技术,它允许线程实现互斥并等待某个条件变为真。它是一种抽象数据类型。它包含共享变量以及一组在共享变量上执行的过程。进程不能直接访问共享数据变量,需要通过过程来允许多个进程同时访问共享数据变量。

在任何特定时间,只有一个进程可以在监视器中活动。其他需要访问共享变量的进程必须排队,并且只有在前一个进程释放共享变量后才能获得访问权限。

语法

监视器的语法可如下使用:

监视器的优点和缺点

监视器的各种优点和缺点如下:

优点

  1. 监视器中的互斥是自动实现的。
  2. 与信号量相比,监视器更易于实现。
  3. 监视器可以克服使用信号量时发生的定时错误。
  4. 监视器是由过程和条件变量组成的,它们被组合在一种特殊类型的模块中。

缺点

  1. 监视器必须被实现到编程语言中。
  2. 编译器应为其生成代码。
  3. 它给编译器带来了额外的负担,使其需要了解可用的操作系统功能,以便控制并发进程对临界区的访问。

信号量与监视器的主要区别

在这里,您将了解信号量和监视器之间的主要区别。一些主要区别如下:

  1. 信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。另一方面,监视器是一种同步技术,它允许线程实现互斥并等待某个条件变为真。
  2. 当进程在信号量中使用共享资源时,它会调用wait() 方法并阻塞资源。当它想释放资源时,它会执行signal()。相比之下,当进程在监视器中使用共享资源时,它必须通过过程来访问它们。
  3. 信号量是整数变量,而监视器是抽象数据类型。
  4. 在信号量中,一个整数变量表示系统中可用资源的数量。相比之下,监视器是一种抽象数据类型,它只允许一个进程一次在一个临界区中执行。
  5. 信号量没有条件变量的概念,而监视器有条件变量。
  6. 信号量的值只能使用wait()signal() 进行更改。相比之下,监视器包含共享变量以及允许进程访问它们的工具。

信号量与监视器的头部对比

信号量和监视器之间的各种头部对比如下:

特点信号量Monitor
定义信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。它是一种同步过程,它允许线程实现互斥并等待某个条件变为真。
语法// Wait Operation
wait(Semaphore S) {
while (S<=0);
S--;
}
// Signal Operation
signal(Semaphore S) {
S++;
}
monitor {
//shared variable declarations
data variables;
Procedure P1() { ... }
Procedure P2() { ... }
.
.
.
Procedure Pn() { ... }
}
基本功能Integer variableAbstract data type
访问当进程使用共享资源时,它会在 S 上调用 wait() 方法,当它释放资源时,它会在 S 上使用 signal() 方法。当进程在监视器中使用共享资源时,它必须通过过程来访问它们。
操作信号量的值表示系统中可用共享资源的数量。监视器类型包含共享变量以及一组对其进行操作的过程。
Condition VariableNo condition variables.It has condition variables.

结论

总而言之,信号量和监视器是两种同步机制。信号量是一个执行wait()signal() 方法的整数变量。相比之下,监视器是一种抽象数据类型,它只允许一个进程一次使用一个共享资源。监视器比信号量更容易实现,并且与信号量相比,出错的可能性更小。