📄 mainmemalloc.c
字号:
/*
程序功能:模拟主存空间的分配与回收
其中空闲表为单链表,没有长度限制
*/
#include <stdio.h>
#include <malloc.h>
#include <process.h>
#include <string.h>
#define minisize 1
typedef struct freeTable
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
struct freeTable *next;
}freeTabNode; /*空闲区表结点*/
freeTabNode *freeTab;
void InitFreeTab()
{
freeTabNode *f,*temp;
f=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(f->proID,"OS");
f->startAddr=0;
f->length=5;f->flag=0;
freeTab=f;
f=(freeTabNode *)malloc(sizeof(freeTabNode));;
strcpy(f->proID,"1");
f->startAddr=5;
f->length=5;f->flag=0;
freeTab->next=f;
temp=f;
f=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(f->proID,"3");
f->startAddr=10;
f->length=4;temp->flag=0;
temp->next=f;
temp=temp->next;
f=(freeTabNode *)malloc(sizeof(freeTabNode));
f->startAddr=14;
f->length=12;
f->flag=1;
temp->next=f;temp=temp->next;
f=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(f->proID,"2");
f->startAddr=26;
f->length=6;f->flag=0;
temp->next=f;temp=temp->next;
f=(freeTabNode *)malloc(sizeof(freeTabNode));
f->startAddr=32;
f->length=96;
f->flag=1;
f->next=NULL;
temp->next=f;
}
void allocate(char PName[],int PLength)
{
freeTabNode *f,*temp;
f=freeTab;
while(f) /*寻找空间大于PLength的最小空闲区登记项k*/
{
if(f->length>=PLength&&f->flag==1) break;
f=f->next;
}
if(!f)/*未找到可用空闲区,返回*/
{
printf("无可用空闲区\n");
return;
}
/*找到可用空闲区,开始分配*/
if(f->length-PLength<=minisize)
{ /*空闲区大小与要求分配的空间差小于minisize大小,空闲区全部分配*/
strcpy(f->proID,PName);
f->flag=0; /*修改成空表目状态*/
}
else
{ /*若空闲区大小与要求分配的空间差大于minisize大小,从中划出一部分分配*/
f->length=f->length-PLength;
temp=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(temp->proID,PName);
temp->startAddr=f->startAddr+f->length;
temp->length=PLength;
temp->flag=0;
temp->next=NULL;
temp->next=f->next;
f->next=temp;
}
return;
}/*主存分配函数结束*/
void reclaim(char PName[]){
/*回收作业名为PName的作业所占主存空间*/
freeTabNode *front,*rear,*temp;
temp=freeTab; /*寻找空闲表中对应登记项*/
if(strcmp(PName,"OS")==0)
{ printf("ERROR!");
return;
}
while((strcmp(temp->proID,PName)!=0||temp->flag==1)&&temp)
temp=temp->next;
if(!temp)/*在已分配表中找不到名字为PName的作业*/
{
printf("找不到该作业\n");
return;
}
/*寻找回收分区的空闲上下邻,上邻表目front,下邻表目rear*/
rear=temp->next;
front=freeTab;
while(front)
{ if(front->next==temp) break;
front=front->next;
}/*找到回收分区的上邻表目*/
if(rear==NULL)
{
if(front->flag==1) {
front->length+=temp->length;
front->next=NULL;
free(temp);
}
else temp->flag=1;
}
else
{
if(front->flag==1&&rear->flag==1)
/* 上邻空闲区,下邻空闲区,三项合并*/
{
front->length=front->length+rear->length+temp->length;
front->next=rear->next;
free(temp);
free(rear);
}
else if(front->flag==1&&rear->flag==0){
/*上邻空闲区,下邻非空闲区,与上邻合并*/
front->length+=temp->length;
front->next=rear;
free(temp);
}
else if(front->flag==0&&rear->flag==1)
/*上邻非空闲区,下邻为空闲区,与下邻合并*/
{
temp->length+=rear->length;
temp->next=rear->next;
free(rear);
temp->flag=1;
}
else
/*上下邻均为非空闲区,回收区域直接作修改*/
temp->flag=1;
}
}
main( )
{
int a;
freeTabNode *freeNode;
char PName[6];
int PLength;
InitFreeTab(); /*空闲分区表初始化:*/
while(1)
{
printf("**选择功能项**\n");
printf("\t0--退出\n\t1--分配主存\n\t2--回收主存\n\t3--显示主存\n");
printf("选择项(0~3) :");
scanf("%d",&a);
switch(a)
{
case 0: exit(0); /*a=0程序结束*/
case 1: /*a=1分配主存空间*/
printf("要分配的作业名PName:");
scanf("%s",PName);
printf("\n和作业所需内存大小PLength(>1K): ");
scanf("%d",&PLength);
allocate(PName,PLength);/*分配主存空间*/
break;
case 2: /*a=2回收主存空间*/
printf("输入要回收分区的作业名:");
scanf("%s",PName);
reclaim(PName);/*回收主存空间*/
break;
case 3: /*a=3显示主存情况*/
printf("--------------------------------------\n");
printf("内存分区表:\n");
printf("\t\t进程标识 起始地址 分区长度\t状态\n");
freeNode=freeTab; /*打印空闲区表*/
while(freeNode)
{
if(freeNode->flag==1)
printf("\t\t空\t%5d\t%6d\t\t空闲\n",freeNode->startAddr,freeNode->length);
else
printf("\t\t%s\t%5d\t%6d\t\t空表目\n",freeNode->proID,freeNode->startAddr,freeNode->length);
freeNode=freeNode->next;
}
getchar();
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
}/*main()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -