/*
实验四-内存管理之固定分区分配
算法思想:
预先将内存空间划分成若干个空闲分区,
分配过程根据用户需求将某一个满足条件的分区直接分配
(不进行分割),作业完成后回收对应内存。
整个分配过程分区大小和个数不发生变化。
*/
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#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;
typedef struct node SIF;
void InitMemory();//初始化固定内存的设置
void showinfo();//打印分配的情况
void recover();//作业完成后回收资源
void allocation();//给作业分配空间
int allocate(int size);//分配内存,返回0代表分配成功
int main()
{
int command;
InitMemory();//初始化内存说明表
printf("
请输入命令,给作业分配资源输入1,释放资源输入2,退出请输入任意键:
");
scanf("%d",&command);
while(1){
if(command==1)
allocation();
else if(command==2)
recover();
else
break;
printf("
请继续输入命令
");
scanf("%d",&command);
}
return 0;
}
void showinfo()//打印内存分配情况
{
printf("
当前内存分配情况如下:
");
printf("
===id===size===begin_adress===status
");
p=ready;
while(p!=NULL)
{
printf("
%d %d %d %c
",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("
请输入现有内存的大小: (起始地址从0开始)
");
scanf("%d",&SIZE);
//初始化内存信息
printf("
请输入固定分区内存块的个数: ");
scanf("%d",&num);
for(i=0; i<num; i++)
{
int n;
printf("
请输入内存块%d的大小(KB):",i);
scanf("%d",&n);
for(j=0; j<n; 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';
else
p->status='F';
p->next=NULL;
d+=p->size;
if(d>=SIZE)
{
printf("
已超出系统总内存量,%d号分配失败
",p->id);
break;
}
if(ready==NULL)
{
ready=p;
last=ready;
}
else
{
last->next=p;
last=last->next;
}
}
}
showinfo();
}
void allocation()//给作业分配空间
{
int num1;
int i,s;
//给作业分配内存空间
printf("
请输入待分配内存的作业个数:");
scanf("%d",&num1);
for(i=0; i<num1; i++){
printf("
请输入第%d个作业的大小: ",i);
scanf("%d",&s);
if(allocate(s)==1){
printf("
已为该作业分配内存空间
");
printf("
存储该作业内存空间的详细信息如下:
");
printf("
内存块号:%d, 内存大小:%d
",p->id,p->size);
}
else
printf("
未能该该作业分配内存
");
}
showinfo();
}
void recover()//作业完成后回收资源
{
int i,k,num;
printf("
请输入需要释放的作业个数: ");
scanf("%d",&num);
for(i=0; i<num; i++){
printf("
请输入存储该作业的内存分区说明表的ID
");
scanf("%d",&k);
p=ready;
while(p!=NULL){
if(p->id==k){
p->status='T';
printf("
已释放该作业所占用的资源
");
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;
}