信号量与监视器的区别2025年4月22日 | 阅读6分钟 在本文中,您将学习信号量和监视器之间的区别。但在讨论差异之前,您需要了解信号量和监视器。  什么是信号量?信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。它是一个整数变量 (S),并使用系统中的资源数量进行初始化。wait() 和 signal() 方法是唯一可以修改信号量 (S) 值的两个方法。当一个进程修改信号量值时,其他进程不能同时修改信号量值。 此外,操作系统将信号量分为两类 - 计数信号量
- 二元信号量
计数信号量在计数信号量中,信号量S的值初始化为系统中资源的数量。当一个进程需要访问共享资源时,它会在信号量上调用wait() 方法,将其值减一。当共享资源被释放时,它会调用signal() 方法,将值增加1。 当信号量计数达到0时,表示进程已使用所有资源。假设一个进程在信号量计数为0时需要使用资源。在这种情况下,它会执行wait() 方法,并且会被阻塞,直到另一个使用共享资源的进程释放它,并且信号量的值增加到1。 二元信号量二进制信号量的值在0到1之间。它与互斥锁相似,不同之处在于互斥锁是锁定方法,而信号量是信号方法。当一个进程需要访问二进制信号量资源时,它使用wait() 方法将信号量的值从1减至0。 当进程释放资源时,它使用signal() 方法将信号量的值增加至1。当信号量值为0,并且一个进程需要使用该资源时,它会使用wait() 方法等待,直到当前使用该资源的进程释放它。 语法信号量的语法可如下使用: 信号量的优点和缺点信号量的各种优点和缺点如下: 优点: - 它们不允许多个进程同时进入临界区。通过这种方式实现了互斥,使其比其他同步技术效率更高。
- 由于信号量中的忙等待,不会浪费进程时间或资源。这是因为只有当满足特定条件时,进程才被允许访问临界区。
- 它们支持灵活的资源管理。
- 它们是机器无关的,因为它们在微内核的机器无关代码中执行。
缺点 - 可能出现优先级反转的情况,即低优先级的进程比高优先级的进程获得对临界区的访问权。
- 信号量编程复杂,存在无法实现互斥的风险。
- 必须正确执行wait() 和 signal() 方法以避免死锁。
什么是监视器?它是一种同步技术,它允许线程实现互斥并等待某个条件变为真。它是一种抽象数据类型。它包含共享变量以及一组在共享变量上执行的过程。进程不能直接访问共享数据变量,需要通过过程来允许多个进程同时访问共享数据变量。 在任何特定时间,只有一个进程可以在监视器中活动。其他需要访问共享变量的进程必须排队,并且只有在前一个进程释放共享变量后才能获得访问权限。 语法监视器的语法可如下使用: 监视器的优点和缺点监视器的各种优点和缺点如下: 优点 - 监视器中的互斥是自动实现的。
- 与信号量相比,监视器更易于实现。
- 监视器可以克服使用信号量时发生的定时错误。
- 监视器是由过程和条件变量组成的,它们被组合在一种特殊类型的模块中。
缺点 - 监视器必须被实现到编程语言中。
- 编译器应为其生成代码。
- 它给编译器带来了额外的负担,使其需要了解可用的操作系统功能,以便控制并发进程对临界区的访问。
信号量与监视器的主要区别在这里,您将了解信号量和监视器之间的主要区别。一些主要区别如下: - 信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。另一方面,监视器是一种同步技术,它允许线程实现互斥并等待某个条件变为真。
- 当进程在信号量中使用共享资源时,它会调用wait() 方法并阻塞资源。当它想释放资源时,它会执行signal()。相比之下,当进程在监视器中使用共享资源时,它必须通过过程来访问它们。
- 信号量是整数变量,而监视器是抽象数据类型。
- 在信号量中,一个整数变量表示系统中可用资源的数量。相比之下,监视器是一种抽象数据类型,它只允许一个进程一次在一个临界区中执行。
- 信号量没有条件变量的概念,而监视器有条件变量。
- 信号量的值只能使用wait() 和 signal() 进行更改。相比之下,监视器包含共享变量以及允许进程访问它们的工具。
信号量与监视器的头部对比信号量和监视器之间的各种头部对比如下: 特点 | 信号量 | Monitor |
---|
定义 | 信号量是一个整数变量,它允许多个进程在并行系统中管理对公共资源的访问,例如多任务操作系统。 | 它是一种同步过程,它允许线程实现互斥并等待某个条件变为真。 | 语法 | // Wait Operation wait(Semaphore S) { while (S<=0); S--; } // Signal Operation signal(Semaphore S) { S++; } | monitor { //shared variable declarations data variables; Procedure P1() { ... } Procedure P2() { ... } . . . Procedure Pn() { ... } } | 基本功能 | Integer variable | Abstract data type | 访问 | 当进程使用共享资源时,它会在 S 上调用 wait() 方法,当它释放资源时,它会在 S 上使用 signal() 方法。 | 当进程在监视器中使用共享资源时,它必须通过过程来访问它们。 | 操作 | 信号量的值表示系统中可用共享资源的数量。 | 监视器类型包含共享变量以及一组对其进行操作的过程。 | Condition Variable | No condition variables. | It has condition variables. |
结论总而言之,信号量和监视器是两种同步机制。信号量是一个执行wait() 和 signal() 方法的整数变量。相比之下,监视器是一种抽象数据类型,它只允许一个进程一次使用一个共享资源。监视器比信号量更容易实现,并且与信号量相比,出错的可能性更小。
|