如何通过包含用于锁定和解锁的钩子函数的注入DLL来设置algorithem以进行死锁检测。
实际上我想设备和algorithem进行死锁检测。如果有人能帮我这么做的话。
答案 0 :(得分:3)
从概念上讲,死锁检测原则上很简单,但很难实现。
从高级别的角度来看,你想要的是记录每个线程持有的锁,看看获取锁是否会导致死锁。您可以使用依赖关系图将其可视化,循环意味着死锁。
但是,您可以使用其他操作进行同步:例如自旋锁定。这些将搞砸任何检测尝试,所以要注意这些限制。
所以让我们首先进行模拟:想象3个线程(T1,T2,T3)和3个互斥(M1,M2,M3)
如果T1
等待M3
你被搞砸了(你有一个周期),那么在尝试抓住之前,你需要检查这种情况。
您可以使用以下方式对此进行建模:
如果我们在T1
尝试抓取M3
的情况下对情况进行建模,我们就有:
Table
M1 -> T1,
M2 -> T2,
M3 -> T3,
Graph
{T1, T2, T3} x {T2 -> T1, T3 -> T2}
当T1
尝试抓取M3
时:
T3
。T1 -> T3
是否形成一个循环。答案 1 :(得分:2)
见this CP article - 你不是原创的我害怕。另请参阅this microsoft.public.win32.programmer.kernel article,其中Microsoft员工解释了WIndows内置选项。
答案 2 :(得分:0)
一个简单的算法是为资源分配制作一个等待图...
为此你维持一个像
这样的结构struct process
{
int process_id;
int curr_res;
int want_in_future;
};
表示将是....
(R 1) - - - - > [P1] ------>(R2)
意思是......已经将R1分配给P1,现在这个过程将希望将来有R2
但是这个选择可能会导致你像DEADLOCK一样
表示p1(R1)-----> [P1] ------>(R2)
对于p2(R2)-----> [P2] ------>(R1)
这是一个循环的方式,所以会出现死锁