2015-10-14 151 views
0

我读过信号量和互斥量之间的差异之一是在互斥体的情况下,进程/线程(曾经有锁)只能释放锁。但是在信号量的情况下,任何其他进程都可以释放信号量。当一个没有信号量的进程可以释放信号量时,我就怀疑了。有一个信号量的用途是什么?信号量和互斥锁定概念

比方说,我有两个进程A和B.假设进程A有一个信号量并执行一些关键任务。现在让我们说过程B发送一个信号来释放信号量。在这种情况下,即使正在执行某个关键任务,它也会处理A信号量吗?

+0

请访问以下链接http://koti.mbnet.fi/niclasw/MutexSemaphore.html,它具有与互斥 –

回答

-1

没有“拥有”信号量之类的东西。信号量不像互斥体那样拥有所有权。你所描述的代码只会是越野车。如果您的代码也有问题,互斥锁将无法工作。

考虑一个信号量的最经典的例子 - 允许一段轨道上一次一列火车。如果火车是一个线程,你可以用一个互斥体来实现它。火车在上轨道之前会锁定轨道互斥体,并在离开轨道后将其解锁。

但是如果列车本身是多线程的呢?哪个线程应该拥有该轨道?

如果信号设备是线程而不是火车呢?在这里,检测进入轨道的列车的信号装置必须锁定轨道,而检测离开轨道的列车的信号装置必须解锁它。

互斥锁适用于短时间内某个特定线程拥有某些内容的情况。该线程可以“拥有”互斥量。信号量对于没有线程拥有任何东西或没有任何线程拥有的情况很有用。

+0

旗语很好的解释与这个问题无关。 – SergeyA

+0

@SergeyA真的吗?你能解释一下你为什么这么想吗? (或者只是自己回答这个问题。)我理解他的问题是不理解如何拥有一个未被拥有的同步原语或为什么它不总是一个共享资源被一个线程不是锁定它的那个线程。 –

+0

因为你做出错误的类比,并且在适用性方面不正确。使用信号量进行线程同步是没有问题的(只要你知道你在做什么)。 – SergeyA

0

你正在半意义上。这不是关于所有权。例如,在我最喜欢的线程乒乓采访问题中,可以使用信号量(和互斥)中的合作伙伴发布。事实上,我已经特意尝试在一次可用的3个实现(Linux/Solaris/AIX)上合作发布互斥锁,并且合作伙伴发布为互斥锁按预期工作 - 即成功释放了互斥锁,并且线程阻止它恢复执行。但是,这当然是由Posix所禁止的。

0

我想你可能会混淆信号量和互斥量之间的整套差异。互斥体提供互斥。信号计数直到达到开始排除的水平。一个计算到一个的信号量会给一个互斥量类似的语义。

一个很好的例子就是电视机。只有很多人才能看到同一台电视机,所以用信号灯来保护它是有道理的。任何人都可以停止看电视。电视机的遥控器一次只能由一个人操作,所以你可以用互斥体保护它。

一些阅读...

https://en.wikipedia.org/wiki/Mutual_exclusion

https://en.wikipedia.org/wiki/Semaphore_%28programming%29

0

“比方说,我有两个进程A和B.假设进程A是具有与其信号量并执行一些现在让我们说过程B发送一个信号释放信号量,在这种情况下,即使它正在执行一些关键任务,过程A是否会释放信号量?“

一个关键点这里要注意的是OS的内核。方法B不能将信号发送到程序中的‘释放信号量’。它能做什么是要求内核为角色它访问资源进程A已经请求内核和内核授予它访问资源的权限 现在进程A完成它的工作之后,会让内核知道它是用资源完成的,然后内核授予访问权限到B.

“我怀疑当没有信号量的过程与它可以释放信号量。什么是使用具有信号的?”

互斥和信号量之间的主要区别,一个信号串行访问资源的多个实例。互斥做同样的,当有一个实例该资源。

计数由内核信号量和互斥体的情况下,维持在这里的计数为1

考虑流程作为客户的一致在银行等待的一个特例。 使用旗语类似于有多个出纳员服务的情况 顾客。互斥体的使用类似于只有一个出纳员的情况。

假设有进程A,B和C需要并行访问资源(锁,文件或内存中的数据结构等)。进一步假设有2个资源实例。因此,一次最多可以授予两个进程访问权限。

进程A根据所需的语义请求访问资源的实例。这个对内核的请求包含数据结构来标识资源和实例的最大数目。2.内核创建一个计数为2的信号量,授予对资源的访问权并将计数递减为1,因为现在只有一个其他进程可以获得访问权。

现在进程B通过遵循相同的语义请求访问资源。内核授予它访问权,并将计数递减到0.

现在进程C请求访问,但内核保持它处于等待状态,因为count为0,并且不超过2个进程可以获得并发访问。

进程A与资源完成并让内核知道。内核注意到这一点,并授予对正在等待的进程C的访问权限。

在互斥体的情况下,内核一次只允许一个进程访问资源。

0

正常的二进制信号量基本上用于同步。但是,互斥体是为了独占访问资源。互斥量是信号量的一个特殊变体,它一次只允许一个锁柜,并且对所有权更加严格,而不是正常的信号量,例如互斥量只能由获取它的线程释放。此外,请注意,如果是pthreads,快速互斥锁可能不会检查与所有权有关的错误,而错误检查互斥锁将返回错误。

对于与2进程A和B有关的查询,进程A应该通过内核来密切注意它的关键工作,以便资源可以用于等待进程B。

你会发现在这个环节上过于一些相关信息: When should we use mutex and when should we use semaphore