0

我有 2 个进程 P1 和 P2 共享 3 个信号量(s1、s2、s3),每个信号量的初始值为 1,还有 3 个变量(x、y、z)

P1:                  P2:
wait(s1);            wait(s2);  
x = x + 1;           y = y * 2;
wait(s2);            wait(s3);
y = y - x;           z = z - y;
wait(s3);            signal(s2);
z = x + 2 * y - z;   wait(s1);
signal(s3);          x = x + 2;
signal(s2);          signal(s1);
signal(s1);          signal(s3);

如果我要在具有单个 CPU 的计算机上同时运行它们,P1 和 P2 是否有可能陷入死锁?

我的看法是,一旦它们开始运行,它们都会等待(),这会导致它们坐下来,直到有信号()它们。既然没有其他东西在运行,那么它们不是都陷入僵局了吗?我觉得我错过了一些非常简单的知识,这些知识阻碍了我的理解。任何见解表示赞赏!

4

4 回答 4

0

当 P2 等待(s1)时,s1 必须在 P1 的手中,所以 P2 不能继续发信号(S3),然后 P1 永远等待(s3)。这就是僵局。

于 2013-03-29T01:02:19.333 回答
0

您示例中的三个信号量初始化为 1,因此不会在每个进程的第一行阻塞。

现在考虑这个示例运行:

  • P2 一直运行到 wait(s1),就在该语句执行之前。此时,信号量 s2 和 s1 的计数为 1,s3 的计数为 0。
  • 现在 P1 执行直到它无法获取的 wait(s3),因为它的值是 0,但是为了到达那里它已经获得了 s1 和 s2 的所有权
  • 现在 P2 恢复执行,但在等待 s1 时立即被阻塞

此时,两个进程都处于死锁状态。

于 2013-03-29T01:08:48.160 回答
0

两种死锁

1)信号(消耗资源)

– 每个任务都在等待另一个任务的信号 – 无法退出

2) 单元(可重用资源)

  • 每个任务都在等待另一个任务释放资源单元。可以通过中止任务来退出,直到有足够的资源可用以释放其他任务。

信号死锁

图:信号死锁

最初,信号量 a 和 b 都是 1。 死锁

 if P1 and P2 complete their
first wait’s simultaneously before
attempting their second wait’s

.

可能不容易测试信号死锁:

不容易测试

可能导致死锁

 if P1 calls T(a,b) and
P2 calls T(b,a) at the same time.
于 2013-03-29T01:15:02.153 回答
-1

不,因为它们是不同的过程。我认为您在谈论互斥锁对吗?

于 2013-03-29T01:00:13.067 回答