我读到信号量和互斥之间的区别之一是,在互斥的情况下,进程/线程(曾经拥有锁)只能释放锁。但是在信号量的情况下,任何其他进程都可以释放信号量。当一个没有信号量的进程可以释放信号量时,我的怀疑就出现了。有一个信号量有什么用?
假设我有两个进程A和B。假设进程A有一个信号量,正在执行一些关键任务。现在让我们假设进程B发送一个信号来释放信号量。在这种情况下,进程A是否会释放信号量,即使它正在执行一些关键任务?
发布于 2015-10-15 03:09:12
你说的有点道理。这不是所有权的问题。例如,在我最喜欢的面试问题线程乒乓中,信号量(和互斥)中的合作伙伴释放是可用的。事实上,我已经特别尝试过一次在3个可用的实现(Linux/Solaris/AIX)上合作发布一个互斥锁,而合作伙伴发布确实像预期的那样对互斥锁起作用--即互斥锁被成功释放,阻塞在互斥锁上的线程恢复执行。然而,这当然是Posix所禁止的。
发布于 2015-10-15 03:12:42
我认为您可能会对信号量和互斥量之间的一整套区别感到困惑。互斥提供互斥。信号量会一直计数,直到它达到开始排除的级别。不过,计数为1的信号量会给出类似于互斥锁的语义。
电视机就是一个很好的例子。只有这么多人可以观看同一台电视机,所以使用信号量来保护它是有意义的。任何人都可以停止看电视。电视的遥控器一次只能由一个人操作,所以你可以用互斥来保护它。
一些阅读..。
发布于 2015-10-15 04:43:47
“假设我有两个进程A和B。假设进程A有一个信号量,正在执行一些关键任务。现在假设进程B发送一个信号来释放信号量。在这种情况下,进程A会释放信号量吗,即使它正在执行一些关键任务?”
这里需要注意的一个关键点是操作系统内核的角色。进程B不能向进程A发送信号“释放信号量”。它能做的就是请求内核给它访问资源的权限。进程A请求内核,内核授予它对资源的访问权限。现在,进程A在完成其任务之后,将让内核知道它已经完成了对资源的处理,然后内核授予对B的访问权限。
“当一个没有信号量的进程可以释放信号量时,我就会产生怀疑。有信号量有什么用呢?”
互斥锁和信号量之间的关键区别在于,信号量序列化了对资源的多个实例的访问。当存在资源的一个实例时,互斥执行相同的操作。
在信号量的情况下,计数由内核维护,而互斥是计数为1的特殊情况。
将流程视为在银行排队等候的客户。信号量的使用类似于有多个出纳员为客户服务的情况。互斥量的使用类似于只有一个出纳员的情况。
假设有需要并发访问资源(锁、文件或内存中的数据结构等)的进程A、B和C。进一步假设该资源有2个实例。因此,一次最多只能授予两个进程访问权限。
进程A按照所需的语义请求对资源实例的访问。这个对内核的请求涉及到用于标识资源和最大实例数为2的数据结构。内核创建计数为2的信号量,授予A对资源的访问权限,并将计数减为1,因为现在只有一个其他进程可以访问。
现在,进程B通过遵循相同的语义请求对资源的访问。内核授予它访问权限,并将计数递减到0。
现在进程C请求访问,但是内核将它保持在等待状态,因为count为0并且不超过2个进程可以获得并发访问。
进程A完成了对资源的处理,并通知内核。内核注意到了这一点,并授予一直在等待的进程C的访问权限。
在互斥的情况下,内核一次只允许一个进程访问资源。
https://stackoverflow.com/questions/33133005
复制相似问题