信号量和监视器都用于解决临界区问题(因为它们允许进程以互斥方式访问共享资源)并在多处理环境中实现进程同步。
监视器:
Monitor 类型的高级同步构造。它是一种抽象数据类型。 Monitor 类型包含共享变量和对共享变量进行操作的一组过程。
当任何进程希望访问监视器中的共享变量时,它需要通过过程访问它。这些进程在队列中排列,并且只有在前一个进程释放共享变量时才提供访问权限。一次只能有一个进程在监视器中处于活动状态。监视器具有条件变量。
句法:
monitor {
//shared variable declarations
data variables;
Procedure P1() { ... }
Procedure P2() { ... }
.
.
.
Procedure Pn() { ... }
}
信号:
信号量是较低级别的对象。信号量是一个非负整数变量。 Semaphore 的值表示系统中可用的共享资源的数量。信号量的值只能通过两个函数修改,即wait()和signal()操作(初始化除外)。
当任何进程访问共享资源时,它对信号量执行wait()操作,当进程释放共享资源时,它对信号量执行signal()操作。信号量没有条件变量。当一个进程正在修改信号量的值时,没有其他进程可以同时修改信号量的值。
信号量进一步分为两类:
- 二进制信号量
- 计数信号量
句法:
// Wait Operation
wait(Semaphore S) {
while (S<=0);
S--;
}
// Signal Operation
signal(Semaphore S) {
S++;
}
监视器的优点:
- 监视器比信号量更容易实现。
- 监视器中的互斥是自动的,而在信号量中,互斥需要明确实现。
- 监视器可以克服使用信号量时发生的计时错误。
- 共享变量对监视器中的所有进程是全局的,而共享变量隐藏在信号量中。
信号量的优点:
- 信号量与机器无关(因为它们是在内核服务中实现的)。
- 与监视器不同,信号量允许多个线程访问临界区。
- 在信号量中没有自旋,因此不会因忙等待而浪费资源。