首页 文章

信号量与显示器 - 有什么区别?

提问于
浏览
215

Monitor和Semaphore之间的主要区别是什么?

6 回答

  • 1

    Monitor 是一个旨在从多个线程访问的对象 . 监视器对象的成员函数或方法将强制执行互斥,因此在给定时间只有一个线程可以对该对象执行任何操作 . 如果一个线程当前正在执行该对象的成员函数,则尝试调用该对象的成员函数的任何其他线程将必须等到第一个完成后才能执行 .

    Semaphore 是较低级别的对象 . 您可能会使用信号量来实现监视器 . 信号量本质上只是一个计数器 . 当计数器为正时,如果线程试图获取信号量,则允许它,并且计数器递减 . 线程完成后,它会释放信号量,并递增计数器 .

    如果线程试图获取信号量时计数器已经为零,那么它必须等到另一个线程释放信号量 . 如果一个线程释放信号量时多个线程正在等待,那么其中一个线程就会获得它 . 释放信号量的线程不必是获取信号量的线程 .

    监视器就像一个公共厕所 . 一次只能有一个人进入 . 他们锁门以防止其他人进来,做他们的东西,然后在他们离开时解锁 .

    信号量就像一个自行车出租的地方 . 他们有一定数量的自行车 . 如果您尝试雇用一辆自行车并且他们有一辆免费,那么您可以接受它,否则您必须等待 . 当有人返回自行车时,其他人可以接受它 . 如果你有自行车,那么你可以把它交给其他人返回---自行车租赁地点并不关心谁归还它,只要他们骑自行车回来 .

  • 5

    下面的解释实际上解释了监视器的wait()和signal()与信号量的P和V的区别 .

    monitor 中的条件变量的 wait()signal() 操作类似于 PVsemaphores 进行计数的操作 .

    A wait statement 可以阻止进程的执行,而 signal statement 可以导致另一个进程被解除阻塞 . 但是,它们之间有一些 differences . 当进程执行P操作时,它不一定阻止该进程,因为计数信号量可能大于零 . 相反,当执行wait语句时,它总是阻塞进程 . 当任务对信号量执行V操作时,如果没有要解锁的任务,它将解除对等待该信号量的任务的阻塞或增加信号量计数器 . 另一方面,如果进程在没有其他进程解除阻塞时执行信号语句,则对条件变量没有影响 . 信号量和监视器之间的另一个区别是,通过V操作唤醒的用户可以无延迟地恢复执行 . 相反,仅在监视器解锁时才重新启动通过信号操作唤醒的用户 . 此外,监视器解决方案比具有信号量的解决方案更结构化,因为数据和过程封装在单个模块中,并且实现自动提供互斥 .

    链接:here进一步阅读 . 希望能帮助到你 .

  • 8

    信号量允许多个线程(最多一组号码)访问共享对象 . 监视器允许对共享对象进行互斥访问 .

    Monitor

    Semaphore

  • 2

    One Line Answer:

    监视器:一次只能控制一个线程可以在监视器中执行 . (需要获取锁来执行单个线程)

    信号量:一种保护共享资源的锁 . (需要获取锁来访问资源)

  • 5

    当信号量用于保护关键区域时,信号量与受保护数据之间没有直接关系 . 这是信号量可能分散在代码周围的部分原因,以及为什么很容易忘记调用 waitnotify ,在这种情况下,结果将分别违反互斥或永久锁定资源 .

    相比之下,监视器可能会发生这些不好的事情 . 监视器直接对数据感到厌倦(它封装了数据),并且由于监视操作是原子操作,因此编写无需调用入口协议即可访问数据的代码是不可能的 . 监视器操作完成后,将自动调用退出协议 .

    一台显示器有一个在继续之前以条件变量的形式进行条件同步的内置机制 . 如果不满足条件,则该过程必须等待直到通知条件的变化 . 当进程正在等待条件同步时,监视器实现会处理互斥问题,并允许另一个进程访问监视器 .

    取自开放大学M362第3单元“互动过程”课程材料 .

  • 484

    Semaphore :

    使用计数器或标志来控制对并发系统中某些共享资源的访问,意味着使用 Semaphore .

    例:

    • 一个柜台,只允许50名乘客获得任何剧院/公共汽车/火车/有趣骑行/教室的50个座位(共享资源) . 并且只有在有人腾出座位时才允许新乘客 .

    • 二进制标志,指示任何浴室的空闲/被占用状态 .

    • 交通灯是旗帜的好例子 . 他们通过调节道路上的车辆通道来控制流量(共享资源)

    标志仅显示资源的当前状态,没有计数或资源上等待或运行对象的任何其他信息 .

    Monitor :

    Monitor 通过与对该对象感兴趣的线程通信来同步对对象的访问,要求它们获取访问权或等待某些条件成为真 .

    例:

    • 父亲可以作为女儿的监视器,允许她一次只约会一个人 .

    • 一名学校教师使用警棍只允许一个孩子在课堂上讲话 .

    • 最后是技术问题,Account对象上的事务(通过线程)同步以保持完整性 .

相关问题