1.1. 實驗目的算法
用高級語言完成一個主存空間的分配和回收程序,以加深對動態分區分配方式及其算法的理解。函數
1.2. 實驗要求編碼
採用連續分配方式之動態分區分配存儲管理,使用首次適應算法、循環首次適應算法、最佳適應算法和最壞適應算法4種算法完成設計(任選兩種算法)。spa
(1)**設計一個做業申請隊列以及做業完成後的釋放順序,實現主存的分配和回收。採用分區說明表進行。設計
(2)或在程序運行過程,由用戶指定申請與釋放。調試
(3)設計一個空閒區說明表,以保存某時刻主存空間佔用狀況。把空閒區說明表的變化狀況以及各做業的申請、釋放狀況顯示。code
根據指定的實驗課題,完成設計、編碼和調試工做,完成實驗報告。blog
能夠選用Turbo C做爲開發環境。也能夠選用Windows下的VB,CB或其餘可視化環境,利用各類控件較爲方便。自主選擇實驗環境。隊列
#include"stdio.h" #include"stdlib.h" struct{ float startaddress; /*已分分區起始地址*/ float length; /*已分分區長度,*/ int flag; /*已分配區表登記欄標誌,用"0"表示空欄目*/ }used_table[10]; /*已分配區表*/ struct{ float startaddress; /*空閒區起始地址*/ float length; /*空閒區長度*/ int flag; /*空閒區表登記欄標誌,用"0"表示空欄目,用"1"表示未分配*/ }free_table[10]; /*空閒區表*/ void input(); int CyclicAdaptation(char str,float leg,int pre);//分配主存空間函數循環適應 void FirstAdaptation(char str,float leg);//分配主存空間函數首次適應 void reclaim(char str);//回收主存函數 void input() { int i; printf("\n 輸出空閒區表 \n起始地址 分區長度 標誌\n"); for(i=0;i<10;i++) { printf("%6.0f%9.0f%6d\n",free_table[i].startaddress,free_table[i].length, free_table[i].flag); } printf("\n 按任意鍵,輸出已分配區表\n"); getchar(); printf("\n 輸出已分配區表 \n起始地址 分區長度 標誌\n"); for(i=0;i<10;i++) { if(used_table[i].flag!=0) printf("%6.0f%9.0f%6c\n",used_table[i].startaddress,used_table[i].length, used_table[i].flag); else printf("%6.0f%9.0f%6d\n",used_table[i].startaddress,used_table[i].length, used_table[i].flag); } } int uflag;//分配表標誌 int fflag;//空閒表標誌 int CyclicAdaptation(char str,float leg,int pre) { fflag=0; int k,i; for(i=pre;i<10;i++) { if(free_table[i].flag==1 && free_table[i].length>=leg) { fflag=1;break; } } if(fflag==0) printf("\n 沒有知足條件的空閒區\n"); else { for(k=0;k<10;k++) { if(used_table[k].flag==0) { used_table[k].length=leg; used_table[k].startaddress=free_table[i].startaddress; used_table[k].flag=str; free_table[i].startaddress=free_table[i].startaddress+leg; free_table[i].length=free_table[i].length-leg; free_table[i].flag=1; break; } } } return i; } void FirstAdaptation(char str,float leg) { fflag=0; int k,i; for(i=0;i<10;i++) { if(free_table[i].flag==1 && free_table[i].length>=leg) { fflag=1;break; } } if(fflag==0) printf("\n 沒有知足條件的空閒區\n"); else { for(k=0;k<10;k++) { if(used_table[k].flag==0) { used_table[k].length=leg; used_table[k].startaddress=free_table[i].startaddress; used_table[k].flag=str; free_table[i].startaddress=free_table[i].startaddress+leg; free_table[i].length=free_table[i].length-leg; free_table[i].flag=1; break; } } } } void reclaim(char str) { float uend_address; float fend_address; uflag=0; fflag=0; int k,i; for(k=0;k<10;k++) { if(used_table[k].flag==str) { uflag=1;break; } } if(uflag==0) printf("\n 找不到該進程!\n"); else { for(i=0;i<10;i++) { uend_address=used_table[k].startaddress+used_table[k].length; fend_address=free_table[i].startaddress+free_table[i].length; if(used_table[k].startaddress==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].startaddress=0; printf("\n已回收!\n"); break; } else { if(free_table[i].startaddress==uend_address)//下鄰 { fflag=1; free_table[i].startaddress=used_table[k].startaddress; 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].startaddress=0; printf("\n已成功!\n"); break; } } } if(fflag==0)//上下領都沒有空閒 { i=0; for(i=0;i<10;i++) { if(free_table[i].flag==0) { free_table[i].startaddress=used_table[k].startaddress; 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].startaddress=0; break; } } printf("\n已成功!\n"); } } } int main() { int i; float length; char name; /*空閒分區表初始化:*/ int algorithm; int operate; int pre=0;//循環首次適應算法的前一次掃描空閒表處,初始爲0 free_table[0].startaddress=5120; free_table[0].length=51200; free_table[0].flag=1; for(i=1;i<10;i++) free_table[i].flag=0;/*已分配表初始化:*/ for(i=0;i<10;i++) used_table[i].flag=0; input(); printf("\n Please choose algorithm 1.首次適應算法 2.循環首次適應算法\n"); scanf("%d",&algorithm); if(algorithm==1) { while(1) { printf("\n Please choose operation 1.分配 2.回收\n"); scanf("%d",&operate); if(operate==1) { /*a=1分配主存空間*/ printf("\n 輸入進程名和做業所需長度: "); scanf("%*c%c%f",&name,&length); FirstAdaptation(name,length);/*分配主存空間*/ }else{ /*a=2回收主存空間*/ printf("\n 輸入要回收分區的進程名: "); scanf("%*c%c",&name);reclaim(name);/*回收主存空間*/ } input(); } } else{ while(1) { printf("\n Please choose operation 1.分配 2.回收\n"); scanf("%d",&operate); if(operate==1) { /*a=1分配主存空間*/ printf("\n 輸入進程名和做業所需長度: "); scanf("%*c%c%f",&name,&length); pre=CyclicAdaptation(name,length,pre);/*分配主存空間*/ }else{ /*a=2回收主存空間*/ printf("\n 輸入要回收分區的進程名: "); scanf("%*c%c",&name);reclaim(name);/*回收主存空間*/ } input(); } } return 0; }
運行結果:進程
主存空間的分配與回收這個實驗思路很是清晰,按着思路來編寫程序就能夠了。參考了別人的一些代碼,對主存空間的分配與回收更加熟悉了。