操作系统中的信号量和监视器之间的区别
内容
信号量和监视器都允许进程以互斥方式访问共享资源。两者都是流程同步工具。相反,它们彼此非常不同。哪里 信号 是一个整数变量,除初始化外,只能通过wait()和signal()操作进行操作。另一方面, 监控 type是一种抽象数据类型,其构造允许一次激活一个进程。在本文中,我们将借助下面显示的比较表来讨论信号量和监视器之间的区别。
- 比较表
- 定义
- 关键差异
- 结论
比较表
比较基础 | 信号 | 监控 |
---|---|---|
基本的 | 信号量是整数变量S。 | Monitor是一种抽象数据类型。 |
行动 | 信号量S的值表示系统中可用共享资源的数量 | Monitor类型包含共享变量和对共享变量进行操作的过程集。 |
访问 | 当任何进程访问共享资源时,它将在S上执行wait()操作,当释放共享资源时,将在S上执行signal()操作。 | 当任何进程想要访问监视器中的共享变量时,它需要通过过程进行访问。 |
条件变量 | 信号量没有条件变量。 | 监视器具有条件变量。 |
信号量的定义
作为流程同步工具, 信号 是一个 整数变量S。 此整数变量S初始化为 资源数量 存在于系统中。信号量S的值只能通过两个函数进行修改 等待()和 信号()除了初始化。
wait()和signal()操作不可分割地修改信号量S的值。这意味着,当一个进程正在修改信号量的值时,没有其他进程可以同时修改信号量的值。此外,操作系统将信号灯分为计数信号灯和二进制信号灯两类。
在 计数信号量,信号量S的值被初始化为系统中存在的资源数。每当进程想要访问共享资源时,它就会执行 等待()对信号量的操作 减量 信号量的值加一。当释放共享资源时,它将执行 信号()对信号量的操作 增量 信号量的值加一。当信号量达到 0, 它的意思是 所有资源都被占用 通过过程。如果一个进程在信号量计数为0时需要使用资源,则执行wait()并 受阻 直到使用共享资源的进程释放它,并且信号量的值变得大于0。
在 二进制信号量,信号量的值在0到1之间。类似于互斥锁,但是互斥锁是一种锁定机制,而信号量则是一种信号传递机制。在二进制信号量中,如果进程要访问资源,则它将对信号量执行wait()操作,然后 减量 信号量的值,从1到0。当进程释放资源时,它将执行 信号()对信号量进行操作,并将其值递增为1。如果信号量的值为0,并且某个进程想要访问该资源,则该进程将执行wait()操作并阻塞自身,直到利用该资源的当前进程释放该资源为止。
显示器的定义
为了克服在使用信号量进行过程同步时出现的时序错误,研究人员引入了一种高级同步结构,即 显示器类型。监视器类型是 抽象数据类型 用于进程同步。
作为抽象数据类型监视器类型包含 共享数据变量 由所有流程和一些程序员定义的共享 运作 允许进程在监视器中相互排斥地执行。一个过程可以 不直接访问 监视器中的共享数据变量;流程必须访问它 通过程序 定义在监视器中,一次仅允许一个进程访问监视器中的共享变量。
monitor的语法如下:
monitor monitor_name {//共享变量声明过程P1(。。。){}过程P2(。。。){}过程Pn(。。。){}初始化代码(。。。){}}
监视器是一种构造,例如在监视器中一次仅激活一个进程。如果其他进程尝试访问监视器中的共享变量,则该变量将被阻塞,并在队列中排队以在先前访问进程释放共享数据时获得对共享数据的访问。
条件变量 引入了其他同步机制。条件变量 允许进程在监视器内部等待 并允许等待的进程在其他进程释放资源时立即恢复。
的 条件变量 只能调用两个操作 等待()和 信号()。如果有流程 P调用一个wait() 操作它会挂在监视器中直到其他过程 Q调用signal() 操作,即进程调用的signal()操作可恢复已暂停的进程。
- 信号量和监视器之间的基本区别是 信号 是一个 整数变量S 表示系统中可用资源的数量,而 监控 是个 抽象数据类型 一次只能在关键部分执行一个进程。
- 信号量的值可以通过以下方式修改 等待() 和 信号() 仅操作。另一方面,监视器具有共享变量和仅具有过程的过程,进程可以通过这些过程访问共享变量。
- 在信号量中,当进程要访问共享资源时,该进程将执行 等待()操作并阻塞资源,并在释放资源时执行 信号()操作。在监视器中,当进程需要访问共享资源时,它必须通过监视器中的过程来访问它们。
- 显示器类型有 条件变量 哪个信号量没有。
结论:
监视器比信号量更易于实现,并且与信号量相比,监视器发生错误的可能性很小。