进程同步和计数信号量

时间:2016-04-13 14:09:20

标签: concurrency process synchronization semaphore critical-section

我正在学习计算信号量但却无法理解它。我已经阅读了几乎所有的文章,但仍然很难理解它。

以下是我对厕所钥匙示例(http://niclasw.mbnet.fi/MutexSemaphore.html)的理解 在这里,

厕所 - 关键部分

Key - Semaphore

人 - 过程

纠正我如果我错了以上。我的问题是:

1)“信号量将共享资源的同时用户数限制为最大数量”。不同时访问共享变量会导致竞争条件吗?

2)在一个进程获取信号量之后,它是否会在它的关键部分运行?(基于示例)

3)如果某个进程在CS中并且另一个进程获取了信号量,它是否会同时运行其CS还是等待它?

对不起,如果我的问题很简陋,但我正在努力去理解它。请用一个例子来解释一下信号量?

1 个答案:

答案 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非常有用。

希望这有帮助!