1. 程式人生 > >實現銀行家演算法和先進先出演算法_從檔案裡讀資料

實現銀行家演算法和先進先出演算法_從檔案裡讀資料

作業系統考試老師出了兩道題,一個是先進先出,另一個是銀行家演算法,題目如下

1.請使用FCFS演算法模擬程序排程。假設系統有n (n>=2) 個程序,給定程序的到達時間以及需要執行的時間長短,給出相應的執行順序。資料以檔案方式給出,檔名為data.fcfs,格式為:

檔案共n(N1…Nn).

在Nn行中有三個資料,第n個程序的程序名,到達時間,執行時間

請根據給定資料,輸出程序執行順序到檔案out.fcfs中。

輸出共n行 : 根據程序執行順序,每一行輸出程序名,程序開始時間,結束時間三項(空格隔開)。

 

2 . 銀行家演算法是避免死鎖的常用演算法。假設系統有

m(m>=2)種資源,n個併發程序。給定當前時刻程序-資源關係,對某個程序提出的資源請求,銀行家演算法判斷是否可以滿足該請求,如果能夠滿足,給出安全序列。
要求根據給定程序-資源關係模擬實現銀行家演算法,給出安全序列。 

給定程序-資源關係格式檔案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個代表程序對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