操作系统实验(共10页).doc
精选优质文档-倾情为你奉上沈 阳 工 程 学 院学 生 实 验 报 告实验室名称:计算机实验室 实验课程名称: 操作系统 实验项目名称:存储管理 (1) 实验日期: 2年 月 9 日班级: 姓名: 学号: 2 指导教师: 批阅教师: 成绩: 一实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。二实验设备PC机一台,WIN-TC软件。三实验项目编写程序实现采用可变分区方法管理内存。1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。3、在设计好的数据结构上设计一个主存分配算法。4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑。四实验代码(附页)#include<stdio.h>#include<stdlib.h>#define OK 1 /完成 #define ERROR 0 /出错typedef int Status;typedef struct free_table/定义一个空闲区说明表结构int num; /分区序号long address; /起始地址long length;/分区大小 int state; /分区状态 ElemType;typedef struct Node/线性表的双向链表存储结构ElemType data;struct Node*prior;/前趋指针struct Node *next;/后继指针Node,*LinkList;LinkList first;/头结点LinkList end;/尾结点int flag;/记录要删除的分区序号Status Initblock()/开创带头结点的内存空间链表first=(LinkList)malloc(sizeof(Node);end=(LinkList)malloc(sizeof(Node);first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->data.num=1;end->data.address=40;end->data.length=600;end->data.state=0;return OK;void sort()/分区序号重新排序Node *p=first->next,*q; q=p->next; for(;p!=NULL;p=p->next) for(q=p->next;q;q=q->next) if(p->data.num>=q->data.num) q->data.num+=1; /显示主存分配情况 void show() int flag=0;/用来记录分区序号 Node *p=first; p->data.num=0; p->data.address=0; p->data.length=40; p->data.state=1; sort(); printf("ntt主存空间分配情况n"); printf("*nn");printf("分区序号t起始地址t分区大小t分区状态nn");while(p) printf("%dtt%dtt%d",p->data.num,p->data.address,p->data.length); if(p->data.state=0) printf("tt空闲nn"); else printf("tt已分配nn"); p=p->next; printf("*nn"); /首次适应算法Status First_fit(int request) /为申请作业开辟新空间且初始化Node *p=first->next; LinkList temp=(LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) if(p->data.state=0)&&(p->data.length=request) /有大小恰好合适的空闲块 p->data.state=1; return OK; break;else if(p->data.state=0) && (p->data.length>request)/有空闲块能满足需求且有剩余temp->prior=p->prior;temp->next=p; temp->data.address=p->data.address;temp->data.num=p->data.num;p->prior->next=temp;p->prior=temp; p->data.address=temp->data.address+temp->data.length;p->data.length-=request;p->data.num+=1;return OK;break;p=p->next;return ERROR;/最佳适应算法/分配主存Status allocation(int a)int request;/申请内存大小printf("请输入申请分配的主存大小(单位:KB):");scanf("%d",&request);if(request<0 |request=0)printf("分配大小不合适,请重试!");return ERROR;switch(a)case 1:/默认首次适应算法 if(First_fit(request)=OK) printf("t*分配成功!*"); else printf("t*内存不足,分配失败!*"); return OK; break; Status deal1(Node *p)/处理回收空间Node *q=first;for(;q!=NULL;q=q->next)if(q=p)if(q->prior->data.state=0&&q->next->data.state!=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag;if(q->prior->data.state!=0&&q->next->data.state=0)q->data.length+=q->next->data.length; q->next=q->next->next; q->next->next->prior=q;q->data.state=0;q->data.num=flag;if(q->prior->data.state=0&&q->next->data.state=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag;if(q->prior->data.state!=0&&q->next->data.state!=0)q->data.state=0;return OK;Status deal2(Node *p)/处理回收空间Node *q=first;for(;q!=NULL;q=q->next)if(q=p)if(q->prior->data.state=0&&q->next->data.state!=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->data.state=0;q->data.num=flag-1; if(q->prior->data.state!=0&&q->next->data.state=0)q->data.state=0;if(q->prior->data.state=0&&q->next->data.state=0) q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;if(q->prior->data.state!=0&&q->next->data.state!=0)q->data.state=0;return OK; /主存回收Status recovery(int flag)Node *p=first;for(;p!=NULL;p=p->next)if(p->data.num=flag)if(p->prior=first)if(p->next!=end)/当前P指向的下一个不是最后一个时if(p->next->data.state=0)/与后面的空闲块相连p->data.length+=p->next->data.length;p->next->next->prior=p;p->next=p->next->next;p->data.state=0;p->data.num=flag;else p->data.state=0;if(p->next=end)/当前P指向的下一个是最后一个时p->data.state=0;/结束if(p->prior=block_first)的情况else if(p->prior!=first)if(p->next!=end)deal1(p);elsedeal2(p);/结束if(p->prior!=block_first)的情况/结束if(p->data.num=flag)的情况printf("t*回收成功*");return OK;/主函数void main() int i;/操作选择标记int a;/算法选择标记printf("*n");printf("tt使用首次适应算法实现主存空间的分配n");printf("*n");printf("n");printf("请输入1调用内存分配算法:");scanf("%d",&a);while(a<1|a>1)printf("输入错误,请重新输入所使用的内存分配算法:n");scanf("%d",&a);switch(a)case 1:printf("nt*使用首次适应算法:*n");break;Initblock();/开创空间表while(1)show();printf("t1: 分配内存t2: 回收内存t0: 退出n");printf("请输入您的操作:");scanf("%d",&i);if(i=1)allocation(a);/分配内存else if(i=2)/内存回收printf("请输入您要释放的分区号:");scanf("%d",&flag);recovery(flag);else if(i=0)printf("n退出程序n");break;/退出else/输入操作有误printf("输入有误,请重试!");continue;五实验结果进行程序调试,调试结果如下5.1开始界面,如图5-1所示。图5-15.2分配内存,如图5-2所示。图5-25.3回收内存及合并分区。回收内存,释放序号为1,5的分区,如图5-3所示。图5-3释放序号为4的分区,此时发现有下邻分区,将其合并,如图5-4所示。图5-4释放序号为2的分区,此时发现有上邻分区,将其合并,如图5-5所示。图5-5成绩评定程序正确性2.521.510.50结果正确性2.521.510.50分析正确性543210成 绩专心-专注-专业