2012-09-26 119 views
1

我正在做一项研究,但任何相关信息都很难找到。我偶然发现了这个问题:死锁管理

为以下事务场景生成一个等待图并确定是否存在 死锁。

交易:通过交易锁定

T1 
T2 
T3 
T4 
T5 
T6 
T7 
T8 
T9 
T10 

数据项:

X1,X2,X3 
X4,X5,X6 
X7,X8 
X9,X10 
X11,X12 
X13,X14 
X15 
X1111 
X115 
X199 

数据项交易正在等待:

X4,X5,X6,X7 
X7,X8,X9 
X1,X10,X111 
X7,X11,X12 
X5 
X6,X1,X2,X3,X11,X12 
X5 
X1,X115 
X1 
X11,X12 

现在,据我所看到的交易管理,这让我非常努力。有人可以提供解释如何解决这种类型的问题的参考,或无论如何帮助?

+0

你试过画图表?像铅笔和纸一样? –

+0

我认为在等待部分中缺少一行。 – ninjalj

+0

问题是,我需要一个理论备份,也许是一些网络参考,它逐步解释它背后的理论,包括图形绘制,然后我会试试看。我还没有找到任何有用的材料。 – user1701417

回答

2

正如很常见的,解决一些问题的关键是选择一个好的表示。如果您以表格形式表示您的问题:

T1 => { locked => [ qw(X1 X2 X3) ], waiting => [ qw(X4 X5 X6 X7  ) ] }, 
T2 => { locked => [ qw(X4 X5 X6) ], waiting => [ qw(X7 X8 X9   ) ] }, 
T3 => { locked => [ qw(X7 X8 ) ], waiting => [ qw(X1 X10 X111  ) ] }, 
T4 => { locked => [ qw(X9 X10 ) ], waiting => [ qw(X7 X11 X12   ) ] }, 
T5 => { locked => [ qw(X11 X12 ) ], waiting => [ qw(X5     ) ] }, 
T6 => { locked => [ qw(X13 X14 ) ], waiting => [ qw(X6 X1 X2 X3 X11 X12) ] }, 
T7 => { locked => [ qw(X15  ) ], waiting => [ qw(X5     ) ] }, 
T8 => { locked => [ qw(X1111 ) ], waiting => [ qw(X1 X115   ) ] }, 
T9 => { locked => [ qw(X115 ) ], waiting => [ qw(X1     ) ] }, 
T10 => { locked => [ qw(X199 ) ], waiting => [ qw(X11 X12   ) ] }, 

那么您可以更有效地推理手头的问题。很容易看到某个事务正在等待什么资源,并从那里可以看到哪些事务处理这些资源。递归地应用该推理。如果最终进入循环,你刚刚发现了一个死锁。

“当然,表现甚至会更好:

use strict; 
use warnings; 

use Data::Dumper; 

my %transactions = (
    T1 => { locked => [ qw(X1 X2 X3) ], waiting => [ qw(X4 X5 X6 X7  ) ] }, 
    T2 => { locked => [ qw(X4 X5 X6) ], waiting => [ qw(X7 X8 X9   ) ] }, 
    T3 => { locked => [ qw(X7 X8 ) ], waiting => [ qw(X1 X10 X111  ) ] }, 
    T4 => { locked => [ qw(X9 X10 ) ], waiting => [ qw(X7 X11 X12   ) ] }, 
    T5 => { locked => [ qw(X11 X12 ) ], waiting => [ qw(X5     ) ] }, 
    T6 => { locked => [ qw(X13 X14 ) ], waiting => [ qw(X6 X1 X2 X3 X11 X12) ] }, 
    T7 => { locked => [ qw(X15  ) ], waiting => [ qw(X5     ) ] }, 
    T8 => { locked => [ qw(X1111 ) ], waiting => [ qw(X1 X115   ) ] }, 
    T9 => { locked => [ qw(X115 ) ], waiting => [ qw(X1     ) ] }, 
    T10 => { locked => [ qw(X199 ) ], waiting => [ qw(X11 X12   ) ] }, 
); 

# get a data-item -> transaction mapping 
my %items; 
for my $transaction (keys %transactions) { 
    for my $item (@{$transactions{$transaction}->{locked}}) { 
      $items{$item} = $transaction; 
    } 
} 

my @nodes; 
my @edges; 
for my $transaction (keys %transactions) { 
    push @nodes, $transaction; 
    for my $item (@{$transactions{$transaction}->{waiting}}) { 
      push @edges, { source => $transaction, dest => $items{$item}, item => $item } if $items{$item}; 
    } 
} 

print "digraph tx_dependencies {\n"; 
print " $_ label=$_;\n" for @nodes; 
print " @{[ $_->{source} ]} -> @{[ $_->{dest} ]} [[email protected]{[ $_->{item} ]}];\n" for @edges; 
print "}\n"; 

这个程序喷出一个graphviz的文件,当其与dot适当按摩结束为:

digraph tx_dependencies {T1 label=T1;T9 label=T9;T8 label=T8;T3 label=T3;T4 label=T4;T6 label=T6;T7 label=T7;T5 label=T5;T10 label=T10;T2 label=T2;T1 -> T2 [label=X4];T1 -> T2 [label=X5];T1 -> T2 [label=X6];T1 -> T3 [label=X7];T9 -> T1 [label=X1];T8 -> T1 [label=X1];T8 -> T9 [label=X115];T3 -> T1 [label=X1];T3 -> T4 [label=X10];T4 -> T3 [label=X7];T4 -> T5 [label=X11];T4 -> T5 [label=X12];T6 -> T2 [label=X6];T6 -> T1 [label=X1];T6 -> T1 [label=X2];T6 -> T1 [label=X3];T6 -> T5 [label=X11];T6 -> T5 [label=X12];T7 -> T2 [label=X5];T5 -> T2 [label=X5];T10 -> T5 [label=X11];T10 -> T5 [label=X12];T2 -> T3 [label=X7];T2 -> T3 [label=X8];T2 -> T4 [label=X9];}

+0

非常感谢,我会进一步研究。 – user1701417