實驗四 主存空間的分配和回收模擬
. 實驗目的
為了合理地分配和使用這些存儲空間,當用戶提出申請主存儲器空間時,存儲管理必須根據申請者的要求,按一定的策略分析主存空間和使用情況,找出足夠的空閑區域給申請者。當作業撤離歸還主存資源時,則存儲管理要收回占用的主存空間。主存的分配和回收的實現是與主存儲器的管理方式有關的,通過本實驗幫助我們理解在不同的存儲管理方式下應怎樣實現主存空間的分配和回收。
用高級語言完成一個主存空間的分配和回收模擬程序,以加深對內存分配方式及其算法的理解。
二. 實驗內容
2.1 模擬包括3部分:
1) 實現特定的內存分配算法
2) 實現內存回收模擬
3) 每種內存分配策略對應的碎片數統計
2.2 固定分區存儲管理:
假設內存容量為120KB,并且分別劃分成23,24,25,26KB大小的塊各一塊。
一個進程所需要的內存為0到100個KB。同時假設一個進程在運行過程中所需內存的大小不變。
模擬五個進程到達請求分配與運行完回收情況,輸出主存分配表.
2.3 動態分區分配存儲管理
采用連續分配方式之動態分區分配存儲管理,使用首次適應算法、下次適應算法、最佳適應算法和最壞適應算法4種算法完成設計(任選兩種算法)。
(1)在程序運行過程,由用戶指定申請與釋放。
(2)設計一個已占用分區表,以保存某時刻主存空間占用情況。
(3)設計一個空閑分區表,以保存某時刻主存空間剩余情況。
(4)用兩個表的變化情況,反應各進程所需內存的申請與釋放情況。
3. 實驗環境
根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。
可以選用Turbo C作為開發環境。也可以選用Windows下的VB,CB或其他可視化環境,利用各種控件較為方便。自主選擇實驗環境。
三、 實驗方法、步驟及結果測試
#include"stdio.h" #include"stdlib.h" #define n 10 /*假定系統允許的最大作業為n,假定模擬實驗中n值為10*/ #define m 10 /*假定系統允許的空閑區表最大為m,假定模擬實驗中m值為10*/ #define minisize 100 struct{ float address; /*已分分區起始地址*/ float length; /*已分分區長度,單位為字節*/ int flag; /*已分配區表登記欄標志,用"0"表示空欄目*/ }used_table[n]; /*已分配區表*/ struct{ float address; /*空閑區起始地址*/ float length; /*空閑區長度,單位為字節*/ int flag; /*空閑區表登記欄標志,用"0"表示空欄目,用"1"表示未分配*/ }free_table[m]; /*空閑區表*/ void main( ) { int i,a; void allocate(char str,float leg);//分配主存空間函數 void reclaim(char str);//回收主存函數 float xk; char J;/*空閑分區表初始化:*/ free_table[0].address=10240; free_table[0].length=102400; free_table[0].flag=1; for(i=1;i<m;i++) free_table[i].flag=0;/*已分配表初始化:*/ for(i=0;i<n;i++) used_table[i].flag=0; while(1) { printf("\n選擇功能項(0-退出,1-分配主存,2-回收主存,3-顯示主存)\n"); printf("選擇功項(0~3) :"); scanf("%d",&a); switch(a) { case 0: exit(0); /*a=0程序結束*/ case 1: /*a=1分配主存空間*/printf("輸入作業名J和作業所需長度xk: "); scanf("%*c%c%f",&J,&xk); allocate(J,xk);/*分配主存空間*/ break; case 2: /*a=2回收主存空間*/printf("輸入要回收分區的作業名"); scanf("%*c%c",&J);reclaim(J);/*回收主存空間*/ break; case 3: /*a=3顯示主存情況*//*輸出空閑區表和已分配表的內容*/ printf("輸出空閑區表:\n起始地址 分區長度 標志\n"); for(i=0;i<m;i++) printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag); printf(" 按任意鍵,輸出已分配區表\n"); getchar(); printf(" 輸出已分配區表:\n起始地址 分區長度 標志\n"); for(i=0;i<n;i++) if(used_table[i].flag!=0) printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag); else printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag); break; default:printf("沒有該選項\n"); }/*case*/ }/*while*/ }/*主函數結束*/ int uflag;//分配表標志 int fflag;//空閑表標志 float uend_address; float fend_address; void allocate(char str,float leg) { uflag=0;fflag=0; int k,i;float ressize; for(i=0;i<m;i++) { if(free_table[i].flag==1 && free_table[i].length>=leg) { fflag=1;break; } } if(fflag==0) printf("沒有滿足條件的空閑區\n"); else { ressize=free_table[i].length-leg; for(k=0;k<n;k++) { if(used_table[k].flag==0) { if(ressize<minisize)//剩余塊過小 { used_table[k].length=free_table[i].length; used_table[k].address=free_table[i].address; used_table[k].flag=str; free_table[i].length=0; free_table[i].flag=0; break; } else { used_table[k].address=free_table[i].address+ressize; used_table[k].flag=str; used_table[k].length=leg; free_table[i].length=ressize; break; } } }//for結束 } } void reclaim(char str) { uflag=0;fflag=0; int k,i; for(k=0;k<n;k++) { if(used_table[k].flag==str) { uflag=1;break; } } if(uflag==0) printf("\n找不到該作業!\n"); else { for(i=0;i<m;i++) { uend_address=used_table[k].address+used_table[k].length; fend_address=free_table[i].address+free_table[i].length; if(used_table[k].address==fend_address)//上鄰 { fflag=1; free_table[i].length=free_table[i].length+used_table[k].length; free_table[i].flag=1; used_table[k].flag=0; used_table[k].length=0; used_table[k].address=0; printf("\n已回收!\n"); break; } else { if(free_table[i].address==uend_address)//下鄰 { fflag=1; free_table[i].address=used_table[k].address; free_table[i].length=free_table[i].length+used_table[k].length; free_table[i].flag=1; used_table[k].flag=0; used_table[k].length=0; used_table[k].address=0; printf("\n已回收!\n"); break; } } }//for結束 if(fflag==0) { i=0; for(i=0;i<m;i++) { if(free_table[i].flag==0) { free_table[i].address=used_table[k].address; free_table[i].length=used_table[k].length; free_table[i].flag=1; used_table[k].length=0; used_table[k].flag=0; used_table[k].address=0; break; } } printf("\n已回收!\n"); } } }
四.實驗總結
感覺這次實驗從原理上理解沒有很費勁;但是在打編程的時候就是不知怎么下手,不知怎么打,最后是上網參考的.原理是能理解,但是在編程上,和還是不能很好的打出程序.
文章列表