《存储管理-实验3.doc》由会员分享,可在线阅读,更多相关《存储管理-实验3.doc(13页珍藏版)》请在课桌文档上搜索。
1、实验报告课程名称 操作系统 实验名称 存储管理实验 实验报告要求 1实验目的 2实验要求 3实验步骤 4程序清单 5运行情况 5实验体会1实验目的1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解.熟悉虚存管理的各种页面淘汰算法. 2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解.2实验要求1、 设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程.2、 设计一个可变式分区分配的存储管理方案.并模拟实现分区的分配和回收过程.3实验步骤1. 产生一个需要访问的指令地址流; 2. 指令合适的页面尺寸例如以 1K或2K为1页; 3. 指定内存页表的最大长
2、度,并对页表进行初始化; 4. 每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存如果该页已在主存,则打印页表情况; 如果该页不在主存且页表未满,则调入一页并打印页表情况; 如果该页不在主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况; 5. 逐个地址访问,直到所有地址访问完毕. 4程序清单代码一:#include#include#include#include#define NUM 4#define alloMemory mallocsizeofstruct partiTabint no;int size;int firstAddr
3、;char state;parTabNUM;typedefstruct partiTab PARTITAB;typedefstruct jcb /*定义作业控制块JCB ,部分信息省略*/char name10; /作业名int size;/作业大小struct jcb* link; /链指针JCB;typedefstructJCB *front,*rear;jcbQue;jcbQue *jcbReadyQue;void AllocateMemory;void createTab;void checkTab;void recycleMemory;void AllocateMemoryint i
4、;fori=0;iPARTITAB p=parTabi;ifsizeparTabi.state=Y;elseprintf;void createTabint i;for i=1;i/getPartiTab;parTabi-1.no=i;parTabi-1.size=20;parTabi-1.firstAddr=21;parTabi-1.state=N;void checkTabint i;printf;fori=0;iprintf;printf;printf;printf;printf;void recycleMemoryparTabi-1.state=N;int mainprintf;pri
5、ntf;printf;printf;printf;printf;printf;printf;int i;printf;createTab;checkTab;printf;getchar;printf;fori=0;iAllocateMemory*3;checkTab;printf;getchar;printf假如一段时间后,其中一个作业结束,回收给它分配的分区n;recycleMemory;checkTab;printf;getchar;printf接着,从外存后备作业队列中选择一个作业装入该分区n;AllocateMemory;checkTab;system;return 0;代码二:#in
6、clude#include#include#include#define n 10 /*假定系统允许的最大作业数为n,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/#define minisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于minisize,则将该空闲分区全部分配,若大于minisize,则切割分配*/structfloat address; /*已分配分区起始地址*/float length; /*已分配分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用0表示空栏目*/
7、used_tablen; /*已分配区表*/structfloat address; /*空闲区起始地址*/float length; /*空闲区长度,单位为字节*/int flag; /*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/ free_tablem; /*空闲区表*/void allocate /*给J作业,采用最佳分配算法分配xk大小的空间*/int i,k;float ad;k=-1;fori=0; i /*寻找空间大于xk的最小空闲区登记项k*/if=xk&free_tablei.flag=1ifk=-1|free_tablei.lengthk=i;if /*未找到可
8、用空闲区,返回*/printf;return;/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/iffree_tablek.length-xkfree_tablek.flag=0;ad=free_tablek.address;xk=free_tablek.length;elsefree_tablek.length=free_tablek.length-xk;ad=free_tablek.address+free_tablek.length;/*修改已分配区表
9、*/i=0;whileused_tablei.flag!=0&i /*寻找空表目*/i+;if=n /*无表目可填写已分配分区*/printf;/*修正空闲区表*/if/*前面找到的是整个空闲分区*/free_tablek.flag=1;else/*前面找到的是某个空闲分区的一部分*/free_tablek.length=free_tablek.length+xk;return;else/*修改已分配表*/used_tablei.address=ad;used_tablei.length=xk;used_tablei.flag=J;return;/*主存分配函数结束*/void reclaim
10、 /*回收作业名为J的作业所占主存空间*/int i,k,j,s,t;float S,L;/*寻找已分配表中对应登记项*/s=0;while&ss+;if=n /*在已分配表中找不到名字为J的作业*/printf;return;/*修改已分配表*/used_tables.flag=0;/*取得归还分区的起始地址S和长度L*/S=used_tables.address;L=used_tables.length;j=-1;k=-1;i=0;/*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/whileim&ififk=i;/*找到上邻*/ifj=i;/*找到下邻*/i+;ifif /* 上邻空
11、闲区,下邻空闲区,三项合并*/free_tablek.length=free_tablej.length+free_tablek.length+L;free_tablej.flag=0;else/*上邻空闲区,下邻非空闲区,与上邻合并*/free_tablek.length=free_tablek.length+L;elseif /*上邻非空闲区,下邻为空闲区,与下邻合并*/free_tablej.address=S;free_tablej.length=free_tablej.length+L;else/*上下邻均为非空闲区,回收区域直接填入*/*在空闲区表中寻找空栏目*/t=0;while
12、free_tablet.flag=1&tt+;if=m /*空闲区表满,回收空间失败,将已分配表复原*/printf;used_tables.flag=J;return;free_tablet.address=S;free_tablet.length=L;free_tablet.flag=1;return;/*主存回收函数结束*/int mainprintf;printf;printf;printf;printf;printf;printf;printf;printf;printf 可变式分区分配 n;printf;printf;int i,a;float xk;char J;/*空闲分区表初
13、始化:*/free_table0.address=10240; /*起始地址假定为10240*/free_table0.length=10240; /*长度假定为10240,即10k*/free_table0.flag=1; /*初始空闲区为一个整体空闲区*/fori=1; ifree_tablei.flag=0; /*其余空闲分区表项未被使用*/*已分配表初始化:*/fori=0; iused_tablei.flag=0; /*初始时均未分配*/whileprintf;printf;scanf;switchcase 4:exit; /*a=4程序结束*/case 2: /*a=2分配主存空间
14、*/printf;scanf;allocate; /*分配主存空间*/break;case 3: /*a=3回收主存空间*/printf;scanf;reclaim; /*回收主存空间*/break;case 1: /*a=1显示主存情况*/*输出空闲区表和已分配表的内容*/printf;fori=0; iprintf;printf;getch;printf;fori=0; iifprintf;elseprintf;break;default:printf;/*case*/*while*/system;return 1;5运行情况问题一:问题二:2.1、初始界面:2.2、选择1,可以看到初始时主存初始时均未分配2.3、选择2,输入三个作业:2.4、显示主存和分区表:2.5、输入3回收主存:2.6、再次查看空闲区表和分区表:6实验体会通过本次实验,加深了自己对存储管理方案的理解.并对虚存管理的各种页面淘汰算法进行了尝试,因而对此项内容有了更多的了解.并且通过编写和调试地址转换过程的模拟程序,加深了对地址转发过程的了解.教师评价 优良中与格不与格教师签名日期- 13 - / 13