作業系統固定分割槽管理方式的主存分配回收模擬系統的設計
使用C語言編寫
1.功能描述
固定分割槽管理方式的主存分配回收模擬系統的設計
固定分割槽法就是把記憶體區固定地劃分為若干個大小不等的區域。系統對記憶體的管理和控制通過資料結構----分割槽說明表進行,分割槽說明表各分割槽號、分割槽大小、起始地址和是否是空閒區。記憶體的分配和釋放、儲存保護以及地址變換等都通過分割槽說明表進行。要求:模擬記憶體分割槽的分配與回收過程。
1. 實現思路:利用分割槽說明表給出既定分割槽大小及起始地址,以及分配情況。分配時依照最先適應方法對作業進行分配。
分配演算法:
cornmap[i].m_addr+=size;
cornmap[i].m_size-=size;
釋放演算法:
cornmap[i-1].m_addr-=size;
cornmap[i-1].m_size+=size;
2. 實驗結果:
3. 原始碼:
//採用最先適應演算法進行分配與釋放
#include "stdio.h"
#define N 5 //假設分割槽為5
struct map{
int m_num;//分割槽號
int m_size;//大小
int m_addr;//起始地址
int m_do;//分配狀態
} cornmap[N]={{1,20,100,0},{2,40,120,0},{3,100,160,0},{4,200,260,0},{5,50,500,0}};
struct mdist{//各作業分配表
int m_addr;
int m_size;
}md[15];
int distribute(int size){
int i;
int regint;
for(i=0;i<5;i++){
regint=cornmap[i].m_addr;
if(cornmap[i].m_do==0){//表示該分割槽未被分配
if(cornmap[i].m_size==size){
cornmap[i].m_do=1;//如果該分割槽完全被分配則將其分配狀態改為1
cornmap[i].m_addr+=size;
cornmap[i].m_size=0;
printf("此時第%d分割槽已完全分配",i);
break;
}
if(cornmap[i].m_size>size){
cornmap[i].m_addr+=size;
cornmap[i].m_size-=size;
break;
}
}
//如果所有分割槽都無法滿足該作業要求的分割槽則執行下一個作業
}
return regint;//返回分配的起始地址
}
int free(int startsize, int startaddr){//釋放作業的起始地址和大小
int i,addr,size;
addr=startaddr;
size=startsize;
for(i=0;cornmap[i].m_addr<=addr;i++){
cornmap[i-1].m_addr-=size;
cornmap[i-1].m_size+=size;
}
return 0;
}
void main(){
int id=0,size,i,k;
int cd;
do{
printf("Please enter the size of the allocated memory space:");
scanf("%d",&size);//輸入需要分配記憶體的作業所要分配的記憶體空間
md[id].m_size=size;
md[id].m_addr=distribute(md[id].m_size);
id++;
printf("Please determine whether to continue the distribution:1or0");//是否繼續分配記憶體
printf("\n");
scanf("%d",&cd);
}while(cd!=0);
for(i=0;i<id;i++){
printf("The %d task is starting from%d and take over %d kb",i+1,md[i].m_addr,md[i].m_size);
printf("\n");
}
printf("分割槽表:\n");
for(i=0;i<N;i++){
printf("num=%d,size=%d,addr=%d,do=%d",i+1,cornmap[i].m_size,cornmap[i].m_addr,cornmap[i].m_do);
printf("\n");
}
do{
printf("Please determine whether to release:1or0" );
scanf("%d",&k);
if(k==0){
break;
}
printf("please input the number of task\n");//請輸入要釋放記憶體的作業號
scanf("%d",&i);
free(md[i-1].m_size,md[i-1].m_addr);
printf("Please determine whether to continue to release:1or0" );//請選擇是否繼續釋放
printf("\n");
scanf("%d",&cd);
}while(cd!=0);
for(i=0;i<id;i++){
printf("The %d task is starting from%d and take over %d kb",i+1,md[i].m_addr,md[i].m_size);
printf("\n");
}
printf("分割槽表:\n");
for(i=0;i<N;i++){
printf("num=%d,size=%d,addr=%d,do=%d",i+1,cornmap[i].m_size,cornmap[i].m_addr,cornmap[i].m_do);
printf("\n");
}
}