【问题标题】:Process synchronization using semaphores使用信号量进行进程同步
【发布时间】:2015-04-13 19:44:08
【问题描述】:

我想知道我在以下情况下的做法是否正确:

There are 5 processes P1, P2, P3, P4 ad P5. And they can execute as follows:

• P1 can start any time.
• P2 can start after P1 completes.
• P3 can start after P1 completes.
• P4 can start after both P2 and P3 complete.
• P5 can start after P4 completes.

This needs to be explained using semaphores.

我的方法:P2 和 P3 必须在 P1 上等待(比如信号量 S1)。 P4 必须等待 P2 和 P3(比如信号量 S2),而 P5 必须等待 P4(比如信号量 S3)。因此,最初所有其他进程都在等待,除了 P1。 P1 执行,S1 阻止任何其他进程。 P1执行完成后,可以post两次,所以现在P2和P3正在执行,P4和P5正在等待。当 P2 和 P3 完成后,S2 可以发布,然后 P4 可以执行,P5 正在等待。 P4 完成后,S3 发布,然后 P5 执行。

这是对的吗?此外,还有一些混淆。在每种情况下,信号量的初始值是多少? S1 是 1,S2 是 2,S3 是 1?另外,当 P1 开始执行时,S1 变为 0 并阻塞所有其他进程,其他情况类似,但它怎么知道只允许 P1 和任何其他进程首先?

【问题讨论】:

  • 您要解决的问题是什么,或者这是一个假设?您是否也考虑过使用线程安全的 FIFO 队列?
  • @Igor 你能告诉我这个解决方案是否会在任何时候死锁吗?

标签: operating-system synchronization semaphore


【解决方案1】:

几乎正确。然而,为了让 P4 在同时 P2 和 P3 上等待,它必须获取 S2 两次(P2 和 P3 不需要相互同步 - 它们都只是向 S2 发布一次。

当进程启动时,它们所有都应该等待一个信号量(P1 除外)。 P2 和 P3 在 S1 上等待,P4 在 S2 上等待,P5 在 S3 上等待。信号量在计数为零时阻塞。因此,所有信号量的初始值都应为零。

P1 立即执行,原因很简单,它不等待任何信号量,它只是开始其任务。

【讨论】:

  • 哦,好吧!我知道了。谢谢!
  • 有一个问题,这个解决方案在任何时候都会陷入僵局吗?
  • 在最简单的形式中,当进程 A 持有资源 X 并需要资源 Y 继续进行时,就会发生死锁。同时,进程 B 持有资源 Y,需要资源 X 才能继续。由于您的控制流中没有这样的交叉依赖关系,因此不会出现死锁。
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
相关资源
最近更新 更多