目錄
Tips:建議打開word【導航視圖】與批注閱讀,數據結構部分的代碼編輯在【批注】內。
拓展實驗4:死鎖檢測算法
-
實驗目的
分析操作系統的核心功能模塊,理解相關功能模塊實現的數據結構和算法,並加以實現,加深對操作系統原理和實現過程的理解。本次實驗: 通過c語言模擬實現死鎖檢測算法。
二、實驗內容
模擬死鎖檢測算法
1. 數據輸入:
"資源分配表"文件,每一行包含資源編號、進程編號兩項(均用整數表示,並用空格分隔開),記錄資源分配給了哪個進程。
"進程等待表"文件,每一行包含進程編號、資源編號兩項(均用整數表示,並用空格分隔開),記錄進程正在等待哪個資源。
下面是一個示例:
資源分配表:
1 1
2 2
3 3
進程等待表:
1 2
2 3
3 1
2. 處理要求:
程序運行時,首先提示"請輸入資源分配表文件的文件名:";再提示"請輸入進程等待表文件的文件名:"。
輸入兩個文件名后,程序將讀入兩個文件中的有關數據,並按照死鎖檢測算法進行檢測。
3. 輸出要求:
第一行輸出檢測結果:有死鎖 或 無死鎖。
第二行輸出進程循環等待隊列,即進程編號(如果有死鎖)。
三、實現思路
死鎖檢測機制:
(1) 為每個進程和每個資源指定唯一編號
(2) 設置一張資源分配狀態表,每個表目包含資源號和占有該資源的進程號兩項,資源分配表中記錄了每個資源正在被哪個進程所占。
(3)設置一張進程等待分配表,每個表目包含進程號和該逃程所等待的資源號兩項。
(4) 死鎖檢測法:當任一進程申請一個已被其他進程占用的資源時,進行死鎖檢測。檢測算法通過反復查找資源分配表和進程等待表,來確定進程對資源的請求是否導致形成環路,若是,便確定出現死鎖。
四、主要的數據結構
//頭文件與宏定義
#include<stdio.h>
//進程結構體定義
typedef struct node
//初始化函數
void initial()
//讀入數據文件
int readData()
//輸出所讀入的數據
cout<<endl<<endl<<"輸出所讀入的數據"<<endl;
//檢測
void check()
//顯示信息函數
void version()
//主函數
void main()
五、算法流程圖
六、運行與測試
資源分配表導入:
進程等待表導入:
被讀入文件的存放目錄:
死鎖檢測:
七、總結
每種類型一個資源的死鎖檢測算法是通過檢測有向圖是否存在環來實現,從一個節點出發進行深度優先搜索,對訪問過的節點進行標記,如果訪問了已經標記的節點,就表示有向圖存在環,也就是檢測到死鎖的發生。