模拟主存储器空间的分配和回收-最佳适应算法

源代码:

#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

 

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值