[OS]デッドロック検出アルゴリズム

データ構造。

  • n:整数、プロセスの数。
  • m:整数、リソースタイプの数。
  • Available [m]:各リソースの使用可能なインスタンスの数を[1 ... m]に格納する1次元配列。
  • Allocation [n] [m]:nxm行列、Allocation [i] [j]は、プロセスiがすでに保持しているリソースjの数を表します。
  • Request [n] [m]:n×mマトリックス。Request[i] [j]は、この時点でプロセスiによって要求されたリソースjの数を表します。

デッドロック検出アルゴリズム。

TestDeadLock()
{
    
    
	//1.
	Work[1..m]=Available[1..m];
	//向量Work初始化为当前可用资源实例数向量.

	Finish[1..n]=false;
	//向量Finish每个分量都为false,表示初态都是未完成.

	//2.
	change=true;	//循环控制变量.
	while(change)
	{
    
    
		//Request[i]表示矩阵的第i行,也就是进程Pi所申请的资
		//源数向量,若进程Pi未完成,并且需求能够得到满足,就执
		//行Pi,后续释放其中的资源,等价于Work获得Pi已经持有
		//的资源数向量Allocation[i].
		change=false;
		for(int i=1;i<=n;++i)
		{
    
    
			if(Finish[i]==false && Request[i]<Work) 
			{
    
    
				Work=Work+Allocation[i];
				Finish[i]=true;
				change=true;
			}
		}
	}
	//不动点算法:只有当Finish和Allocation不再发生改变时,
	//也就意味着所有的进程都已经完成或者剩余进程都无法运行
	//这两种情况之一发生时,才会跳出while循环.

	//3.
	for(int i=1;i<=n;++i)
	{
    
    
		if(Finish[i]==false)
		{
    
    
			return true;
			//只要存在一个进程是false,就代表出现了死锁
			//返回真值表示检测到了死锁
		}
	}
	return false;
}

銀行家のアルゴリズムとの違い。

銀行家のアルゴリズム。

change=true;
while(change)
{
    
    
	change=false;
	for(int i=1;i<=n;++i)
	{
    
    
		if(Finish[i]==false && Need[i]<Work) 
		{
    
    
			Work=Work+Allocation[i];
			Finish[i]=true;
			change=true;
		}
	}
}

デッドロック検出アルゴリズム。

change=true;
while(change)
{
    
    
	change=false;
	for(int i=1;i<=n;++i)
	{
    
    
		if(Finish[i]==false && Request[i]<Work) 
		{
    
    
			Work=Work+Allocation[i];
			Finish[i]=true;
			change=true;
		}
	}
}

説明。

  • 2セットのコードの7行目に注意してください。デッドロック検出アルゴリズムと比較すると、条件は弱く、リクエスト[i] <W ork Request [i] <WorkR E 、Q 、U 、E S T [ I ]<W o r kはプロセスP i P_iを取り戻しますPリソース。銀行員のアルゴリズムは、N eed [i] <W ork Need [i] <WorkN E E D [ I ]<W O R kはリソースのみを回復しました。
  • バンカーアルゴリズムの目的は、デッドロックを回避することです。つまり、このプロセスグループの操作およびスケジューリングプロセス全体の間、デッドロックが発生しない可能性があるため、プロセスが完全に実行できるかどうか、つまり必要なすべてのリソースを取得できるかどうかを判断する必要があります。 。
  • デッドロック検出アルゴリズムは、Request [i] <W ork Request [i] <Workの場合、現時点でデッドロックがあるかどうかのみを検出しますR E 、Q 、U 、E S T [ I ]<W o r kがtrueの場合、プロセスP i P_iP私たちはこの瞬間に、それは、デッドロックに関与していない楽観的にそのプロセスを前提とP I P_IP将来、より多くのリソースには適用されなくなります(多くのアプリケーションシナリオでは、そのような楽観的な仮定があります)。そのため、保持するリソースは、テスト中に直接回復されます。もちろん、この楽観的な仮定が間違っていて、後続の実行でデッドロックが発生した場合は、後続のデッドロック検出アルゴリズムの実行中に検出されます。

おすすめ

転載: blog.csdn.net/weixin_44246009/article/details/108548948