我正在学习计算信号量但却无法理解它。我已经阅读了几乎所有的文章,但仍然很难理解它。
以下是我对厕所钥匙示例(http://niclasw.mbnet.fi/MutexSemaphore.html)的理解 在这里,
厕所 - 关键部分
Key - Semaphore
人 - 过程
纠正我如果我错了以上。我的问题是:
1)“信号量将共享资源的同时用户数限制为最大数量”。不同时访问共享变量会导致竞争条件吗?
2)在一个进程获取信号量之后,它是否会在它的关键部分运行?(基于示例)
3)如果某个进程在CS中并且另一个进程获取了信号量,它是否会同时运行其CS还是等待它?
对不起,如果我的问题很简陋,但我正在努力去理解它。请用一个例子来解释一下信号量?
答案 0 :(得分:0)
让我们说有一个贵宾室。房间里最多可容纳3人。将您的信号量设置为3。
信号量是你的保镖,以阻止第四人进入房间。
它是如何工作的?您可以使用信号量调用两个函数:wait()
和signal()
wait()
函数只需将信号量值减少 1.如果新值为负,则必须等到该值再次为正。
所以你开始使用信号量= 3.每个人进入房间,它减少了1。
人1进入... sem = 2
人2进入... sem = 1
人3进入... sem = 0
第4个人试图进入但是sem = -1现在,我们的保镖不会让他进入。所以,他必须等待。 直到,有人离开了房间!
当你完成关键部分时,你signal()
让局外人知道他现在可以进入。如您所知,此函数将信号量值增加 1。
互斥量是信号量= 1。
主题A:
mutex.wait(); //makes mutex = 0
CS();
mutex.signal();
主题B:
mutex.wait(); //has to wait until A signals so the mutex = 1 again
CS();
mutex.signal();
有了这个实现,当A正在运行时,B无法通过上下文切换到达CS,在那里他改变了一些全局变量。 B必须等到A完成。反之亦然。
要对信号量有更多了解,你可以查看着名的问题,如生产者和消费者,理发店,餐饮哲学家......有很多这些问题。我相信这种方式更有趣,方案可以帮助您更轻松地理解。 另外,我认为this非常有用。
希望这有帮助!