采用可变式分区管理,使用首次适应算法实现主存分配与回收

采用可变式分区管理,使用首次适应算法实现主存分配与回收

#include<stdio.h>
#include<string.h>

struct PCB{
	int InitAdd;
	int EndAdd;
	int Length;
	int Release;
	char name[5];
	char state[5];
};

int N=6;//初始结构体个数 

//初始化空闲区和已分配区 
void Init(PCB *p){
	FILE *r=fopen("3-1.txt","r");
	printf("起始地址  长度  中止地址    name         状态\n");
	for(int i=0;i<6;i++){
	    fscanf(r,"%d%d%d%s%s\n",&p[i].InitAdd,&p[i].Length,&p[i].EndAdd,p[i].name,p[i].state);
	    printf("%6d%6d%6d%14s%14s\n",p[i].InitAdd,p[i].Length,p[i].EndAdd,p[i].name,p[i].state);
	}
	fclose(r);
}

//作业装入主存 
void insert(PCB *p,int i,int temp){
	if(p[i].Length==temp){
		p[i].Length=temp;
	    p[i].EndAdd=p[i].InitAdd+p[i].Length;
	    strcpy(p[i].name,"作业");
	    strcpy(p[i].state,"已分配");
	}
	else{
		for(int j=N;j>=i;j--)
	    p[j+1]=p[j];
	    p[i].Length=temp;
	    p[i].EndAdd=p[i].InitAdd+p[i].Length;
	    strcpy(p[i].name,"作业");
	    strcpy(p[i].state,"已分配");
	    p[i+1].InitAdd=p[i].EndAdd;
	    p[i+1].Length=p[i+1].EndAdd-p[i+1].InitAdd;
	    N++;
	}
}

//输出作业分匹配后的空闲区 
void print(PCB *p,int k){
	if(k==1)
	printf("作业分配成功\n");
	else if(k==0) 
	printf("作业等待\n");
	else if(k==2)
	printf("作业释放成功\n");
	printf("起始地址  长度   结束地址  name    状态\n");
	for(int i=0;i<N;i++)
	printf("%5d%8d%8d%10s%9s\n",p[i].InitAdd,p[i].Length,p[i].EndAdd,p[i].name,p[i].state);
}

//作业和主存空闲区比较 
void add(PCB *p,int temp){
	int k=0;
	for(int i=0;i<N;i++){
		if(strcmp(p[i].name,"空闲")==0&&p[i].Length>=temp){
				insert(p,i,temp);
				k=1;
				break;
			}
	}
	print(p,k);
} 

void mix(PCB *p,int i){
	if(strcmp(p[i-1].name,"空闲")==0){
		p[i-1].Length=p[i-1].Length+p[i].Length;
		p[i-1].EndAdd=p[i].EndAdd;
		for(int j=i;j<N-1;j++)
		p[j]=p[j+1];
		N--;
	}
	else if(strcmp(p[i+1].name,"空闲")==0){
		p[i].Length=p[i].Length+p[i+1].Length;
		p[i].EndAdd=p[i+1].EndAdd;
		for(int j=i+1;j<N-1;j++)
		p[j]=p[j+1];
		N--;
	}
	for(int i=0;i<N-1;i++){
		if(strcmp(p[i].name,"空闲")==0&&strcmp(p[i].name,p[i+1].name)==0){
			p[i].Length=p[i].Length+p[i+1].Length;
		    p[i].EndAdd=p[i+1].EndAdd;
		    for(int j=i+1;j<N-1;j++)
		    p[j]=p[j+1];
		    N--;	
		}
	}
}

//作业释放 
void free(PCB *p,int sum){
	int temp=1;
	while(temp<=sum)
	for(int i=0;i<N;i++){
		if(p[i].Release==temp){
	        strcpy(p[i].name,"空闲");
	        strcpy(p[i].state,"未分配");
	        mix(p,i);
	        print(p,2);
	        temp++;
		}
	} 	
}

//作业申请
void input(PCB *p){
	int n;
	int temp;
	int sum=0; 
	printf("输入申请作业内容个数:\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++){ 
	    printf("长度:");
	    scanf("%d",&temp);
	    add(p,temp);
	}
	
//作业释放顺序	
		for(int i=0;i<N;i++){
		if(strcmp(p[i].name,"作业")==0)
		sum++;
	}
	printf("作业个数为:%d\n",sum);
	printf("输入作业的释放顺序\n");
	for(int i=0;i<N;i++){
		if(strcmp(p[i].name,"作业")==0){
		    printf("p[%d]:",i);
		    scanf("%d",&temp);
		    p[i].Release=temp; 
	   }
	    else
	    p[i].Release=0;    
    }
    free(p,sum); 
}

//主函数 
int main(){
	PCB p[10];
	Init(p);
	input(p); 
}

当中初始化中读入文件内容如下:
在这里插入图片描述
结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 14
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值