實現銀行家演算法和先進先出演算法_從檔案裡讀資料
作業系統考試老師出了兩道題,一個是先進先出,另一個是銀行家演算法,題目如下
1.請使用FCFS演算法模擬程序排程。假設系統有n (n>=2) 個程序,給定程序的到達時間以及需要執行的時間長短,給出相應的執行順序。資料以檔案方式給出,檔名為data.fcfs,格式為:
檔案共n(N1…Nn)行.
在Nn行中有三個資料,第n個程序的程序名,到達時間,執行時間
請根據給定資料,輸出程序執行順序到檔案out.fcfs中。
輸出共n行 : 根據程序執行順序,每一行輸出程序名,程序開始時間,結束時間三項(空格隔開)。
2 . 銀行家演算法是避免死鎖的常用演算法。假設系統有
要求根據給定程序-資源關係模擬實現銀行家演算法,給出安全序列。
給定程序-資源關係格式檔案data.dijkstra:
第一行為資源數m(m>=2).
第二行為併發程序數n(N1,N2,N3…Nn).
第三行代表可利用資源向量,有m個數,為m種資源每一個的可利用資源數(m1,m2,m3…)
之後有n(N1,N2,N3…Nn)行,每一行有一個程序名以及2*m個數,前m個代表Nn這個程序對m類資源的最大需求數, 後
最後一行為資源請求,共m+1個數,第一個數k代表程序Nk,後m個數代表程序Nk請求m種資源的數量。
請根據給定資料,輸出程序Nk請求資源之後的安全序列到檔案out.dijkstra中,若不滿足安全狀態則輸出Failed。
輸出格式 : 程序名N1 程序名N2 … (中間用空格隔開)
emmm,如果單純是考思想和演算法的話,第一道題就太簡單了,第二道題可能實現起來麻煩,短時間內可能寫不出來,可是第一道題一定可以短時間內解決,但是尷尬的是老師要求資料從檔案裡面讀,
由於自己對c++的檔案讀寫不太熟,所以尷尬 的一道題沒解決,(考過試之後就完全自閉了。。)。今天又花了時間把這兩道題做了一下,在網上看了一些關於檔案流的知識,把這兩道題解決。
自己也把關於c++常見的檔案讀寫方面的知識做了一個簡單的總結,如果和我一樣對c++流操作不熟的可以看一下我這篇部落格:
1:第一道題的輸入資料是這樣子的
程式碼如下
1 #include<bits/stdc++.h> 2 #include<fstream> 3 using namespace std; 4 int main() 5 { 6 int line=0; 7 char a[100];//程序名稱 8 int start[100];//到達時間 9 int time[100];//持續時間 10 int len=0; 11 ifstream fin("D:/data.fcfs"); 12 ofstream fout("D:/data1.fcfs"); 13 if(!fin || !fout){ 14 cout << "wrong" << endl; 15 } 16 while(fin){ 17 fin >> a[line] >> start[line] >> time[line]; 18 line++; 19 20 } 21 int array[line]; 22 memset(array,0,sizeof(array)); 23 for(int i=0;i<line-1;i++){//根據start陣列得到從小到大的一種程序序號,先來先服務 24 int min=1000; 25 int tip=-1; 26 for(int j=0;j<line-1;j++){ 27 if(start[j]<min && array[j]==0){ 28 min =start[j]; 29 tip=j; 30 } 31 } 32 array[tip]=-1; 33 if(i==0){ 34 fout<<a[tip] <<"\t"<<start[tip] << "\t" << start[tip]+time[tip] << "\n"; 35 len=start[tip]; 36 len+=time[tip]; 37 }else{ 38 fout<<a[tip] <<"\t"<<len << "\t" << len+time[tip] << "\n"; 39 len+=time[tip]; 40 } 41 } 42 fin.close(); 43 fout.close(); 44 return 0; 45 }
輸出到檔案data1.fcfs
2:第二道題資料如下
程式碼
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 4 #include<fstream> 5 #include<iostream> 6 using namespace std; 7 # define m 50 8 int no1; //程序數 9 int no2; //資源數 10 int r; 11 ofstream fout("D:\\out.dijkstra"); 12 int allocation[m][m],need[m][m],available[m],max1[m][m]; 13 char name1[m],name2[m]; 14 char d[5]; 15 //={'A','B','C','D','E'} //定義全域性變數 16 void check() //安全演算法函式 17 { 18 int k,f,v=0,i,j; 19 int work[m],a[m]; 20 bool finish[m]; 21 r=1; 22 for(i=0;i<no1;i++) 23 finish[i]=false; // 初始化程序均沒得到足夠資源數並完成 24 for(i=0;i<no2;i++) 25 work[i]=available[i];//work[i]表示可提供程序繼續執行的各類資源數 26 k=no1; 27 do{ 28 for(i=0;i<no1;i++) 29 { 30 if(finish[i]==false) 31 { 32 f=1; 33 for(j=0;j<no2;j++) 34 if(need[i][j]>work[j]) 35 f=0; 36 if(f==1) //找到還沒有完成且需求數小於可提供程序繼續執行的資源數的程序 37 { 38 finish[i]=true; 39 a[v++]=i; //記錄安全序列號 40 for(j=0;j<no2;j++) 41 work[j]+=allocation[i][j]; //釋放該程序已分配的資源 42 } 43 } 44 } 45 k--; //每完成一個程序分配,未完成的程序數就減1 46 }while(k>0); 47 f=1; 48 for(i=0;i<no1;i++) //判斷是否所有的程序都完成 49 { 50 if(finish[i]==false) 51 { f=0; 52 break; 53 } 54 } 55 if(f==0) //若有程序沒完成,則為不安全狀態 56 { 57 printf("系統處在不安全狀態!"); 58 fout<<"Failed"<<endl; 59 r=0; 60 } 61 else{ 62 printf("\n系統當前為安全狀態,安全序列為:\n"); 63 for(i=0;i<no1;i++) 64 { 65 //printf("p%d ",a[i]); //輸出安全序列 66 cout<<d[a[i]]<<" "; 67 fout<<d[a[i]]<<" "; 68 } 69 fout<<endl; 70 } 71 } 72 void print() //輸出函式 73 { 74 int i,j; 75 printf("\n"); 76 printf("*************此時刻資源分配情況*********************\n"); 77 printf("程序名/號 | Max | Allocation | Need |\n"); 78 for (i = 0; i < no1; i++) 79 { 80 //printf(" p%d ",i); 81 cout<<" "<<d[i]<<" "; 82 for (j = 0; j < no2; j++) 83 {printf("%d ",max1[i][j]);} 84 85 for (j = 0; j < no2; j++) 86 {printf(" %d ",allocation[i][j]);} 87 88 for (j = 0; j < no2; j++) 89 {printf(" %d ",need[i][j]);} 90 91 printf("\n"); 92 } 93 printf("\n"); 94 printf("各類資源可利用的資源數為:"); 95 for (j = 0; j < no2; j++) 96 {printf(" %d",available[j]);} 97 printf("\n"); 98 } 99 int main(void) 100 { 101 void check(); 102 void print(); 103 int i,j,p=0,q=0; 104 char c; 105 //ofstream fout("D:\\out.dijkstra",ios::out); 106 ifstream fin("D:\\data.dijkstra"); 107 int request[m],allocation1[m][m],need1[m][m],available1[m]; 108 printf("\t\t**********************************************\n"); 109 printf("\t\t* 銀行家演算法的設計與實現 *\n"); 110 printf("\t\t**********************************************\n"); 111 printf("請輸入資源種類數:\n"); 112 //scanf("%d",&no2); 113 //fscanf(fin,"%d",&no2); 114 fin>>no2;//3 115 printf("請輸入程序總數:\n"); 116 //scanf("%d",&no1); 117 //fscanf(fin,"%d",&no1); 118 fin>>no1;//5 119 printf("請輸入Available矩陣\n"); 120 for(i=0;i<no2;i++) 121 fin>>available[i]; 122 //fscanf(fin,"%d",&available[i]); //輸入已知的可用資源數 123 printf("請輸入Max矩陣:\n"); 124 printf("請輸入Allocation矩陣:\n"); 125 for(i=0;i<no1;i++) 126 { 127 fin>>d[i]; 128 for(j=0;j<2*no2;j++) 129 { 130 if(j<no2) 131 fin>>max1[i][j]; 132 else 133 fin>>allocation[i][j-3]; 134 } 135 } 136 //fscanf(fin,"%d",&max1[i][j]); 137 //輸入已知程序最大資源需求量 138 /*printf("請輸入Allocation矩陣:\n"); 139 for(i=0;i<no1;i++) 140 for(j=0;j<no2;j++) 141 fin>>allocation[i][j]; 142 //fscanf(fin,"%d",&allocation[i][j]); //輸入已知的程序已分配的資源數*/ 143 for(i=0;i<no1;i++) 144 for(j=0;j<no2;j++) 145 need[i][j]=max1[i][j]-allocation[i][j]; //根據輸入的兩個陣列計算出need矩陣的值 146 147 print(); //輸出已知條件 148 check(); //檢測T0時刻已知條件的安全狀態 149 150 // if(r==1) //如果安全則執行以下程式碼 151 // { 152 // do{ 153 // q=0; 154 // p=0; 155 // printf("\n請輸入請求資源的程序號(0~4):\n"); 156 // for(j=0;j<=10;j++) 157 // { 158 // //fscanf(fin,"%d",&i); 159 // fin>>i; 160 // i--; 161 // if(i>=no1) 162 // { 163 // printf("輸入錯誤,請重新輸入:\n"); 164 // continue; 165 // } 166 // else break; 167 // } 168 // printf("\n請輸入該程序所請求的資源數request[j]:\n"); 169 // for(j=0;j<no2;j++) 170 // //scanf("%d",&request[j]); 171 // fin>>request[j]; 172 // for(j=0;j<no2;j++) 173 // if(request[j]>need[i][j]) p=1; 174 // //判斷請求是否超過該程序所需要的資源數 175 // if(p) 176 // { 177 // printf("請求資源超過該程序資源需求量,請求失敗!\n"); 178 // fout<<"Failed"<<endl; 179 // } 180 // else 181 // { 182 // for(j=0;j<no2;j++) 183 // if(request[j]>available[j]) q=1; 184 // //判斷請求是否超過可用資源數 185 // if(q) 186 // { 187 // printf("沒有做夠的資源分配,請求失敗!\n"); 188 // fout<<"Failed"<<endl; 189 // } 190 // else //請求滿足條件 191 // { 192 // for(j=0;j<no2;j++) 193 // { 194 // available1[j]=available[j]; 195 // allocation1[i][j]=allocation[i][j]; 196 // need1[i][j]=need[i][j]; 197 // //儲存原已分配的資源數,仍需要的資源數和可用的資源數 198 // 199 // available[j]=available[j]-request[j]; 200 // allocation[i][j]+=request[j]; 201 // need[i][j]=need[i][j]-request[j]; 202 // //系統嘗試把資源分配給請求的程序 203 // } 204 // print(); 205 // check(); //檢測分配後的安全性 206 // if(r==0) //如果分配後系統不安全 207 // { 208 // for(j=0;j<no2;j++) 209 // { 210 // available[j]=available1[j]; 211 // allocation[i][j]=allocation1[i][j]; 212 // need[i][j]=need1[i][j]; 213 // //還原已分配的資源數,仍需要的資源數和可用的資源數 214 // } 215 // printf("返回分配前資源數\n"); 216 // print(); 217 // } 218 // } 219 // }printf("\n你還要繼續分配嗎?Y or N ?\n"); 220 // //判斷是否繼續進行資源分配 221 // c=getche(); 222 // }while(c=='y'||c=='Y'); 223 // } 224 }
結果如下
因為題目只是判斷當前狀態是否處於安全狀態,所以只需把當前狀態的結果輸出即可,如果繼續求每個程序的request是否可以分配,只需把註釋開啟,稍微調一下程式碼
參考:https://blog.csdn.net/qq_34164532/article/details/78754657