进程同步中的监视器
监视器是实现进程同步的方式之一。监视器由编程语言支持,实现进程间的互斥。例如Java同步方法。 Java提供了 wait() 和 notify() 构造。
- 它是条件变量和过程的集合,它们组合在一种特殊的模块或包中。
- 在监视器外运行的进程不能访问监视器的内部变量,但可以调用监视器的过程。
- 一次只有一个进程可以执行监视器内的代码。
句法:
条件变量:
对监视器的条件变量执行两种不同的操作。
Wait.
signal.
假设我们有 2 个条件变量
条件 x, y; // 声明变量
等待操作
x.wait() :对任何条件变量执行等待操作的进程都被挂起。挂起的进程放置在该条件变量的块队列中。
注意:每个条件变量都有其唯一的块队列。
信号操作
x.signal():当一个进程对条件变量执行信号操作时,被阻塞的进程之一有机会。
If (x block queue empty)
// Ignore signal
else
// Resume a process from block queue.
监视器的优点:
与使用信号量等技术相比,监视器具有使并行编程更容易且不易出错的优势。
监视器的缺点:
监视器必须作为编程语言的一部分来实现。编译器必须为它们生成代码。这给编译器带来了额外的负担,即必须知道哪些操作系统设施可用于控制对并发进程中临界区的访问。一些支持监视器的语言是Java、C#、Visual Basic、Ada 和并发 Euclid。