操作系统模拟

c++模拟实现系统动态分区

前言

学校的实验内容,拿来写一篇文,希望有同样或类似内容需求的同学可以借鉴。

分析

用C语言实现首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲区说明表; 在进行内存分配时,系统优先使用空闲区低端的空间。

/*动态分区的分配与回收演示程序*/
#include "stdio.h"
#define N 5
/*定义一个空闲区说明表结构,并初始化变量*/
struct freearea			
   { 
    int startaddress;/*空闲区始址*/
    int size;/*空闲区大小*/
    int state;/*空闲区状态:0为空表目,1为可用空闲块*/
}freeblock[N]={{20,20,1},{80,50,1},{150,100,1},{300,30,0},{600,100,1}};
/*定义为作业分配主存空间的函数alloc()*/
int alloc(int applyarea)		/*applyarea为作业申请量*/
   {
    int i,tag=0;			/*tag为检查是否有满足作业需要的空闲区的标志*/
    for(i=0;i<N;i++)		/*检查空闲区说明表是否有满足作业要求的空闲区*/
   	if(freeblock[i].state==1&&freeblock[i].size>applyarea)
   		{
   		 freeblock[i].startaddress=freeblock[i].startaddress+applyarea;
   		 freeblock[i].size=freeblock[i].size-applyarea;
   		 tag=1;		/*有满足条件的空闲区时,tag置1*/
   		 return freeblock[i].startaddress-applyarea;	
   		}
   	else
   	if(freeblock[i].state==1&&freeblock[i].size==applyarea)
   		{
   		 freeblock[i].state=0;
   		 tag=1;		/*有满足条件的空闲区时,tag置1*/
   		 return freeblock[i].startaddress;	/*返回为作业分配的主存地址*/
   		}
   	if(tag==0)
   		return -1;		/*没有满足条件的空闲区,分配不成功,返回-1*/
   }
/*定义主存回收函数:setfree()
tag1代表释放区的高地址是否邻接一个空闲区,
tag2代表释放区的高低地址是否都邻接一个空闲区,
tag3代表释放区的低地址是否邻接一个空闲区*/
void setfree()
   {
    int s,l,tag1=0,tag2=0,tag3=0,i,j;
    printf("input free area startaddress:\n");
    scanf("%d",&s);		/*输入释放区的开始地址*/
    printf("input free area size:\n");
    scanf("%d",&l);		/*输入释放区的大小*/
    
    for(i=0;i<N;i++)
   	{
   	 if(freeblock[i].startaddress==s+l&&freeblock[i].state==1)
   		{
   		 l=l+freeblock[i].size;
   		 tag1=1;		/*有与释放区高地址邻接的空闲区,tag1置1*/
   		 for(j=0;j<N;j++)
   			 if(freeblock[j].startaddress+freeblock[j].size==s&&freeblock[j].state==1)
   				{
   				 freeblock[i].state=0;
   				 freeblock[j].size=freeblock[j].size+l;
   				 tag2=1;/*有与释放区上下都邻接的空闲区,tag2置1*/
   				 break;
   				}
   		if(tag2==0)	/*无与释放区高低地址邻接的空闲区*/
   		{
   			freeblock[i].startaddress=s;
   			freeblock[i].size=l;
   			break;
   		}
   		}
   	}
    
    if(tag1==0)	/*无与释放区高地址邻接的空闲区,并检查是否低地址有邻接空闲区*/
   	{
   	 for(i=0;i<N;i++)
   		if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1)
   			{
   			freeblock[i].size=freeblock[i].size+l;
   			tag3=1;	/*有与释放区低地址邻接的空闲区*/
   			break;
   			}
   	 if(tag3==0)		/*无与释放区低地址邻接的空闲区*/
   		 for(j=0;j<N;j++)
   			 if(freeblock[j].state==0)/*找一个空表目,将释放区放入表中*/
   				{
   				 freeblock[j].startaddress=s;
   				 freeblock[j].size=l;
   				 freeblock[j].state=1;
   				 break;
   				}
   	}
   }
/*定义对空闲区表中的空闲区调整的函数adjust(),
使空闲区按始地址从小到排列,空表目放在最后面*/
void adjust()
   {
    int i,j;
    struct freearea middata;
    for(i=0;i<N;i++)		/*将空闲区按始地址顺序在表中排列*/
   	 for(j=0;j<N;j++)
   		 if(freeblock[j].startaddress>freeblock[j+1].startaddress)
   			{
   			 middata.startaddress=freeblock[j].startaddress;
   			 middata.size=freeblock[j].size;
   			 middata.state=freeblock[j].state;
   			 freeblock[j].startaddress=freeblock[j+1].startaddress;
   			 freeblock[j].size=freeblock[j+1].size;
   			 freeblock[j].state=freeblock[j+1].state;
   			 freeblock[j+1].startaddress=middata.startaddress;
   			 freeblock[j+1].size=middata.size;
   			 freeblock[j+1].state=middata.state;
   			}
   	for(i=0;i<N;i++)	/*将空表目放在表后面*/
   		for(j=0;j<N;j++)
   			if(freeblock[j].state==0&&freeblock[j+1].state==1)
   				{
   				 middata.startaddress=freeblock[j].startaddress;
   				 middata.size=freeblock[j].size;
   				 middata.state=freeblock[j].state;
   				 freeblock[j].startaddress=freeblock[j+1].startaddress;
   				 freeblock[j].size=freeblock[j+1].size;
   				 freeblock[j].state=freeblock[j+1].state;
   				 freeblock[j+1].startaddress=middata.startaddress;
   				 freeblock[j+1].size=middata.size;
   				 freeblock[j+1].state=middata.state;
   				}
   }
/*定义打印空闲区说明表函数:print()*/
void print()
   {
    int i;
    printf("		|---------------------------------------------------------------|\n");
    printf("		|        start        size        state        |\n");
    printf("		|---------------------------------------------------------------|\n");
    for(i=0;i<N;i++)
   	{
   	printf("		|         %3d         %3d         %3d          |\n",
   		 freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
   	printf("		|---------------------------------------------------------------|\n");
   	}
   }
/*主函数*/
int main()	
   {
    int applyarea,start,i,j;
    char end;
    printf("\n is there any job request memory? y or n:");
    while((end=getchar())=='y')
   	{
   	 printf("at first the free memory is this:\n");
   	 adjust();			/*对空闲区表中的空闲区调整的函数*/
   	 print();			/*打印空闲区表的初始状态*/
   	 printf("input request memory size:");
   	 scanf("%d",&applyarea);/*输入作业的申请量*/
   	 start=alloc(applyarea);/*调用alloc()函数为作业分配空间,start为返回的始地址*/
   	 adjust();
   	 printf("after allocation,the free memory is this:\n");
   	 print();			/*打印空闲区表*/
   	 if(start==-1)		/*alloc()分配不成功时,返回-1*/
   		 printf("there is no fit memory,please wait\n");
   	 else
   		 printf("job's memory start address is:%d\n",start);
   		 printf("job size is:%d\n",applyarea);
   		 printf("job is running.\n");
   		 printf("job is terminated.\n");
   		 for(j=1;j<100000;j++);/*延迟时间*/
   		 setfree();	/*主存回收函数*/
   		 adjust();		/*调整空闲区说明表*/
   		 print();		/*打印空闲区表函数*/
   		 printf("is there any job that is waiting? y/n:");
   		 end=getchar();/*是否有作业等待?有(Y)无(N)*/
   	}
   	return 0;
   }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值