实验三-存储管理实验.docx





《实验三-存储管理实验.docx》由会员分享,可在线阅读,更多相关《实验三-存储管理实验.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除实验三 存储管理实验一. 目的要求: 1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二实验内容:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。算法描述:本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区
2、的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。算法原程序#include stdio.h#include windows.h#include #include #define PCB_NUM 5 /模拟进程数量#define INT 800/内存分区数量struct MemInf int addr; /分区起始地址 int siz
3、e; /分区大小 int state; /0表示空闲,0时表示已分配,存储的是进程IDstruct PCB int pcbID; /进程ID int size; /进程大小 int RunState; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 int TolTime; /总需要运行时间 int RunTime; /已运行时间 pcbListPCB_NUM;void menu() /菜单 int m; system(cls); printf(nntt*ttn); printf(tttt固定分区存储程序演示n); printf(tt*ttn); printf(ntt
4、t1.执行程序.); printf(nttt0.退出程序.); scanf(%d,&m); switch(m) case 1: break; case 0: system(cls); menu(); break; default: system(cls); break;void paixu(struct MemInf* ComMem,int n) int i,j,t; for(j=0; jn-1; j+) for(i=0; iComMemi+1.size) t=ComMemi.size; ComMemi.size=ComMemi+1.size; ComMemi+1.size=t;void pa
5、ixu2() int i,j,t; for(j=0; j4; j+) for(i=0; ipcbListi+1.size) t=pcbListi.size; pcbListi.size=pcbListi+1.size; pcbListi+1.size=t;void main()DD: menu(); char ch; int i,j,n,a=0; struct MemInf* ComMem; system(cls); printf(你要分多少个分区呢,请输入数值吧:); scanf(%d,&n); ComMem=(struct MemInf*)malloc(n*sizeof(struct Me
6、mInf); printf(请划分内存固定大小分区:n);/划分内存固定大小分区 for(i=0; i=INT) printf(超出规定内存范围); ch=getchar(); ch=getchar(); goto DD; paixu(ComMem,n);/初始化就绪进程队列 pcbList0.pcbID =1; pcbList0.RunState =0; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 pcbList0.size=30; pcbList0.RunTime =0; pcbList0.TolTime =5; pcbList1.pcbID =2; pcbL
7、ist1.RunState =0; pcbList1.size=15; pcbList1.RunTime =0; pcbList1.TolTime =6; pcbList2.pcbID =3; pcbList2.RunState =0; pcbList2.size=50; pcbList2.RunTime =0; pcbList2.TolTime =3; pcbList3.pcbID =4; pcbList3.RunState =0; pcbList3.size=120; pcbList3.RunTime =0; pcbList3.TolTime =4; pcbList4.pcbID =5;
8、pcbList4.RunState =0; pcbList4.size=125; pcbList4.RunTime =0; pcbList4.TolTime =9; ch=getchar(); ch=getchar(); while(pcbListPCB_NUM-1.RunTime pcbListPCB_NUM-1.TolTime) for(j=0; jPCB_NUM; j+) /内存分配 for(i=0; i= pcbListj.size) /如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程 ComMemi.state =pcbListj.pcbID ; pcbLis
9、tj.RunState=1; /内存回收 if(pcbListj.RunTime =pcbListj.TolTime) /如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存 for(i=0; in; i+) if(ComMemi.state = pcbListj.pcbID) ComMemi.state = 0; /内存状态变为 未分配 pcbListj.RunState=2; /进程状态变为 运行完毕/运行时间加1 for(i=0; iPCB_NUM; i+) if (pcbListi.RunState=1 & pcbListi.RunTime pcbListi.TolTime)
10、/处于运行状态且运行时间小于总需时间的进程,运行时间加1 pcbListi.RunTime+;/显示模块 printf(进程IDt 进程大小t 状态t 需要时间t 运行时间n); for(i=0; iPCB_NUM; i+) printf(%dt %dtt %dt %dtt %dn,pcbListi.pcbID,pcbListi.size, pcbListi.RunState, pcbListi.TolTime ,pcbListi.RunTime); printf(分区IDt 分区大小t 状态n); for(i=0; in; i+) printf(%dt %dtt %dn,i,ComMemi.
11、size ,ComMemi.state ); printf(按回车键继续.n); getchar(); /按任意键继续(分步执行,以便观察内存分配回收运行结果截图:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 首次适应算法 循环首次适应算法 最佳适应算法 l 代码实现部分:#include#include#include#define max 100typedef struct node int start; int length; char tag20;job;job freesmax;job occupysmax;int
12、 free_quantity,occupy_quantity;int SIZE;void initial() /初始化函数 int i; for(i=0;imax;i+) freesi.start=-1; freesi.length=0; strcpy(freesi.tag,free); occupysi.start=-1; occupysi.length=0; strcpy(occupysi.tag,); free_quantity=0; occupy_quantity=0;void writedata() /把分区函数写入磁盘文件 FILE *fp; char fname20; int i
13、,j; printf(请输入初始空闲表文件名:n); scanf(%s,&fname); printf(现在进行初始化空闲分区!n); printf(请输入您要建立的空闲分区数:n); scanf(%d,&SIZE); for(i=0;iSIZE;i+) j=i+1; printf(输入第%d个分区的起始地址:n,j); scanf(%d,&freesi.start); printf(输入第%d个分区的长度:n,j); scanf(%d,&freesi.length); if(fp=fopen(fname,wb)=NULL) printf(错误,文件打不开,请检查文件名n); for(i=0;
14、iSIZE;i+) if(fwrite(&freesi,sizeof(struct node),1,fp)!=1) printf(文件写入错误!n); fclose(fp);void readdata() /从文件读入分区表函数 FILE *fp; char fname20; printf(请输入读入空闲表文件名:); /输入空闲表文件的文件名 scanf(%s,&fname); if(fp=fopen(fname,rb)=NULL) printf(错误,文件打不开,请检查文件名n); exit(0); else int i; for(i=0;iSIZE;i+) fread(&freesi,s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 存储 管理

限制150内