you死锁
产生死锁的根本原因在于系统提供的资源个数少于并发进程所要求的该类资源数。产生死锁有四个必要条件:1.互斥条件;2.不可抢占条件;3.保持和等待条件(部分分配条件);4.循环等待条件;
1.互斥条件:即一个资源每次只能被一个进程使用
2.保持和等待条件:有一个进程已获得了一些资源,但因请求其他资源被阻塞时候,对获得的资源保持不放
3.不可抢占条件:有些系统资源是不可被强占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释放
4.循环等待条件:若干个进程形成环形链,每个占用对方要申请的下一个资源
银行家算法
银行家算法是指在分配资源之前先看清楚资源分配以后是否会导致死锁,如果会死锁,则不分配,否则就分配
按照银行家算法的思想,当进程请求资源时,系统将按如下原则分配资源:
(1)当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程
(2)进程可以分期请求资源,但请求的总数不能超过最大需求量
(3)当系统现有的资源不能满足进程尚需资源数的时候,对进程的请求可以推迟分配,但总能使进程在有限的资源里面得到资源
(4)当系统现有的资源能满足进程尚需资源数的时候,必须测试系统现存的资源能否满足发i进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配
个人观点
首先要记住必要条件,模拟一下死锁过程,才会记得比较清晰
顺便提一下,如果你的程序只有1个进程,但是该程序需要3个单位的资源数,结果一共就2个单位的资源,这到底算不算死锁?确实系统提供的资源个数少于进程的该类的资源数,但是并不全满足死锁的四大必要条件,而且这个并不是并发线程,仅仅单线程而已。
public class ClassA
{
private Object lockKey1=new object();
private object lockKey2=new object();
public static void Init()
{
Thread thread1=new Thread(Run1);
Thread thread2=new Thread(Run2);
thread1.Start();
thread2.Start();
Console.ReadKey();
}
public void Run1()
{
lock(lockKey1)
{
Thread.Sleep(1000);
/**do something**/
lock(lockKey2)
{
/**do something**/
}
}
}
public void Run2()
{
lock(lockKey2)
{
Thread.Sleep(1000);
/**do something**/
lock(lockKey2)
{
/**do something**/
}
}
}
}
linux时候底层Epoll windows时IOCP