作業系統死鎖檢測演算法
作業系統中死鎖是可以進行檢測的,運用相關的演算法我們可以檢測死鎖從而找到解決方法。下面由小編為大家整理了作業系統的死鎖檢測演算法的相關知識,希望對大家有幫助!
模擬死鎖檢測演算法
1. 輸入:
“資源分配表”檔案,每一行包含資源編號、程序編號兩項***均用整數表示,並用空格分隔開***,記錄資源分配給了哪個程序。
“程序等待表”檔案,每一行包含程序編號、資源編號兩項***均用整數表示,並用空格分隔開***,記錄程序正在等待哪個資源。
下面是一個示例:
資源分配表:
1 1
2 2
3 3
程序等待表:
1 2
2 3
3 1
2. 處理要求:
程式執行時,首先提示“請輸入資源分配表文件的檔名:”;再提示“請輸入程序等待表文件的檔名:”。
輸入兩個檔名後,程式將讀入兩個檔案中的有關資料,並按照死鎖檢測演算法進行檢測。
3. 輸出要求:
第一行輸出檢測結果:有死鎖 或 無死鎖。
第二行輸出程序迴圈等待佇列,即程序編號***如果有死鎖***。
4. 檔名約定
提交的源程式名字:resourceXXX.c或者resourceXXX.cpp***依據所用語言確定***
輸入檔名字:可由使用者指定
結果輸出到resultXXX.txt中
其中:XXX為賬號。
5. 死鎖檢測演算法:當任一程序Pj申請一個已被其他程序佔用的資源ri時,進行死鎖檢測。檢測演算法通過反覆查詢程序等待表和資源分配表,
來確定程序Pj對資源ri的請求是否導致形成環路,若是,便確定出現死鎖。
6. 測試說明:測試教師將事先準備好一組檔案***格式為*.txt***,從中為每個程式隨機指定一至三個作為輸入檔案
***被測試者需從鍵盤輸入指定檔案的檔名***,並檢視程式輸出結果。
本程式包括:死鎖檢測演算法
VC++除錯通過
***C***copyright by Neo
歡迎大家測試 請問題請
#include<stdio.h>
#include<iostream.h>
#include<string.h>
const int MAXQUEUE=100; //定義表的最大行數
typedef struct node{
int resource;
int process;
}cell;
cell occupy[MAXQUEUE];
int occupy_quantity;
cell wait[MAXQUEUE];
int wait_quantity;
//初始化函式
void initial******
{
int i;
for***i=0;i<MAXQUEUE;i++***{
occupy[i].process=-1;
occupy[i].resource=-1;
wait[i].process=-1;
wait[i].resource=-1;
}
occupy_quantity=0;
wait_quantity=0;
}
//讀資料檔案
int readData******
{
FILE *fp;
char fname[20];
int i;
cout<<"請輸入資源分配表文件的檔名:"<<endl;
strcpy***fname,"10trouble1.txt"***;
//cin>>fname;
if******fp=fopen***fname,"r"******==NULL***{
cout<<"錯誤,檔案打不開,請檢查檔名:***"<<endl;
return 0;
}
else{
while***!feof***fp******{
fscanf***fp,"%d %d",&occupy[occupy_quantity].resource,&occupy[occupy_quantity].process***;
occupy_quantity++;
}
}
cout<<"請輸入程序等待表文件的檔名:"<<e
ndl;
strcpy***fname,"10trouble2.txt"***;
//cin>>fname;
if******fp=fopen***fname,"r"******==NULL***{
cout<<"錯誤,檔案打不開,請檢查檔名:***"<<endl;
return 0;
}
else{
while***!feof***fp******{
fscanf***fp,"%d %d",&wait[wait_quantity].process,&wait[wait_quantity].resource***;
wait_quantity++;
}
}
//輸出所讀入的資料
cout<<endl<<endl<<"輸出所讀入的資料"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"資源分配表"<<endl;
cout<<"資源編號 程序編號"<<endl;
for***i=0;i<occupy_quantity;i++***{
cout<<" "<<occupy[i].resource<<" "<<occupy[i].process<<endl;
}
cout<<"───────────────────────"<<endl;
cout<<"程序等待表"<<endl;
cout<<"程序編號 資源編號"<<endl;
for***i=0;i<wait_quantity;i++***{
cout<<" "<<wait[i].resource<<" "<<wait[i].process<<endl;
}
return 1;
}
//檢測
void check******
{
int table[MAXQUEUE][MAXQUEUE];
int table1[MAXQUEUE][MAXQUEUE];
int i,j,k;
int flag,t,p;
int max_process;
//初始化表格
for***i=0;i<MAXQUEUE;i++***{
for***j=0;j<MAXQUEUE;j++***{
table[i][j]=0;
table1[i][j]=0;
}
}
//先找到程序最大編號
max_process=-1;
for***i=0;i<occupy_quantity;i++***{
if***occupy[i].process>max_process***{
max_process=occupy[i].process;
}
}
for***i=0;i<wait_quantity;i++***{
if***wait[i].process>max_process***{
max_process=wait[i].process;
}
}
for***i=0;i<wait_quantity;i++***{
for***j=0;j<occupy_quantity;j++***{
if***wait[i].resource==occupy[j].resource***{
table[wait[i].process][occupy[j].process]=1;
table1[wait[i].process][occupy[j].process]=1;
}
}
}
cout<<"初始等待佔用表:"<<endl;
for***i=0;i<max_process+1;i++***{
for***j=0;j<max_process+1;j++***{
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for***i=0;i<max_process+1;i++***{
for***j=0;j<max_process+1;j++***{
for***k=0;k<max_process+1;k++***{
table[i][j]=table[i][j]||***table[i][k]&&table[k][j]***;
}
}
}
cout<<"檢測後的等待佔用表:"<<endl;
for***i=0;i<max_process+1;i++***{
for***j=0;j<max_process+1;j++***{
cout<<table[i][j]<<" ";
}
cout<<endl;
}
flag=-1;
for***i=0;i<max_process+1;i++***{
if***table[i][i]==1***{
flag=i;
break;
}
}
cout<<endl<<endl<<"檢測結果"<<endl;
cout<<"───────────────────"<<endl;
if***flag!=-1***{
cout<<"存在死鎖"<<endl;
cout<<"程序迴圈等待佇列:";
p=flag; //存在程序迴圈等待佇列的那一程序
//程序迴圈等待佇列中的所有程序是table表中的這一行是1的程序,只是順序要再確定
t=1;
while***t***{
cout<<p<<" ";
for***j=0;j<max_process+1;j++***{
if***table1[p][j]==1***{
if***table[j][flag]==1***{
p=j;
break;
}
}
}
if***p==flag***t=0;
}
cout<<flag<<endl;
}
else{
cout<<"不存在死鎖"<<endl;
}
}
//顯示版權資訊函式
void version******
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━
━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 死 鎖 檢 測 算 法 ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ ***c***All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163 ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main******
{
int flag;
version******;
initial******;
flag=readData******;
if***flag***check******;
}
作業系統死鎖的危害