1、操作系统原理实验报告实验序号:2实验项目名称:主存空间的分配和回收学号姓名专业、班实验地点指导教师时间2010.11.15一、实验目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。二、实验设备(环境)及要求微机、C+三、实验题目在可变分区管理方式下采用首次适应算法实现主存分配和回收。四、程序中使用的数据结构及符号说明结构1:typedef struct freeTable char proID6; int startAddr; /*空闲区起始地址*/ int length; /*空闲区长度,单位为字节*/ int flag; /*空闲区表登记栏标志,用0表示空表项,用
2、1表示未分配*/ struct freeTable *next; freeTabNode; /*空闲区表结点*/ 程序中定义了三个函数:allocate(char PName,int PLength)分配主存空间InitFreeTab()显示主存使用情况reclaim(char PName),回收作业名为PName的作业所占主存空间五、源程序/* 程序功能:模拟主存空间的分配与回收 其中空闲表为单链表,没有长度限制*/#include #include #include #include #define minisize 1typedef struct freeTable char proID
3、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-fl
4、ag=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(sizeo
5、f(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;
6、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-PLengthproID,PName); f-flag=0; /*修改成空表目状态*/ else /*若空闲区大小与要
7、求分配的空间差大于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)/*回收作业
8、名为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;fro
9、nt=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-nex
10、t=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 /*上下邻均为非空闲区,回收区域直接作修
11、改*/ temp-flag=1;main( )int a;freeTabNode *freeNode;char PName6;int PLength;InitFreeTab(); /*空闲分区表初始化:*/while(1)printf(*选择功能项*n);printf(t0-退出nt1-分配主存nt2-回收主存nt3-显示主存n);printf(选择项(03) :);scanf(%d,&a);switch(a)case 0: exit(0); /*a=0程序结束*/case 1: /*a=1分配主存空间*/ printf(要分配的作业名PName:);scanf(%s,PName);print
12、f(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(tt进程标识 起始地址 分区长度t状态n); freeNode=freeTab; /*打印空闲区表*/while(free
13、Node) if(freeNode-flag=1) printf(tt空t%5dt%6dtt空闲n,freeNode-startAddr,freeNode-length); else printf(tt%st%5dt%6dtt空表目n,freeNode-proID,freeNode-startAddr,freeNode-length);freeNode=freeNode-next; getchar();break;default:printf(没有该选项n);/*case*/*while*/*main()*/六、运行调试结果初始界面:分配主存,五个作业名:P1、P2、P3、P4、P5显示主存使用情况:回收主存P2:回收P5:结束七、实验心得和收获1、函数功能要具体,每个函数完成的功能清晰高效2、编程要有自己的风格3、界面要整洁七、教师评语1按时完成实验;2数据结构及符号说明完整明了;3有源程序清单;4运行调试结果有代表性;5实验报告的撰写认真、格式符合要求.签名:金晶日期:成绩