实验报告二主存空间的分配和回收
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
temp=freeTab; /*寻找空闲表中对应登记项*/
if(strcmp(PName,"OS")==0)
{ printf("ERROR!");
return;
}
while((strcmp(temp->proID,PName)!=0||temp->flag==1)&&temp)
temp=temp->next;
四、程序中使用的数据结构及符号说明
结构1:
typedef struct freeTable
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
freeNode=freeNode->next;
}
getchar();
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
}/*main()*/
六、运行调试结果
初始界面:
分配主存,五个作业名:P1、P2、P3、P4、P5
显示主存使用情况:
回收主存P2:
if(front->flag==1&&rear->flag==1)
/* 上邻空闲区,下邻空闲区,三项合并*/
{
front->length=front->length+rear->length+temp->length;
front->next=rear->next;
free(temp);
free(rear);
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);
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;
if(!temp)/*在已分配表中找不到名字为PName的作业*/
{
printf("找不到该作业\n");
return;
}
/*寻找回收分区的空闲上下邻,上邻表目front,下邻表目rear*/
rear=temp->next;
front=freeTab;
while(front)
{ if(front->next==temp) break;
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
struct freeTable *next;
}freeTabNode; /*空闲区表结点*/
scanf("%d",&PLength);
allocate(PName,PLength);/*分配主存空间*/
break;
case 2: /*a=2回收主存空间*/
printf("输入要回收分区的作业名:");
scanf("%s",PName);
reclaim(PName);/*回收主存空间*/
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
{
五、源程序
/*
程序功能:模拟主存空间的分配与回收
其中空闲表为单链表,没有长度限制
*/
#include <stdio.h>
#include <malloc.h>
#include <process.h>
#include <string.h>
#define minisize 1
typedef struct freeTable
freeTabNode *freeNode;
char PName[6];
int PLength;
InitFreeTab(); /*空闲分区表初始化:*/
while(1)
{
printf("**选择功能项**\n");
printf("\t0--退出\n\t1--分配主存\n\t2--回收主存\n\t3--显示主存\n");
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)
temp->flag=0;
temp->next=NULL;
temp->next=f->next;
f->next=temp;
}
return;
}/*主存分配函数结束*/
void reclaim(char PName[]){
/*回收作业名为PName的作业所占主存空间*/
freeTabNode *front,*rear,*temp;
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));
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): ");
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;
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=f->length-PLength;
temp=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(temp->proID,PName);
temp->startAddr=f->startAddr+f->length;
temp->length=PLength;
《操作系统原理》实验报告
实验序号:2实验项目名称:主存空间的分配和回收
学 号
姓 名
专业、班
实验地点
指导教师
时间
2010.11.15
一、实验目的
通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。
二、实验设备(环境)及要求
微机、C++
三、实验题目
在可变分区管理方式下采用首次适应算法实现主存分配和回收。
case 3: /*a=3显示主存情况*/
printf("--------------------------------------\n");
printf("内存分区表:\n");
printf("\t\t进程标识 起始地址 分区长度\t状态\n");
freeNode=freeTab; /*打印空闲区表*/
return;
}
/*找到可用空闲区,开始分配*/
if(f->length-PLength<=minisize)
{ /*空闲区大小与要求分配的空间差小于minisize大小,空闲区全部分配*/
strcpy(f->proID,PName);
f->flag=0; /*修改成空表目状态*/
}
else
{ /*若空闲区大小与要求分配的空间差大于minisize大小,从中划出一部分分配*/
}
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)
回收P5:
结束
七、实验心得和收获
1、函数功能要具体,每个函数完成的功能清晰高效
2、编程要有自己的风格
3、界面要整洁
七、教师评语
1.按时完成实验;
2.数据结构及符号说明完整明了;
3.有源程序清单;
4.运行调试结果有代表性;
5.实验报告的撰认真、格式符合要求.
签名:金晶
日期:
成绩
struct freeTable *next;
}freeTabNode; /*空闲区表结点*/
程序中定义了三个函数:
allocate(char PName[],int PLength)分配主存空间
InitFreeTab()显示主存使用情况
reclaim(char PName[]),回收作业名为PName的作业所占主存空间
/*上邻非空闲区,下邻为空闲区,与下邻合并*/
{
temp->length+=rear->length;
temp->next=rear->next;
free(rear);
temp->flag=1;
}
else
/*上下邻均为非空闲区,回收区域直接作修改*/
temp->flag=1;
}
}
main( )
{
int a;
{
freeTabNode *f,*temp;
f=freeTab;
while(f) /*寻找空间大于PLength的最小空闲区登记项k*/
{
if(f->length>=PLength&&f->flag==1) break;
f=f->next;
}
if(!f)/*未找到可用空闲区,返回*/
{
printf("无可用空闲区\n");
if(strcmp(PName,"OS")==0)
{ printf("ERROR!");
return;
}
while((strcmp(temp->proID,PName)!=0||temp->flag==1)&&temp)
temp=temp->next;
四、程序中使用的数据结构及符号说明
结构1:
typedef struct freeTable
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
freeNode=freeNode->next;
}
getchar();
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
}/*main()*/
六、运行调试结果
初始界面:
分配主存,五个作业名:P1、P2、P3、P4、P5
显示主存使用情况:
回收主存P2:
if(front->flag==1&&rear->flag==1)
/* 上邻空闲区,下邻空闲区,三项合并*/
{
front->length=front->length+rear->length+temp->length;
front->next=rear->next;
free(temp);
free(rear);
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);
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;
if(!temp)/*在已分配表中找不到名字为PName的作业*/
{
printf("找不到该作业\n");
return;
}
/*寻找回收分区的空闲上下邻,上邻表目front,下邻表目rear*/
rear=temp->next;
front=freeTab;
while(front)
{ if(front->next==temp) break;
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
struct freeTable *next;
}freeTabNode; /*空闲区表结点*/
scanf("%d",&PLength);
allocate(PName,PLength);/*分配主存空间*/
break;
case 2: /*a=2回收主存空间*/
printf("输入要回收分区的作业名:");
scanf("%s",PName);
reclaim(PName);/*回收主存空间*/
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
{
五、源程序
/*
程序功能:模拟主存空间的分配与回收
其中空闲表为单链表,没有长度限制
*/
#include <stdio.h>
#include <malloc.h>
#include <process.h>
#include <string.h>
#define minisize 1
typedef struct freeTable
freeTabNode *freeNode;
char PName[6];
int PLength;
InitFreeTab(); /*空闲分区表初始化:*/
while(1)
{
printf("**选择功能项**\n");
printf("\t0--退出\n\t1--分配主存\n\t2--回收主存\n\t3--显示主存\n");
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)
temp->flag=0;
temp->next=NULL;
temp->next=f->next;
f->next=temp;
}
return;
}/*主存分配函数结束*/
void reclaim(char PName[]){
/*回收作业名为PName的作业所占主存空间*/
freeTabNode *front,*rear,*temp;
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));
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): ");
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;
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=f->length-PLength;
temp=(freeTabNode *)malloc(sizeof(freeTabNode));
strcpy(temp->proID,PName);
temp->startAddr=f->startAddr+f->length;
temp->length=PLength;
《操作系统原理》实验报告
实验序号:2实验项目名称:主存空间的分配和回收
学 号
姓 名
专业、班
实验地点
指导教师
时间
2010.11.15
一、实验目的
通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。
二、实验设备(环境)及要求
微机、C++
三、实验题目
在可变分区管理方式下采用首次适应算法实现主存分配和回收。
case 3: /*a=3显示主存情况*/
printf("--------------------------------------\n");
printf("内存分区表:\n");
printf("\t\t进程标识 起始地址 分区长度\t状态\n");
freeNode=freeTab; /*打印空闲区表*/
return;
}
/*找到可用空闲区,开始分配*/
if(f->length-PLength<=minisize)
{ /*空闲区大小与要求分配的空间差小于minisize大小,空闲区全部分配*/
strcpy(f->proID,PName);
f->flag=0; /*修改成空表目状态*/
}
else
{ /*若空闲区大小与要求分配的空间差大于minisize大小,从中划出一部分分配*/
}
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)
回收P5:
结束
七、实验心得和收获
1、函数功能要具体,每个函数完成的功能清晰高效
2、编程要有自己的风格
3、界面要整洁
七、教师评语
1.按时完成实验;
2.数据结构及符号说明完整明了;
3.有源程序清单;
4.运行调试结果有代表性;
5.实验报告的撰认真、格式符合要求.
签名:金晶
日期:
成绩
struct freeTable *next;
}freeTabNode; /*空闲区表结点*/
程序中定义了三个函数:
allocate(char PName[],int PLength)分配主存空间
InitFreeTab()显示主存使用情况
reclaim(char PName[]),回收作业名为PName的作业所占主存空间
/*上邻非空闲区,下邻为空闲区,与下邻合并*/
{
temp->length+=rear->length;
temp->next=rear->next;
free(rear);
temp->flag=1;
}
else
/*上下邻均为非空闲区,回收区域直接作修改*/
temp->flag=1;
}
}
main( )
{
int a;
{
freeTabNode *f,*temp;
f=freeTab;
while(f) /*寻找空间大于PLength的最小空闲区登记项k*/
{
if(f->length>=PLength&&f->flag==1) break;
f=f->next;
}
if(!f)/*未找到可用空闲区,返回*/
{
printf("无可用空闲区\n");