带信号量的优先图

时间:2011-11-14 14:52:51

标签: operating-system posix semaphore

好的,所以这个图必须用最小数量来实现 信号量,我想知道什么时候边缘被认为是多余的,应该是 删除,在我的例子中,(2)到(5)的边缘可以被认为是多余的(为什么) 我还必须指定图形不是循环的,你不能使用cobegin-coend构造

所以我的困境围绕着多余的边缘,因为这会改变我的解决方案,直到现在我想 (2) - (5)可以保留,我按顺序划分信号量:

s1 (from 1 to 2 , 3 and 5)
s2 (from 2 and 3 to 4)
s3 (from 1 , 2 and 3 to 5)
s4 (from 3 , 4 and 5 to 6)

graph

@karmastan 考虑信号量原语signal()和wait()并考虑这个图(1) - s1 - >(2)因此到达(2)你应该在(1)的边缘使用信号量“s1”到(2)你必须先执行(1)所以代码就像

1 :                                          2:
do (1)                                       wait(s1)   //waits for the signal from 1
signal(s1)//1 has finished                   do (2)

@让 - 伯纳德 我理解,所以如果我在这个例子中得到了正确的概念,其中“虚线”边缘 在互斥中被考虑(除了通常的信号量工具之外还有互斥)

cyclic-graph

因此

我应该删除:

(1)---->(6) //because it's a "cross" edge
(3)---->(6) // also because it's a "cross" and excludes (3)--->(5)

然后我会有6个信号量和一个互斥量

s1 (from 1 to 2)
s2 (from 1 to 3)
s3 (from 1 to 4)

s4 (from 2 and 3 to 5)
s5 (from 4 and 5 to 6)
s6 (from 6 to 1)

mutex(between 2 and 4) 

2 个答案:

答案 0 :(得分:1)

1 - > 2和3
2和3 - > 4和5
4和5 - > 6

最长的路径是3,因此它应该可以用3个信号量来实现 顶点应该是对应于源的最长路径的信号量的结果。而先决条件应该是通向最长路径的结果的边缘。

上述措辞令人困惑,但这意味着1-> 5被删除,因为该边缘是1级边缘(来自源),但5是2级节点(具有最大路径)从源头到它的长度2)。相同的过程消除了3-> 6。

您无法消除2-> 5,因为它是通向2级节点的2级路径。如果它是1级路径,或5是3级节点,那么你可以因为其他信号量已经处理了5的先决条件。


考虑从2> 1和6-> 3添加边缘的图表。 (这意味着您可以执行1次,然后需要2次才能重复1次,同样适用于3次和6次。)

1,然后在第2级显示为结果,因为通向2的最长路径是长度2:不需要额外的信号量为2> 1
注意:这并不意味着1作为3级的先决条件出现,这符合我给出的定义,但前面的示例与结果有匹配的先决条件,这只是巧合,所以我想我指出来。

现在您还需要考虑6-> 1的路径。此路径的长度为4,并且尚未进行探索。所以它需要一个额外的信号量,因为它意味着我们有一个第四级。第4级只是6-> 1的信号量,因为这是唯一未探索的长度为4的路径。遍历边缘后,您可以从该点开始忽略它。

因此,使图形循环不会使它变得更难。事情仍处于“水平”状态,不能作为多个级别的结果或先决条件出现。我们之前不需要考虑的唯一事情是,一旦遍历了边缘就忽略它,这就避免了带有循环图的无限循环,而以前就没有必要了。

答案 1 :(得分:0)

我在抓住你的确切含义时遇到了一些麻烦,但我认为你想要的很大一部分是topological sorting