作業系統死鎖檢測演算法

General 更新 2024年04月29日

  作業系統中死鎖是可以進行檢測的,運用相關的演算法我們可以檢測死鎖從而找到解決方法。下面由小編為大家整理了作業系統的死鎖檢測演算法的相關知識,希望對大家有幫助!

  

  模擬死鎖檢測演算法

  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******;

  }

作業系統死鎖銀行家演算法
作業系統死鎖的危害
相關知識
作業系統死鎖檢測演算法
作業系統四種排程演算法
作業系統死鎖產生的必要條件是什麼
作業系統死鎖原理是什麼怎麼解決
作業系統死鎖銀行家演算法
作業系統死鎖的危害
作業系統死鎖的必要條件
作業系統死鎖產生原因
作業系統死鎖
檢視作業系統安裝日期的方法