作業系統實驗及程式碼(全)
題目1:基本操作命令實踐
實驗目的:
配合作業系統課程的學習,加深作業系統提供命令介面的功能的理解。
內容及要求:
一、驗證如下命令,並且將每條命令的具體格式,記錄在實驗報告中。最常見的作業系統管理的一些命令。其中包括:
1、最基本、最常用的測試物理網路連通性的命令ping。ping命令用於確定本地主機是否與網路上另外一臺主機相連。
2、檢視DNS、IP地址、MAC地址的命令ipconfig。
3、網路信使命令net send。
4、顯示計算機當前所開放的所有埠的命令netstat,並瞭解埠的具體意義。
5、瞭解net系列命令的使用。例如net view, net user, net share等。
6、路由跟蹤命令tracert及pathping。
7、遠端桌面連線命令mstsc。
二、藉助網路,再列舉一些作業系統管理命令,不少於5個並且將每條命令的具體格式,記錄在實驗報告中。
1.appwiz.cpl:程式和功能
2.calc:啟動計算器
3.certmgr.msc:證書管理實用程式
4.charmap:啟動字元對映表
5.chkdsk.exe:Chkdsk磁碟檢查(管理員身份執行命令提示符)
6.cleanmgr: 開啟磁碟清理工具
7.cliconfg:SQL SERVER客戶端網路實用工具
8.cmstp:連線管理器配置檔案安裝程式
9.cmd.exe:CMD命令提示符
10.自動關機命令
Shutdown -s -t 600:表示600秒後自動關機
shutdown -a :可取消定時關機
Shutdown -r -t 600:表示600秒後自動重啟
rundll32 user32.dll,LockWorkStation:表示鎖定計算機
11.colorcpl:顏色管理,配置顯示器和印表機等中的色彩
12.CompMgmtLauncher:計算機管理
13.compmgmt.msc:計算機管理
14.credwiz:備份或還原儲存的使用者名稱和密碼
15.comexp.msc:開啟系統元件服務
16.control:控制面版
17.dcomcnfg:開啟系統元件服務
18.Dccw:顯示顏色校準
19.devmgmt.msc:裝置管理器
20.desk.cpl:螢幕解析度
21.dfrgui:優化驅動器 Windows7→dfrg.msc:磁碟碎片整理程式
22.dialer:電話撥號程式
23.diskmgmt.msc:磁碟管理
24.dvdplay:DVD播放器
25.dxdiag:檢查DirectX資訊
26.eudcedit:造字程式
27.eventvwr:事件檢視器
28.explorer:開啟資源管理器
29.Firewall.cpl:Windows防火牆
30.FXSCOVER:傳真封面編輯器
31.fsmgmt.msc:共享資料夾管理器
32.gpedit.msc:組策略
33.hdwwiz.cpl:裝置管理器
34.inetcpl.cpl:Internet屬性
35.intl.cpl:區域
36.iexpress:木馬捆綁工具,系統自帶
37.joy.cpl:遊戲控制器
38.logoff:登出命令
39.lusrmgr.msc:本地使用者和組
40.lpksetup:語言包安裝/刪除嚮導,安裝嚮導會提示下載語言包
41.lusrmgr.msc:本機使用者和組
42.main.cpl:滑鼠屬性
43.mmsys.cpl:聲音
44.magnify:放大鏡實用程式
45.mem.exe:顯示記憶體使用情況(如果直接執行無效,可以先管理員身份執行命令提示符,在命令提示符裡輸入mem.exe>d:a.txt即可開啟d盤檢視a.txt,裡面的就是記憶體使用情況了。當然什麼盤什麼檔名可自己決定。)
46.MdSched:Windows記憶體診斷程式
47.mmc:開啟控制檯
48.mobsync:同步命令
49.mplayer2:簡易widnows mediaplayer
50.Msconfig.exe:系統配置實用程式
51.msdt:微軟支援診斷工具
52.msinfo32:系統資訊
53.mspaint:畫圖
54.Msra:Windows遠端協助
55.mstsc:遠端桌面連線
56.NAPCLCFG.MSC:客戶端配置
57.ncpa.cpl:網路連線
58.narrator:螢幕“講述人”
59.Netplwiz:高階使用者帳戶控制面板,設定登陸安全相關的選項
60.netstat : an(TC)命令檢查介面
61.notepad:開啟記事本
62.Nslookup:IP地址偵測器
63.odbcad32:ODBC資料來源管理器
64.OptionalFeatures:開啟“開啟或關閉Windows功能”對話方塊
65.osk:開啟螢幕鍵盤
66.perfmon.msc:計算機效能監測器
67.perfmon:計算機效能監測器
68.PowerShell:提供強大遠端處理能力
69.printmanagement.msc:列印管理
70.powercfg.cpl:電源選項
71.psr:問題步驟記錄器
72.Rasphone:網路連線
73.Recdisc:建立系統修復光碟
74.Resmon:資源監視器
75.Rstrui:系統還原
76.regedit.exe:登錄檔
77.regedt32:登錄檔編輯器
78.rsop.msc:組策略結果集
79.sdclt:備份狀態與配置,就是檢視系統是否已備份
80.secpol.msc:本地安全策略
81.services.msc:本地服務設定
82.sfc /scannow:掃描錯誤並復原/windows檔案保護
83.sfc.exe:系統檔案檢查器
84.shrpubw:建立共享資料夾
85.sigverif:檔案簽名驗證程式
86.slui:Windows啟用,檢視系統啟用資訊
87.slmgr.vbs -dlv :顯示詳細的許可證資訊
slmgr.vbs -dli :顯示許可證資訊
slmgr.vbs -xpr :當前許可證截止日期
slmgr.vbs -dti :顯示安裝ID以進行離線啟用
slmgr.vbs -ipk :(Product Key)安裝產品金鑰
slmgr.vbs -ato :啟用Windows
slmgr.vbs -cpky :從登錄檔中清除產品金鑰(防止洩露引起的攻擊)
slmgr.vbs -ilc :(License file)安裝許可證
slmgr.vbs -upk :解除安裝產品金鑰
slmgr.vbs -skms :(name[ort] )批量授權
88.snippingtool:截圖工具,支援無規則截圖
89.soundrecorder:錄音機,沒有錄音時間的限制
90.StikyNot:便箋
91.sysdm.cpl:系統屬性
92.sysedit:系統配置編輯器
93.syskey:系統加密,一旦加密就不能解開,保護系統的雙重密碼
94.taskmgr:工作管理員(舊版)
95.TM工作管理員(新版)
96.taskschd.msc:任務計劃程式
97.timedate.cpl:日期和時間
98.UserAccountControlSettings使用者賬戶控制設定
99.utilman:輔助工具管理器
100.wf.msc:高階安全Windows防火牆
101.WFS:Windows傳真和掃描
102.wiaacmgr:掃描器和照相機嚮導
103.winver:關於Windows
104.wmimgmt.msc:開啟windows管理體系結構(WMI)
105.write:寫字板
106.wscui.cpl:操作中心
107.wscript:windows指令碼宿主設定
108.wuapp:Windows更新
題目2:Windows程序的建立與銷燬
內容及要求:
① 掌握Windows程序的建立和銷燬API的呼叫方法;程式設計程式碼,在程式中建立和銷燬一個Word程序;
② 能夠掛起和啟用被建立程序的主執行緒;
③ 通過Windows程序管理器檢視系統程序列表的變化。
實驗指導:
①建立程序的API
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
例程:
void main( VOID ){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
) {
ErrorExit( "CreateProcess failed." );
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
②銷燬程序API
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
③掛起程序的主執行緒API
DWORD SuspendThread(
HANDLE hThread
);
④啟用程序的主執行緒API
DWORD ResumeThread(
HANDLE hThread
);
⑤程序檢視器
#include"iostream"
#include"windows.h"
using namespacestd;
void main( VOID ){
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
TCHARszCommandLine[]=TEXT("NOTEPAD");
ZeroMemory(&si, sizeof(si) );
si.cb= sizeof(si);
ZeroMemory(&pi, sizeof(pi) );
if(!CreateProcess( NULL, szCommandLine, NULL,NULL, FALSE,0,NULL, NULL,&si,&pi ) )
{
fprintf(stderr,"Createprocess Failed ");
}
int x;
while(true){
cout<<"請輸入要選擇的操作:\n0:銷燬程序\n1:掛起程序\n2:啟用程序\n3:退出\n";
cin>>x;
switch(x){
case0:
if(TerminateProcess(pi.hProcess,0))
cout<<"銷燬程序成功"<<endl;
else
cout<<"銷燬失敗"<<endl;
break;
case1:
if(SuspendThread(pi.hThread))
cout<<"掛起程序成功"<<endl;
else
cout<<"掛起失敗"<<endl;
break;
case2:
if(ResumeThread(pi.hThread))
cout<<"啟用程序成功"<<endl;
else
cout<<"啟用失敗"<<endl;
break;
case3:
exit(0);
default:
cout<<"選項不正確"<<endl;
}
}
}
題目3 作業排程
一、實驗目的
1、 對作業排程的相關內容作進一步的理解。
2、 明白作業排程的主要任務。
3、 通過程式設計掌握作業排程的主要演算法。
二、實驗內容及要求
1、對於給定的一組作業, 給出其到達時間和執行時間,例如下表所示:,
作業名 |
A |
B |
C |
D |
E |
F |
到達時間 |
0 |
2 |
5 |
5 |
12 |
15 |
服務時間 |
6 |
50 |
20 |
10 |
40 |
8 |
2、分別用先來先服務演算法、短作業優先和響應比高者優先三種演算法給出作業的排程順序。
3、計算每一種演算法的平均週轉時間及平均帶權週轉時間並比較不同演算法的優劣。
三、實驗報告
1、程式中使用的資料結構及符號說明。
2、給出主要演算法的流程圖。
3、給出程式清單並附上註釋。
4、給出測試資料和執行結果。
#include<iostream>
using namespace std;
#define MAX 10
struct task_struct {
charname[10]; //程序名稱
intnumber; //程序編號
floatcome_time; //到達時間
floatrun_begin_time; //開始執行時間
floatrun_time; //執行時間
floatrun_end_time; //執行結束時間
int order; //執行次序
intrun_flag; //排程標誌
}tasks[MAX];
int counter; //實際程序個數
int fcfs(); //先來先服務
int sjf(); //短作業優先
int hrrn(); //響應比高優先
int pinput(); //程序引數輸入
int poutput(); //排程結果輸出
void main() {
intoption;
pinput();
while(true){
printf("請選擇排程演算法(0~4):\n");
printf("1.先來先服務\n");
printf("2.短作業優先\n");
printf("3.響應比高優先\n");
printf("0.退出\n");
scanf("%d",&option);
switch(option) {
case0:
printf("執行結束。\n");
exit(0);
break;
case1:
printf("對程序按先來先服務排程。\n\n");
fcfs();
poutput();
break;
case2:
printf("對程序按短作業優先排程。\n\n");
sjf();
poutput();
break;
case3:
printf("對程序按響應比高優先排程。\n\n");
hrrn();
poutput();
break;
}
}
}
int fcfs() //先來先服務
{
floattime_temp=0;
inti;
intnumber_schedul;
time_temp=tasks[0].come_time;
for(i=0;i<counter;i++){
tasks[i].run_begin_time=time_temp;
tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;
tasks[i].run_flag=1;
time_temp=tasks[i].run_end_time;
number_schedul=i;
tasks[number_schedul].order=i+1;
}
return0;
}
int sjf(){ //短作業優先
floattemp_time=0;
inti=0,j;
intnumber_schedul,temp_counter;
floatrun_time;
run_time=tasks[i].run_time;
j=1;
while((j<counter)&&(tasks[i].come_time==tasks[j].come_time)){
if(tasks[j].run_time<tasks[i].run_time){
run_time=tasks[j].run_time;
i=j;
}
j++;
}
//查詢第一個被排程的程序
//對第一個被排程的程序求相應的引數
number_schedul=i;
tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
tasks[number_schedul].order=1;temp_counter=1;
while(temp_counter<counter) {
for(j=0;j<counter;j++) {
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag)) {
run_time=tasks[j].run_time;
number_schedul=j;
break;
}
}
for(j=0;j<counter;j++) {
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
if(tasks[j].run_time<run_time) {
run_time=tasks[j].run_time;
number_schedul=j;
}
}
//查詢下一個被排程的程序
//對找到的下一個被排程的程序求相應的引數
tasks[number_schedul].run_begin_time=temp_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
temp_counter++;
tasks[number_schedul].order=temp_counter;
}
return0;
}
int hrrn() /*響應比高優先*/
{
intj,number_schedul,temp_counter;
floattemp_time,respond_rate,max_respond_rate;
//第一個程序被排程
tasks[0].run_begin_time=tasks[0].come_time;
tasks[0].run_end_time=tasks[0].run_begin_time+tasks[0].run_time;
temp_time=tasks[0].run_end_time;
tasks[0].run_flag=1;
tasks[0].order=1;
temp_counter=1;//排程其他程序
while(temp_counter<counter){
max_respond_rate=0;
for(j=1;j<counter;j++){
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
{
respond_rate=(temp_time-tasks[j].come_time)/tasks[j].run_time;
if(respond_rate>max_respond_rate){
max_respond_rate=respond_rate;
number_schedul=j;
}
}
}
//找響應比高的程序
tasks[number_schedul].run_begin_time=temp_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
temp_time=tasks[number_schedul].run_end_time;
tasks[number_schedul].run_flag=1;
temp_counter+=1;
tasks[number_schedul].order=temp_counter;
}
return0;
}
int pinput() //程序引數輸入
{
inti;
printf("請輸入程序的數量:\n");
scanf("%d",&counter);
for(i=0;i<counter;i++)
{
printf("請輸入第%d個程序資訊 :\n",i+1);
printf("請輸入程序名字:\n");
scanf("%s",tasks[i].name);
printf("請輸入程序編號:\n");
scanf("%d",&tasks[i].number);
printf("請輸入程序到達時間:\n");
scanf("%f",&tasks[i].come_time);
printf("請輸入程序執行時間:\n");
scanf("%f",&tasks[i].run_time);
tasks[i].run_begin_time=0;
tasks[i].run_end_time=0;
tasks[i].order=0;
tasks[i].run_flag=0;
}
return0;
}
int poutput() //排程結果輸出
{
inti;
floatturn_round_time=0,f1,w=0;
printf("程序名字 程序編號 到達時間 執行時間 開始時間 結束時間 執行次序 週轉時間\n");
for(i=0;i<counter;i++){
f1=tasks[i].run_end_time-tasks[i].come_time;
turn_round_time+=f1;
w+=(f1/tasks[i].run_time);
printf("%s, %d, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d,%5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].order,f1);
}
printf("平均週轉時間=%5.2f\n",turn_round_time/counter);
printf("平均帶權週轉時間=%5.2f\n",w/counter);
return0;
}
題目4 基於優先數的時間片輪轉排程演算法排程處理器
一、實驗目的
在採用多道程式設計的系統中,同時處於就緒態的程序往往有多個,當就緒態的程序數大於處理器的個數時,就需按照某種策略進行分配處理器。本次設計模擬在單處理器情況下采用基於優先數的時間片輪轉排程演算法進行處理器排程,加深瞭解處理器排程工作過程。
二、實驗內容及要求
1、設計一個程式實現基於優先數的時間片輪轉排程演算法排程處理器。
2、假定系統有5個程序,每個程序用一個程序控制塊PCB來代表,程序控制塊的結構如下圖1.2所示:
程序名 |
指標 |
到達時間 |
要求執行時間 |
已執行時間 |
優先數 |
程序狀態 |
圖1
其中:
程序名:作為程序的標識。
指標:程序按順序排成迴圈連結串列,用指標指出下一個程序的程序控制塊首地址,最後一個程序中的指標指出第一個程序的程序控制塊首地址。
要求執行時間:假設程序需要執行的單位時間數。
已執行時間:假設程序已經執行的單位時間數,初值為0。
狀態:可假設有兩種狀態,就緒狀態和結束狀態。程序的初始狀態都為就緒狀態。
3、每次執行所設計的處理器排程程式排程程序之前,為每個程序任意確定它的要求執行時間。
4、此程式是模擬處理器排程,因此,被選中的程序並不實際啟動執行,而是執行
已執行時間+1
來模擬程序的一次執行,表示程序已經執行過一個單位時間。
.5、在所設計的程式中應有顯示或列印語句,能顯示或列印每次被選中的程序名以及執行一次後程序佇列的變化。
6、為程序任意確定要求執行時間,執行所設計的處理器排程程式,顯示或列印逐次被選中程序的程序名以及程序控制塊的動態變化過程。
7、設有一個就緒佇列,就緒程序按優先數(優先數範圍0-100)由小到大排列(優先數越小,級別越高)。當某一程序執行完一個時間片後,其優先順序應下調(如優先數加2或3)。
8、例如一組程序如下表:
程序名 |
A |
B |
C |
D |
E |
F |
G |
H |
J |
K |
L |
M |
到達時間 |
0 |
1 |
2 |
3 |
6 |
8 |
12 |
12 |
12 |
18 |
25 |
25 |
服務時間 |
6 |
4 |
10 |
5 |
1 |
2 |
5 |
10 |
4 |
3 |
15 |
8 |
三、實驗報告
1、程式中使用的資料結構及符號說明。
2、給出主要演算法的流程圖
3、給出程式清單並附上註釋
4、列印程式執行時的初值和執行結果。(執行一個程序輸出一次結果)
//按優先數排程演算法實現處理器排程的程式
#include"stdio.h"
#include"string.h"
#definenum 5//假定系統中程序個數為5
structPCB
{
charID;//程序名
intruntime;//要求執行時間
intpri;//優先數
char state; //狀態,R-就緒,F-結束
};
structPCB pcblist[num];//定義程序控制塊陣列
voidinit()//PCB初始化子程式
{
int i;
for(i=0;i<num;i++)
{
printf("PCB[%d]:程序名 優先數 要求執行時間 \n",i+1);//為每個程序任意指定pri和runtime
scanf("%s%d%d",&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);
pcblist[i].state='R';//程序初始狀態均為就緒
getchar();//接收回車符
}
}
intmax_pri_process()//確定最大優先順序程序子程式
{
int max=-100;//max為最大優先數,初始化為-100
inti;
intkey;
for(i=0;i<num;i++)
{
if(pcblist[i].state=='r')//r為輔助狀態標誌,表示正在執行
return-1;//返回-1
else
if(max<pcblist[i].pri&&pcblist[i].state=='R')//從就緒程序中選取優先數最大的程序
{
max=pcblist[i].pri;//max存放每次迴圈中的最大優先數
key=i;//將程序號賦給key
}
}
if(pcblist[key].state=='F')//具有最大優先數的程序若已執行完畢
return-1;//則返回-1
else//否則
returnkey;//將key作為返回值返回
}
voidshow()//顯示子程式
{
inti;
printf("\n 程序名 優先數 要求執行時間 狀態 \n");
printf("-------------------------------------------------\n");
for(i=0;i<num;i++)//依次顯示每個程序的名、優先數、要求執行時間和狀態
{
printf("%s%6d%8d%s\n",&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state);
}
printf(" pressany key to continue...\n");
}
voidrun()//程序執行子程式
{
inti,j;
intt=0;//t為執行次數
for(j=0;j<num;j++)
{
t+=pcblist[j].runtime;}//執行次數即為各個程序執行時間之和
printf("\nbeforerun,the conditon is:\n");
show();//呼叫show()子程式顯示執行前PCB的情況
getchar();//等待輸入回車符
for(j=0;j<t;j++)
{
while(max_pri_process()!=-1)//具有最大優先數的程序沒有執行完,讓其執行
{
pcblist[max_pri_process()].state='r';//將其狀態置為r,表示其正在執行
}
for(i=0;i<num;i++)
{
if(pcblist[i].state=='r')
{
pcblist[i].pri-=1;//將當前執行程序的優先數減1
pcblist[i].runtime--;//要求執行時間減1
{
if(pcblist[i].runtime==0)
pcblist[i].state='F';//執行完則將該程序狀態置為結束
else
pcblist[i].state='R';//未執行完將其狀態置為就緒
}
show();//顯示每次執行後各PCB的情況
getchar();//等待回車進入下一次執行
}
}
}
}
voidmain()//按動態優先數排程主程式
{
init();//初始化各個程序PCB
run();//程序排程模擬
}
題目5 銀行家演算法
一、實驗目的
1、 對死鎖避免中的銀行家演算法作進一步理解。
2、 加深理解死鎖的概念。
3、 加深理解安全序列和安全狀態的概念。
4、 通過程式設計,掌握銀行家演算法分配資源的一步步實現過程。
二、實驗內容及要求
1、給出系統可用資源向量(例如:系統可用資源=(5,3,8,2,10))。
2、若干程序最大需求矩陣如下表所示:
3、採用時間片輪轉法排程程序。
4、程序執行時提出資源請求(可利用隨機數給出或從鍵盤輸入)。
5、判斷資源是否可以安全分配,要求程序每提出一個資源請求,都要進行安全判斷並給出安全序列,否則給出提示。
三、實驗報告
1、程式中使用的資料結構及符號說明。
2、給出主要演算法的流程圖。
3、給出程式清單並附上註釋。
4、給出測試資料和執行結果。
#include<iostream>
usingnamespace std;
#defineMAXPROCESS 50 //最大程序數
#defineMAXRESOURCE 100 //最大資源數
intAvailable[MAXRESOURCE]; //可用資源陣列
intMax[MAXPROCESS][MAXRESOURCE]; //最大需求矩陣
intAllocation[MAXPROCESS][MAXRESOURCE]; //分配矩陣
intNeed[MAXPROCESS][MAXRESOURCE]; //需求矩陣
int Request[MAXPROCESS][MAXRESOURCE]; //程序需要資源數
boolFinish[MAXPROCESS]; //系統是否有足夠的資源分配
intp[MAXPROCESS]; //記錄序列
intm,n; //m個程序,n個資源
voidInit(){ //初始化演算法
int i,j;
cout<<"請輸入程序的數目:";
cin>>m;
cout<<"請輸入資源種類的數目:";
cin>>n;
cout<<"請輸入每個程序最大需求資源數矩陣:"<<endl;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
cin>>Max[i][j];
}
}
cout<<"請輸入每個程序已分配的各資源數矩陣:"<<endl;
for(i=0;i<m;i++){ //判斷輸入的資源數是否合理
for(j=0;j<n;j++){
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];//各程序尚需要的資源數
if(Need[i][j]<0){
cout<<"您輸入的第"<<i+1<<"個程序的第"<<j+1<<"個資源數有錯誤,請重新輸入:"<<endl;
j--;
continue;
}
}
}
cout<<"請輸入可利用資源向量矩陣:"<<endl;
for(i=0;i<n;i++){
cin>>Available[i];
}
}
boolSafe(){ //判斷安全函式
inti,j,k,l=0;
int Work[MAXRESOURCE]; //系統可提供給程序繼續執行所需要的各類資源數目
for(i=0;i<n;i++)
Work[i]=Available[i];
for(i=0;i<m;i++){
Finish[i]=false;
}
for(i=0;i<m;i++){
if(Finish[i]==true){
continue;
}
else{
for(j=0;j<n;j++){
if(Need[i][j]>Work[j]){
break;
}
}
if(j==n){
Finish[i]=true;
for(k=0;k<n;k++){
Work[k]+=Allocation[i][k];
}
p[l++]=i;
i=-1;
}
else{
continue;
}
}
if(l==m){ //如果系統是安全的,將資源分配給程序
cout<<"此時系統是安全的"<<endl;
cout<<"安全序列為:"<<endl;
for(i=0;i<l;i++){
cout<<p[i];
if(i!=l-1){
cout<<"-->";
}
}
cout<<""<<endl;
returntrue;
}
}
cout<<"此時系統是不安全的"<<endl;
returnfalse;
}
voidBank() /*銀行家演算法*/
{
int i,cusneed;
char again;
while(1)
{
cout<<"請輸入要申請資源的程序號(第1個程序號為0,依次類推)"<<endl;
cin>>cusneed;
cout<<"請輸入程序的各資源需求矩陣"<<endl;
for(i=0;i<n;i++)
{
cin>>Request[cusneed][i];
}
for(i=0;i<n;i++)
{
if(Request[cusneed][i]>Need[cusneed][i])
{
cout<<"您輸入的請求數超過程序的需求量!請重新輸入!"<<endl;
continue;
}
if(Request[cusneed][i]>Available[i])
{
cout<<"您輸入的請求數超過系統擁有的資源數!請重新輸入!"<<endl;
continue;
}
}
for(i=0;i<n;i++) //假如系統將資源分配給p[i]
{
Available[i]-=Request[cusneed][i];
Allocation[cusneed][i]+=Request[cusneed][i];
Need[cusneed][i]-=Request[cusneed][i];
}
if(Safe()) //執行判斷是否安全函式
{
cout<<"同意分配請求!"<<endl;
}
else
{
cout<<"您的請求被拒絕!"<<endl;
for(i=0;i<n;i++) //不安全的,回覆資源分配表
{
Available[i]+=Request[cusneed][i];
Allocation[cusneed][i]-=Request[c