【发布时间】:2012-01-06 03:44:32
【问题描述】:
几年前,我参加了一个操作系统研讨会。我的任务是创建一个使用尽可能少的信号量进行进程同步的算法。它应该看起来像这样:
P1 -> P2 -> P3 -> P4 -> P5
P(n) - 过程
一次只运行一个进程并且需要严格的排序。
去年我提出了使用 3 个信号量的解决方案(有效地创建了一个屏障)。 这是我的算法:
P S1 S1 S1 S1
4W1 W0 W0 W0 W0
4S0 P S2 S2 S2
3W2 W1 W1 W1
3S1 P S1 S1
2W1 W0 W0
2S0 P S2
W2 W1
S1 P
(执行是从上到下,每个lane是一个进程)
P - 需要序列化的实际工作
W(n) - 等待
S(n) - 信号n
4W1 的意思是“做 4 个 wait1s”
wait1 和 signal1 使用 semaphore1 等操作...
算法说明:
- 每个流程通道开始
- 第一个进程将运行,其他进程将执行 signal1()
- 除第一个进程外,其他所有进程都将等待信号量 0(执行 wait0)
- 进程 1 等待 4 个信号量 1 后,它发送 4 个信号量 0,创建一个屏障,因为其他进程等待第一个信号量成功完成。
问题是我不知道如何使用 2 个信号量使其工作。
PS:这不是一个作业,这是一个困扰我太久的问题。
【问题讨论】:
-
作为参考,如果五个进程必须按特定顺序运行,并且其余进程无法继续直到前面的进程完成,则您实际上只有一个进程伪装成五人。理想的解决方案包括一个进程和零个信号量。
-
是的,实际上这就是解决方案。当一个人只能创建一个进程并执行已由程序代码序列化的 5 个任务时,为什么有人需要使用共享内存(信号量等)序列化 N 个同时启动的进程。但是在这里,你没有主进程,你不能伪装它。
标签: process synchronization operating-system semaphore