源代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define n 5 //允许最大作业数目
#define m 5 //允许最大空间分区数目
#define minisize 100 //分配分区时,若找到的最小适合空间作业偏大,则分割该分区
struct{
float address;//起始地址
float length;//长度
int flag;//0表示空闲,否则为已分配,可记录作业名称
}used_table[n];//已分配分区表
struct{
float address;
float length;
int flag;//为1表示未分配,否则为已分配
}free_table[m];//未分配分区表
void allocate(char job,float len){//分配函数
int i,k=-1;//k表示适合作业最小分区下标
for(i=0;i<m;i++)
if(free_table[i].length>=len&&free_table[i].flag==1)
if(k==-1||free_table[i].length<free_table[k].length)
k=i;
if(k==-1){
printf("Allocation Failure!\n");
return;
}
float ad;
if(free_table[k].length-len<=minisize){
free_table[k].flag=0;
ad=free_table[k].address;
len=free_table[k].length;
}else{//分割分区
free_table[k].length=free_table[k].length-len;
ad=free_table[k].address+free_table[k].length;
}
i=0;
while(used_table[i].flag!=0&&i<n)
i++;
if(i>n){
printf("the used_table is full!\n");
if(free_table[k].flag==0)
free_table[k].flag=1;
else{
free_table[k].length=free_table[k].length+len;//组合分区
return;
}
}else{
used_table[i].address=ad;
used_table[i].length=len;
used_table[i].flag=job;
}
return;
}
void reclaim(char job){//回收函数
int s=0,t;
while((used_table[s].flag!=job||used_table[s].flag==0)&&s<n)
s++;
if(s>=n){
printf("can not find the job");
return;
}
used_table[s].flag=0;
float S=used_table[s].address,L=used_table[s].length;
int i,j=-1,k=-1;
for(i=0;i<m;i++){
if(free_table[i].address+free_table[i].length==S)//上邻空闲区
k=i;
if(S+L==free_table[i].address)//下邻空闲区
j=i;
}
if(k!=-1&&j==-1){//上邻空闲区,下邻非空闲区,与上邻合并
free_table[k].length=free_table[k].length+L;
//used_table[s].address=0;
//used_table[s].length=0;
}else if(k!=-1&&j!=-1){//有上下邻空闲区,三项合并
free_table[k].length=free_table[k].length+free_table[j].length+L;
free_table[j].flag=0;
}else if(k==-1&&j!=-1){//无上邻空闲区,有下邻空闲区,与下邻合并
free_table[j].address=S;
free_table[j].length=free_table[j].length+L;
}else if(k==-1&&j==-1){//上下邻非空闲区,回收区直接填入{
t=0;
while(free_table[t].flag==1&&t<m)
t++;
if(t>=m){
cout<<"主存空闲表没有空间,回收失败!"<<endl;
return;
}
free_table[t].address=S;
free_table[t].length=L;
free_table[t].flag=1;
}
}
int main(){
char job;//用单个字符表示作业名称
free_table[0].address=100;//已第一块空闲分区为例
free_table[0].length=500;
free_table[0].flag=1;
int i;
for(i=1;i<m;i++){
free_table[i].flag=0;
}
for(i=0;i<n;i++)
used_table[i].flag=0;
float len;//作业需分配内存长度
int a;
while(1){
printf("Menu:0-exit;1-allocation;2-reclaim;3-list\n");
printf("Please choose(0-3):");
scanf("%d",&a);
cin.ignore();
switch(a){
case 0:return 0;
case 1:{
printf("please enter the job and the memory length you want:");
scanf("%c%f",&job,&len);
allocate(job,len);
break;
}
case 2:{
printf("please enter the job you want to reclaim memory:");
cin>>job;
reclaim(job);
break;
}
case 3:{
printf("The free_table:\n address length flag\n");
for(i=0;i<m;i++)
cout<<free_table[i].address<<" "<<free_table[i].length<<" "<<free_table[i].flag<<endl;
printf("The used_table:\n address length flag\n");
for(i=0;i<n;i++)
cout<<used_table[i].address<<" "<<used_table[i].length<<" "<<used_table[i].flag<<endl;
}
default:{
printf("No this choose!\n");
break;
}
}
}
return 0;
}
运行截图:
初始:
尝试分配:
尝试回收:
退出:
可参考:https://wenku.baidu.com/view/d5aae0f5ba0d4a7302763a42.html