《实验三存储管理实验》由会员分享,可在线阅读,更多相关《实验三存储管理实验(26页珍藏版)》请在金锄头文库上搜索。
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 size; /分区大小 int state; /0表
3、示空闲,0时表示已分配,存储的是进程ID;struct 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(nttt1.执行程序.); printf(nttt
4、0.退出程序.); 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 paixu2() int i,j,t; fo
5、r(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 MemInf); printf(请划分内存
6、固定大小分区: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; pcbList1.RunState =0; p
7、cbList1.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; pcbList4.RunState =
8、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 ; pcbListj.RunState=1; /内存回
9、收 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) /处于运行状态且运行时间小于总需时间的进程,运行时间加1 pcbListi.RunTime+;/显示模块 printf(进程IDt 进程大小t 状态t 需要时间t 运行时间n); for(i=0; iPCB_NUM; i+) printf(%dt %dtt %dt %dtt %dn,pcbLi