实验四 模拟操作系统内存管理 java代码及解释_操作系统实验四(内存管理之固定分区分配)...

本文介绍了一个模拟操作系统内存管理的实验,采用固定分区分配算法。通过Java代码实现内存分配、回收功能,并提供了详细的内存分配情况展示。用户可以输入作业数量和大小进行分配,完成作业后回收内存。
摘要由CSDN通过智能技术生成

/*实验四-内存管理之固定分区分配

算法思想:

预先将内存空间划分成若干个空闲分区,

分配过程根据用户需求将某一个满足条件的分区直接分配

(不进行分割),作业完成后回收对应内存。

整个分配过程分区大小和个数不发生变化。*/#include#include#include

using namespacestd;#define getpch(type) (type*)malloc(sizeof(type))

int SIZE;//内存的大小

struct node//内存分区使用说明表

{int id;//内存块的id;

int size;//内存块的大小

int begin_adress;//内存块的起始地址

char status;F-已分配,T-未分配

struct node *next;

}*p,*ready=NULL;

typedefstructnode SIF;void InitMemory();//初始化固定内存的设置

void showinfo();//打印分配的情况

void recover();//作业完成后回收资源

void allocation();//给作业分配空间

int allocate(int size);//分配内存,返回0代表分配成功

intmain()

{intcommand;

InitMemory();//初始化内存说明表

printf("\n 请输入命令,给作业分配资源输入1,释放资源输入2,退出请输入任意键:\n");

scanf("%d",&command);while(1){if(command==1)

allocation();else if(command==2)

recover();else

break;

printf("\n 请继续输入命令 \n");

scanf("%d",&command);

}return 0;

}void showinfo()//打印内存分配情况

{

printf("\n 当前内存分配情况如下:\n");

printf("\n===id===size===begin_adress===status \n");

p=ready;while(p!=NULL)

{

printf("\n %d %d %d %c\n",p->id,p->size,p->begin_adress,p->status);

p=p->next;

}

}void InitMemory()//初始化内存表

{int num,i,j,d=0,id=0;

SIF*last=ready;

printf("\n 请输入现有内存的大小: (起始地址从0开始) \n");

scanf("%d",&SIZE);//初始化内存信息

printf("\n 请输入固定分区内存块的个数:");

scanf("%d",&num);for(i=0; i

{intn;

printf("\n 请输入内存块%d的大小(KB):",i);

scanf("%d",&n);for(j=0; j

{

p=getpch(SIF);//#define getpch(type) (type*)malloc(sizeof(type))

p->id=id++;

p->size=(int)(pow(2,4+i));//size是按照2的指数递增的

p->begin_adress=d;if(p->status==NULL)//是否被分配初始化

p->status='T';elsep->status='F';

p->next=NULL;

d+=p->size;if(d>=SIZE)

{

printf("\n 已超出系统总内存量,%d号分配失败 \n",p->id);break;

}if(ready==NULL)

{

ready=p;

last=ready;

}else{

last->next=p;

last=last->next;

}

}

}

showinfo();

}void allocation()//给作业分配空间

{intnum1;inti,s;//给作业分配内存空间

printf("\n 请输入待分配内存的作业个数:");

scanf("%d",&num1);for(i=0; i

printf("\n 请输入第%d个作业的大小:",i);

scanf("%d",&s);if(allocate(s)==1){

printf("\n 已为该作业分配内存空间\n");

printf("\n 存储该作业内存空间的详细信息如下:\n");

printf("\n 内存块号:%d, 内存大小:%d \n",p->id,p->size);

}elseprintf("\n 未能该该作业分配内存 \n");

}

showinfo();

}void recover()//作业完成后回收资源

{inti,k,num;

printf("\n 请输入需要释放的作业个数:");

scanf("%d",&num);for(i=0; i

printf("\n 请输入存储该作业的内存分区说明表的ID \n");

scanf("%d",&k);

p=ready;while(p!=NULL){if(p->id==k){

p->status='T';

printf("\n 已释放该作业所占用的资源 \n");break;

}

p=p->next;

}

}

showinfo();//完成作业后回收内存空间

}int allocate(int size)//分配内存,返回0代表分配成功

{

p=ready;while(p!=NULL)

{if((p->status=='T')&&(p->size>=size))

{

p->status='F';return 1;

}

p=p->next;

}return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值