存储管理实验报告
题目:1。存储管理
描述请求分页存储管理。
一. 产 生 一 个 作 业 及 作 业 页 面 序 列 P(pi) , 例 如 :
P(0,2,3,4,1,5,2,3,0,4,1,5)。
二. 分配物理内存块数 M。
三. 采用 FIFO,LRU 置换算法。
四. 设计原理:本程序提供两种分区管理法供用户使用,这两种算
法是最佳适应算法和首次适应算法。
最佳适应算法要求将所有的空闲区,按其大小以递增的顺序
形成一空闲区链。这样,第一次找到的满足要求的空闲区,必然
是最优的。但该算法会留下许多这样难以利用的小空闲区。
首次适应算法要求空闲分区链以地址递增的次序链接。在进
行内存分配时,从链首开始顺序查找,直至找到一个能满足其大
小要求的空闲分区为止。然后,再按照作业的大小,从该分区中
划出一快内存空间分配该请求者,余下的空闲分区仍留在空闲链
中。
三.不足之处:
该程序可以用文件形式输入作业的信息,但是该文件没有绑
定在程序中。不过,用户用键盘输入的作业的信息会自动保存到
该文件中,下次当以文件形式输入作业信息时,文件中的内容是
上一次用户用键盘输入的内容。
四.源程序以及解释:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int memoryStartAddress = -1;
int memorySize = -1;
struct jobList
//作业后备队列的链结点
{
int id; //作业的 ID 号
int size; //作业的大小
int status; //作业状态
struct jobList *next;
};
struct freeList //空闲链的链结点
{
int startAddress; //空闲分区的首地址
int size; //空闲分区的大小
struct freeList *next;
};
struct usedList //已分配内存的作业链
{
int startAddress; //以分配内存的首地址
int jobID;
struct usedList *next;
};
void errorMessage(void) //出错信息
{
printf("\n\t 错误!\a");
printf("\n 按任意键继续!");
getch();
exit(1);
}
void openFile(FILE **fp,char *filename,char *mode) //打开文件函数
{
if((*fp = fopen(filename,mode)) == NULL)
{
printf("\n 不能打开 %s.",filename);
errorMessage();
}
}
void makeFreeNode(struct freeList **empty,int startAddress,int size)//申请内存空间
{
if((*empty = malloc(sizeof(struct freeList))) == NULL)
{
printf("\n 没有足够空间.");
errorMessage();
}
(*empty)->startAddress = startAddress; //当有足够空间时,则分配
(*empty)->size = size;
(*empty)->next = NULL;
}
void iniMemory(void) //输入要求分配内存的首地址,大小
{
char MSA[10],MS[10];
printf("\n 请输入要分配内存的首地址 !");
scanf("%s",MSA);
memoryStartAddress = atoi(MSA);
printf("\n 请输入要分配内存的大小!");
scanf("%s",MS);
memorySize = atoi(MS);
}
char selectFitMethod(void) //选择分区管理算法
{
FILE *fp;
char fitMethod;
do{
printf("\n\n 请选择分区管理的算法!\
\n 1 最佳适应算法 \
\n 2 首次适应算法\n");
fitMethod = getche();
}while(fitMethod < '1' || fitMethod > '3'); //选择出错时
openFile(&fp,"d:\\result.cl","a");
switch(fitMethod)
{
case '1':
fprintf(fp,"\n\n\n\n\t 最佳适应算法");
fprintf(fp,"\n**********************************************");
break;
case '2':
fprintf(fp,"\n\n\n\n\t 首次适应算法");
fprintf(fp,"\n**********************************************");
break;
}
fclose(fp);
return fitMethod;
}
void inputJob(void) //输入作业的信息
{
int /*id,size, */status = 0,jobnum = 0;
FILE *fp;
char id[10],size[10];
openFile(&fp,"d:\\job.cl","w");
fprintf(fp,"作业名\t 大小\t 状态");
printf("\n\n\n\n 请输入作业名和大小!
\n 输入 0 0 退出 ,job_ID 由数字组成\n\n\njob_ID\tsize\n");
do{
/* scanf("%d%d",&id,&size); */
scanf("%s\t%s",id,size); //保存作业 ID,大小
if(atoi(id) > 0 && atoi(size) > 0)
{
fprintf(fp,"\n%s\t%s\t%d",id,size,status);
/* fprintf(fp,"\n%d\t%d\t%d",id,size,status); */
jobnum++;
}
else break;
}while(1);
if(jobnum)
printf("\n 完成输入!");
else
{
printf("\n 没有请求分配内存.");
errorMessage();
}
fclose(fp);
}
int makeJobList(struct jobList **jobs) //把作业插入分区
{
char jobID[10],size[10],status[10];
struct jobList *rear;
FILE *fp;
openFile(&fp,"d:\\job.cl","r");
fscanf(fp,"%s%s%s",jobID,size,status);
if((*jobs = malloc(sizeof(struct jobList))) == NULL) //当没有空闲分区时
{
printf("\n 没有足够空间 .");
fclose(fp);
errorMessage();
}
rear = *jobs;
(*jobs) -> next = NULL;
while(!feof(fp))
{
struct jobList *p;
fscanf(fp,"%s%s%s",jobID,size,status);
if((p = malloc(sizeof(struct jobList))) == NULL)
{
printf("\n 没有足够空间.");
fclose(fp);
errorMessage();
}
p -> next = rear -> next; //插入已在分区的作业队列中
rear -> next = p;
rear = rear -> next;
rear -> id = atoi(jobID);
rear -> size = atoi(size);
rear -> status = atoi(status);
}
fclose(fp);
return 0;
}
int updateJobFile(struct jobList *jobs)
{
FILE *fp;
struct jobList *p;
openFile(&fp,"d:\\job.cl","w");
fprintf(fp,"job_ID\tsize\tstatus");
for(p = jobs -> next;p;p = p -> next)
fprintf(fp,"\n%d\t%d\t%d",p -> id,p -> size,p -> status);
fclose(fp);
return 0;
}
int showFreeList(struct freeList *empty) //在屏幕上显示空闲分区
{
FILE *fp;
struct freeList *p = empty -> next;
int count = 0;
openFile(&fp,"d:\\result.cl","a");
fprintf(fp,"\n\n 显示空闲内存");
printf("\n\n 显示空闲内存");
if(p)
{