📜  监视器与信号量

📅  最后修改于: 2021-09-28 09:52:19             🧑  作者: Mango

信号量和监视器都用于解决临界区问题(因为它们允许进程以互斥方式访问共享资源)并在多处理环境中实现进程同步。

监视器:
Monitor 类型的高级同步构造。它是一种抽象数据类型。 Monitor 类型包含共享变量和对共享变量进行操作的一组过程。

当任何进程希望访问监视器中的共享变量时,它需要通过过程访问它。这些进程在队列中排列,并且只有在前一个进程释放共享变量时才提供访问权限。一次只能有一个进程在监视器中处于活动状态。监视器具有条件变量。

句法:

monitor  {
    
    //shared variable declarations
    data variables;
    Procedure P1() { ... }
    Procedure P2() { ... }
    .
    .
    .
    Procedure Pn() { ... }

} 

信号:
信号量是较低级别的对象。信号量是一个非负整数变量。 Semaphore 的值表示系统中可用的共享资源的数量。信号量的值只能通过两个函数修改,即wait()signal()操作(初始化除外)。

当任何进程访问共享资源时,它对信号量执行wait()操作,当进程释放共享资源时,它对信号量执行signal()操作。信号量没有条件变量。当一个进程正在修改信号量的值时,没有其他进程可以同时修改信号量的值。

信号量进一步分为两类:

  1. 二进制信号量
  2. 计数信号量

句法:

// Wait Operation
    wait(Semaphore S) {   
        while (S<=0);
            S--;
    }
    // Signal Operation
    signal(Semaphore S) {
        S++;
    } 

监视器的优点:

  • 监视器比信号量更容易实现。
  • 监视器中的互斥是自动的,而在信号量中,互斥需要明确实现。
  • 监视器可以克服使用信号量时发生的计时错误。
  • 共享变量对监视器中的所有进程是全局的,而共享变量隐藏在信号量中。

信号量的优点:

  • 信号量与机器无关(因为它们是在内核服务中实现的)。
  • 与监视器不同,信号量允许多个线程访问临界区。
  • 在信号量中没有自旋,因此不会因忙等待而浪费资源。