Semaphore信号量和Monitor之间的区别

Semaphore信号量和Monitor之间的区别

在本文中,您将了解信号量和Monitor之间的区别。但在讨论区别之前,您需要了解信号量和Monitor的概念。

Semaphore信号量和Monitor之间的区别

什么是信号量

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

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

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

计数信号量

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

当信号量计数达到 0 时,意味着进程已经使用了所有资源。假设一个进程在信号量计数为0时需要使用资源。此时它执行 wait() 方法,并且被阻塞,直到另一个正在使用共享资源的进程释放资源,并且信号量的值增加到 1

二进制信号量

二进制信号量在 01 之间有一个值。它类似于互斥锁,只是互斥锁是一种锁定方法,而信号量是一种信号方法。当一个进程需要访问二进制信号量资源时,它使用 wait() 方法将信号量的值从 1 减少到 0

当进程释放资源时,它使用 signal() 方法将信号量的值增加到 1 。当信号量值为 0 并且一个进程需要使用资源时,它使用 wait() 方法进行阻塞,直到当前正在使用资源的进程释放资源。

语法:

信号量的语法如下:

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

信号量的优点和缺点

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

优点:

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

缺点:

  1. 可能会出现优先级反转的情况,即优先级较低的进程比优先级较高的进程更容易访问临界区域。
  2. 信号量编程较为复杂,存在互斥不被实现的风险。
  3. 必须正确使用wait()和signal()方法,以避免死锁。

Monitor是什么

它是一种同步技术,使线程能够实现互斥,并等待给定条件变为真。 它是一种抽象数据类型。它具有共享变量和在共享变量上执行的一组过程。一个进程不能直接访问共享数据变量,需要使用过程来允许多个进程同时访问共享数据变量。

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

语法:

可以使用Monitor的语法如下:

monitor  {

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

Monitor的优缺点

Monitor的各种优缺点如下所示:

优点

  1. Monitor中的互斥是自动进行的。
  2. 该实现相对于信号量来说较为简单。
  3. 使用Monitor可以避免信号量使用时出现的时序错误。
  4. Monitor是一种特殊类型的模块,由一组过程和条件变量组成。

缺点

  1. Monitor必须被实现到编程语言中。
  2. 编译器应该为它们生成代码。
  3. 它给编译器带来了额外的负担,需要知道可用于控制并发进程中关键部分访问的操作系统特性。

信号量与Monitor的主要区别

在这里,您将学到信号量和Monitor之间的主要区别。其中一些主要区别如下所示:

  1. 信号量是一个整数变量,允许并行系统中的多个进程管理对共享资源的访问,例如多任务操作系统。另一方面,Monitor是一种同步技术,使线程能够互斥并等待给定条件为真。
  2. 当一个进程在信号量中使用共享资源时,它调用 wait() 方法并阻塞资源。当它想释放资源时,它执行 signal() 。相反,当一个进程在Monitor中使用共享资源时,它必须通过过程来访问它们。
  3. 信号量是一个整数变量,而Monitor是一个抽象数据类型。
  4. 在信号量中,一个整数变量表示系统中可用的资源数量。相反,Monitor是一种抽象数据类型,一次只允许一个进程在关键部分执行。
  5. 信号量没有条件变量的概念,而Monitor有条件变量。
  6. 信号量的值只能使用 wait()signal() 来改变。相反,Monitor有共享变量和工具,使进程能够访问它们。

信号量与Monitor的对比

信号量和Monitor之间的各种对比如下所示:

特性 信号量 Monitor
定义 信号量是一个整数变量,允许并行系统中的多个进程管理对共享资源的访问,例如多任务操作系统。 它是一种同步过程,使线程能够互斥并等待给定条件为真。
语法 // 等待操作 wait(Semaphore S) { while (S<=0); S–; } // 信号操作 signal(Semaphore S) { S++; } monitor { // 共享变量声明 数据变量; 过程 P1() { … } 过程 P2() { … } . . . 过程 Pn() { … } }
基本 整数变量 抽象数据类型
访问 当进程使用共享资源时,调用S上的wait()方法,当释放资源时,使用S上的signal()方法。 当进程在Monitor中使用共享资源时,必须通过过程访问它们。
动作 信号量的值显示系统中可用的共享资源数量。 Monitor类型包括共享变量以及一组操作它们的过程。
条件变量 没有条件变量。 它具有条件变量。

结论

总而言之,信号量和Monitor是两种同步机制。信号量是一个整数变量,执行 wait()signal() 方法。相比之下,Monitor是一种抽象数据类型,只允许一个进程同时使用共享资源。Monitor比信号量更容易实施,并且在Monitor中犯错误的机会较少。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程