OS(A)之儲管理動態分區分配及回收算法


存儲管理動態分區分配及回收算法

一、實驗目的

      分區管理是應用較廣泛的一種存儲管理技術。本實驗要求用一種結構化高級語言構造分區描述器,編制動態分區分配算法和回收算法模擬程序,並討論不同分配算法的特點。

 

二、實驗內容

     1、編寫:First Fit Algorithm

     2、編寫:Best Fit Algorithm

     3、編寫:空閑區回收算法

 

三、實驗過程

(一)主程序

     1、定義分區描述器node,包括 3 個元素:

          (1)adr——分區首地址

          (2)size——分區大小

          (3)next——指向下一個分區的指針

     2、定義 3 個指向node 結構的指針變量:

          (1)head1——空閑區隊列首指針

          (2)back1——指向釋放區node 結構的指針

          (3)assign——指向申請的內存分區node 結構的指針

     3、定義 1 個整形變量:

          free——用戶申請存儲區的大小(由用戶鍵入)

(二)過程

     1、定義check 過程,用於檢查指定的釋放塊(由用戶鍵入)的合法性

     2、定義assignment1 過程,實現First Fit Algorithm

     3、定義assignment2 過程,實現Best Fit Algorithm

     4、定義acceptment1 過程,實現First Fit Algorithm 的回收算法

     5、定義acceptment2 過程,實現Best Fit Algorithm 的回收算法

     6、定義print 過程,打印空閑區隊列

(三)執行

     程序首先申請一整塊空閑區,其首址為0,大小為32767;然后,提示用戶使用哪種分配算法,再提示是分配還是回收;分配時要求輸入申請區的大小,回收時要求輸入釋放區的首址和大小。

(四)輸出

     要求每執行一次,輸出一次空閑區隊列情況,內容包括:

     編號首址 終址 大小

注:輸出空閑區隊列的排序,應符合所用分配算法的要求。

 

四、實驗結果

     • 上機調試

 

 

 

 

 

 

 

 

 

 

     • 遇到的主要問題和解決方法

     分配內存時總是報錯,但不影響程序正常運行

           

 

 

五、實驗總結

     通過本次實驗,我認識到了最先適應算法和最佳適應算法的優缺點和他們之間的差異:

          首次適應算法優缺點:保留了高址部分的大空閑區,有利於后來的大型作業分配;低址部分不斷被划分,留下許多難以利用的小空閑區,每次查找都從低址開始增加了系統開銷。

          最佳適應算法優缺點:每次分配給文件的都是最適合該文件大小的分區,內存中留下許多難以利用的小空閑區。

 

六、源代碼

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define MAX_SIZE 32767
  5 
  6 typedef struct node  //定義分區描述器的結構
  7 {
  8 int id;      //編號
  9 
 10 int adr;      //分區首地址
 11 
 12 int size;        //分區大小
 13 
 14 struct node *next;//指向下一個分區的指針
 15 }Node;
 16 Node *head1,*head2,*back1,*back2,*assign;/*head--空閑區隊列首指針
 17 
 18         back--指向釋放區Node結構的指針
 19 
 20         assign-指向申請的內存分區Node結構的指針*/
 21 
 22 int request; //用戶申請存儲區的大小(由用戶輸入)
 23 int check(int add,int siz,char c)//用於檢查指定的釋放塊(由用戶鍵入)的合法性
 24 {
 25 Node *p,*head;
 26 int check=1;
 27 if(add<0||siz<0)
 28 check=0;/*地址和大小不能為負*/
 29 if(c=='f'||c=='F')
 30 head=head1;
 31 else
 32 head=head2;
 33 p=head->next;
 34 while((p!=NULL)&&check)/*地址不能和空閑區表中結點出現重疊*/
 35       if(((add<p->adr)&&(add+siz>p->adr))||((add>=p->adr)&&(add<p->adr+p->size)))
 36          check=0;
 37       else
 38          p=p->next;
 39 if(check==0)
 40       printf("\t輸入釋放區地址或大小有錯誤!!!\n");
 41      return check;  /*返回檢查結果*/
 42 }
 43 void init()//初始化,生成兩個帶頭節點的空閑隊列指針,
 44 {   //head1指向first-fit的空閑隊列頭,head2指向best-fit的空閑隊列頭
 45 Node *p;
 46 head1=(Node*)malloc(sizeof(Node));
 47 head2=(Node*)malloc(sizeof(Node));
 48 p=(Node*)malloc(sizeof(Node));
 49 head1->next=p;
 50 head2->next=p;
 51 p->size=MAX_SIZE;
 52 p->adr=0;
 53 p->next=NULL;
 54 p->id=0;
 55 }
 56 Node*  assignment1(int num,int req)//實現首次適應算法的分配
 57 
 58 {
 59 Node *before,*after,*ass;
 60 ass=(Node*)malloc(sizeof(Node));
 61 before=head1;
 62 after=head1->next;
 63 ass->id=num;
 64 ass->size=req;
 65 
 66 while(after->size<req)
 67 {
 68 before=before->next;
 69 after=after->next;
 70 }
 71 
 72 if(after==NULL)
 73 {
 74 ass->adr=-1;//分配失敗
 75 }
 76 else
 77 {
 78 if(after->size==req)
 79 {//空閑分區恰好等於所申請的內存大小
 80 before->next=after->next;
 81 ass->adr=after->adr;
 82 }
 83 
 84 else
 85 {//空閑分區大於所申請的內存大小
 86 after->size-=req;
 87 ass->adr=after->adr;
 88 after->adr+=req;
 89 
 90 
 91 }
 92 
 93 }
 94 
 95 return ass; 
 96 
 97 }
 98 
 99 
100 void acceptment1(int address,int siz,int rd)//實現首次適應算法的回收
101 {
102 Node *before,*after;
103 int insert=0;
104 back1=(Node*)malloc(sizeof(Node));
105 before=head1;
106 after=head1->next;
107 back1->adr=address;
108 back1->size=siz;
109 back1->id=rd;
110 back1->next=NULL;
111 while(!insert&&after)
112 {//將要被回收的分區插入空閑區(按首址大小從小到大插入)
113 if((after==NULL)||((back1->adr<=after->adr)&&(back1->adr>=before->adr)))
114 {
115 before->next=back1;
116 back1->next=after;
117 insert=1;
118 }
119 else
120 {
121 before=before->next;
122 after=after->next;
123 }
124 
125  
126 
127 }
128 
129 if(insert)
130 {
131 if(back1->adr==before->adr+before->size)
132 {//和前邊分區合並
133 before->size+=back1->size;
134 before->next=back1->next;
135 free(back1);
136 
137 
138 }
139 
140 else if(after&&back1->adr+back1->size==after->adr)
141 {//和后邊分區合並
142 back1->size+=after->size;
143 back1->next=after->next;
144 back1->id=after->id;
145 free(after);
146 after=back1;
147 }
148 printf("\t首先分配算法回收內存成功!\n");
149 }
150 
151 else
152 printf("\t首先分配算法回收內存失敗!\n");
153  
154 
155 }
156 
157 
158 
159 Node*  assignment2(int num,int req)//實現最佳適應算法的分配
160 {
161 Node *before,*after,*ass,*q;
162 ass=(Node*)malloc(sizeof(Node));
163 q=(Node*)malloc(sizeof(Node));
164 before=head2;
165 after=head2->next;
166 ass->id=num;
167 ass->size=req;
168 while(after->size<req)
169 {
170 before=before->next;
171 after=after->next;
172 }
173 
174 if(after==NULL)
175 {
176 ass->adr=-1;//分配失敗
177 }
178 
179 else
180 {
181 if(after->size==req)
182 {//空閑分區恰好等於所申請的內存大小
183 before->next=after->next;
184 ass->adr=after->adr; 
185 
186 }
187 
188 else
189 {//空閑分區大於所申請的內存大小
190 q=after;
191 before->next=after->next;
192 ass->adr=q->adr;
193 q->size-=req;
194 q->adr+=req;
195 before=head2;
196 after=head2->next;
197 
198 if(after==NULL)
199 
200 {
201 before->next=q;
202 q->next=NULL;
203 }
204 
205 else
206 
207 {
208 while((after->size)<(q->size))
209 {
210 before=before->next;
211 after=after->next;
212 }
213 
214  
215 
216 before->next=q;
217 q->next=after;
218 
219 }
220 
221 }
222 
223  
224 
225 }
226 
227  
228 
229 return (ass);
230 
231  
232 
233 }
234 
235  
236 
237 void acceptment2(int address,int siz,int rd)//實現最佳適應算法的回收
238 {
239 Node *before,*after;
240 int insert=0;//是否被回收的標志
241 back2=(Node*)malloc(sizeof(Node));
242 before=head2;
243 after=head2->next;
244 back2->adr=address;
245 back2->size=siz;
246 back2->id=rd;
247 back2->next=NULL;
248 
249 if(head2->next==NULL)
250 {//空閑隊列為空
251 head2->next=back2;
252 head2->size=back2->size;
253 }
254 
255 else
256 {//空閑隊列不為空
257 while(after)
258 {
259 if(back2->adr==after->adr+after->size)
260 {//和前邊空閑分區合並
261 before->next=after->next;
262 after->size+=back2->size;
263 back2=after;
264  
265 
266 }
267 
268 else
269 {
270 before=before->next;
271 after=after->next;
272 
273 }
274 
275 }
276 
277 
278 before=head2;
279 after=head2->next;
280 while(after)
281 
282 {
283 
284 if(after->adr==back2->adr+back2->size)
285 {//和后邊空閑區合並
286 before->next=after->next;
287 back2->size+=after->size;
288 
289 }
290 
291 else
292 {
293 before=before->next;
294 after=after->next;
295 }
296 
297 }
298 
299 
300 before=head2;
301 after=head2->next;
302 while(!insert)
303 {//將被回收的塊插入到恰當的位置(按分區大小從小到大)
304 if(after==NULL||((after->size>back2->size)&&(before->size<back2->size)))
305          {
306             before->next=back2;
307             back2->next=after;
308             insert=1;
309 break;
310          }
311          else
312          {
313             before=before->next;
314             after=after->next;
315          }
316 
317 }
318 
319  
320 
321 }
322 
323 if(insert)
324 printf("\t最佳適應算法回收內存成功!\n");
325 else
326 printf("\t最佳適應算法回收內存失敗!!\n");
327  
328 
329 }
330 
331  
332 
333  
334 
335 void print(char choice)//輸出空閑區隊列信息
336 {
337 Node *p;
338 if(choice=='f'||choice=='F')
339 p=head1->next;
340 else
341 p=head2->next;
342 if(p)
343 {
344 printf("\n空閑區隊列的情況為:\n");
345 printf("\t編號\t首址\t終址\t大小\n");
346 
347 while(p)
348 {
349 printf("\t%d\t%d\t%d\t%d\n",p->id,p->adr,p->adr+p->size-1,p->size);
350 p=p->next;
351 
352 }
353 
354 }
355 
356 
357 }
358 
359  
360 
361 
362 void menu()//菜單及主要過程
363 {
364 char chose;
365 int ch,num,r,add,rd;
366  while(1)
367 {
368 
369 system("cls");
370 printf("選擇最先適應算法請輸入F,選擇最佳適應算法請輸入B,退出程序請輸入E\n\n");
371 printf("請輸入你的選擇:");
372 scanf("%c",&chose);
373 if(chose=='e'||chose=='E')
374 exit(0);
375 
376 else
377 {
378 system("cls");
379 while(1)
380 {
381 if(chose=='f'||chose=='F')
382 printf("最先適應算法(First-Fit)模擬:\n");
383 if(chose=='b'||chose=='B')
384 printf("最佳適應算法(Best-Fit)模擬:\n");
385 printf("1.分配內存,2.回收內存,3.查看內存,4.返回\n\n");
386 printf("請輸入你的選擇:");
387 scanf("%d",&ch);
388 fflush(stdin);
389 switch(ch)
390 
391 {
392 case 1:
393 printf("輸入申請的分區大小:");scanf("%d",&r);
394 if(chose=='f'||chose=='F')
395 assign=assignment1(num,r);
396 else
397 assign=assignment2(num,r);
398 if(assign->adr==-1)
399 {
400 printf("分配內存失敗!\n");
401 }
402 
403 else 
404 printf("分配成功!分配的內存的首址為:%d\n",assign->adr);
405 
406 
407 break;
408 case 2:
409 printf("輸入釋放的內存的首址:");scanf("%d",&add);
410 printf("輸入釋放的內存的大小:");scanf("%d",&r);
411 printf("輸入釋放的內存的編號:");scanf("%d",&rd);
412 
413 if(check(add,r,chose))
414 {
415 if(chose=='f'||chose=='F')
416 acceptment1(add,r,rd);
417 
418 else
419 acceptment2(add,r,rd);
420 }
421 
422 break;
423 case 3:
424 print(chose);
425 
426 break;
427 
428 case 4:
429 menu();
430 break;
431 
432 }
433 
434 }
435 
436 
437 }
438 
439 }
440 
441 
442 }
443 
444  
445 
446  void main()//主函數
447  {
448 init();
449 menu();
450  
451  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM