Semaphore信号量和Monitor之间的区别
在本文中,您将了解信号量和Monitor之间的区别。但在讨论区别之前,您需要了解信号量和Monitor的概念。
什么是信号量
信号量是一个整数变量,允许一个并行系统中的许多进程管理对共享资源的访问,例如多任务操作系统。它是一个 整数变量 (S) ,并以系统中资源的数量作为初始值。只有 wait() 和 signal() 方法可以修改 信号量 (S) 的值。当一个进程修改信号量的值时,其他进程无法同时修改信号量的值。
此外,操作系统将信号量分为两种类型:
- 计数信号量
- 二进制信号量
计数信号量
在计数信号量中,信号量 S 的值被初始化为系统中的资源数量。当一个进程需要访问共享资源时,它会调用信号量的 wait() 方法,将其值减1。当共享资源被释放时,它调用 signal() 方法,将值增加 1 。
当信号量计数达到 0 时,意味着进程已经使用了所有资源。假设一个进程在信号量计数为0时需要使用资源。此时它执行 wait() 方法,并且被阻塞,直到另一个正在使用共享资源的进程释放资源,并且信号量的值增加到 1 。
二进制信号量
二进制信号量在 0 和 1 之间有一个值。它类似于互斥锁,只是互斥锁是一种锁定方法,而信号量是一种信号方法。当一个进程需要访问二进制信号量资源时,它使用 wait() 方法将信号量的值从 1 减少到 0 。
当进程释放资源时,它使用 signal() 方法将信号量的值增加到 1 。当信号量值为 0 并且一个进程需要使用资源时,它使用 wait() 方法进行阻塞,直到当前正在使用资源的进程释放资源。
语法:
信号量的语法如下:
// Wait Operation
wait(Semaphore S) {
while (S<=0);
S--;
}
// Signal Operation
signal(Semaphore S) {
S++;
}
信号量的优点和缺点
信号量的各种优点和缺点如下:
优点:
- 信号量不允许多个进程同时进入关键部分。通过这种方式实现互斥,比其他同步技术更高效。
- 信号量中不存在忙等待导致的进程时间或资源浪费。因为只有在满足某个条件时才允许进程访问临界区域。
- 它们可以实现灵活的资源管理。
- 由于在微内核的机器无关代码中执行,它们是与机器无关的。
缺点:
- 可能会出现优先级反转的情况,即优先级较低的进程比优先级较高的进程更容易访问临界区域。
- 信号量编程较为复杂,存在互斥不被实现的风险。
- 必须正确使用wait()和signal()方法,以避免死锁。
Monitor是什么
它是一种同步技术,使线程能够实现互斥,并等待给定条件变为真。 它是一种抽象数据类型。它具有共享变量和在共享变量上执行的一组过程。一个进程不能直接访问共享数据变量,需要使用过程来允许多个进程同时访问共享数据变量。
在任何特定时间,Monitor中只能有一个进程活动。需要访问共享变量的其他进程必须排队,并且只有在前一个进程释放共享变量后才能获得访问权限。
语法:
可以使用Monitor的语法如下:
monitor {
//shared variable declarations
data variables;
Procedure P1() { ... }
Procedure P2() { ... }
.
.
.
Procedure Pn() { ... }
Initialization Code() { ... }
}
Monitor的优缺点
Monitor的各种优缺点如下所示:
优点
- Monitor中的互斥是自动进行的。
- 该实现相对于信号量来说较为简单。
- 使用Monitor可以避免信号量使用时出现的时序错误。
- Monitor是一种特殊类型的模块,由一组过程和条件变量组成。
缺点
- Monitor必须被实现到编程语言中。
- 编译器应该为它们生成代码。
- 它给编译器带来了额外的负担,需要知道可用于控制并发进程中关键部分访问的操作系统特性。
信号量与Monitor的主要区别
在这里,您将学到信号量和Monitor之间的主要区别。其中一些主要区别如下所示:
- 信号量是一个整数变量,允许并行系统中的多个进程管理对共享资源的访问,例如多任务操作系统。另一方面,Monitor是一种同步技术,使线程能够互斥并等待给定条件为真。
- 当一个进程在信号量中使用共享资源时,它调用 wait() 方法并阻塞资源。当它想释放资源时,它执行 signal() 。相反,当一个进程在Monitor中使用共享资源时,它必须通过过程来访问它们。
- 信号量是一个整数变量,而Monitor是一个抽象数据类型。
- 在信号量中,一个整数变量表示系统中可用的资源数量。相反,Monitor是一种抽象数据类型,一次只允许一个进程在关键部分执行。
- 信号量没有条件变量的概念,而Monitor有条件变量。
- 信号量的值只能使用 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中犯错误的机会较少。