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
3、 state; /0表示空闲,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.执行程序.);
4、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 paixu2() in
5、t 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 MemInf); p
6、rintf(请划分内存固定大小分区: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.Run
7、State =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; pcbList4
8、.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 ; pcbListj.RunSt
9、ate=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.size ,C
11、omMemi.state ); printf(按回车键继续.n); getchar(); /按任意键继续(分步执行,以便观察内存分配回收 运行结果截图:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 首次适应算法 循环首次适应算法 最佳适应算法 代码实现部分:#include#include#include#define max 100typedef struct node int start; int length; char tag20;job;job freesmax;job occupysmax;int free_qu
12、antity,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,j; prin
13、tf(请输入初始空闲表文件名: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;iSIZE;i+
14、) 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,sizeof(st
15、ruct node),1,fp); free_quantity+; fclose(fp);void sort() /排序空闲表 int i; for(i=0;ifree_quantity-1;i+) int t=i; int j; for(j=i+1;jfree_quantity;j+) if(freesj.start=freest.start) t=j; freesfree_quantity.start=freesi.start; freesfree_quantity.length=freesi.length; freesi.start=freest.start; freesi.length
16、=freest.length; freest.start=freesfree_quantity.start; freest.length=freesfree_quantity.length; void view() /显示分区信息int i,j; printf(空闲分区表显示如下:n); printf(起始地址t长度t状态标志n); for(i=0;ifree_quantity;i+) printf(%6dkt%10dkt%stn,freesi.start,freesi.length,freesi.tag); printf(nn已分配分区表显示如下:n); printf(起始地址t长度t占用作
17、业名n); for(j=0;joccupy_quantity;j+) printf(%6dkt%10dkt%stn,occupysj.start,occupysj.length,occupysj.tag); getchar(); getchar();void earliest() /首次适应算法 char jobname20; int joblength,f=0; int i,j; printf(请输入作业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,&joblength); for(i=0;i=joblength) f=1; if
18、(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; occupysoccupy_quantity.start=freesj.start; /分配满足条件的空间 strcpy(occupysoccupy_quantity.tag,jobname); occupysoccupy_quantity.length=joblength; occupy_quantity+; if(freesj.
19、lengthjoblength) freesj.start+=joblength; freesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void excellent() /最佳适应法 char jobname20; int joblength,f=0; int i,j;printf(请输入作
20、业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,&joblength); for(i=0;i=joblength) f=1; if(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; for(i=0;i=joblength&freesi.lengthjoblength) freesj.start+=joblength; fr
21、eesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void worst() char jobname20; int joblength,f=0;int i,j; printf(请输入作业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,
22、&joblength); for(i=0;i=joblength) f=1; if(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; for(i=0;i=joblength&freesi.lengthfreesj.length) j=i; occupysoccupy_quantity.start=freesj.start; /分配空闲空间 strcpy(occu
23、pysoccupy_quantity.tag,jobname); occupysoccupy_quantity.length=joblength; occupy_quantity+; if(freesj.lengthjoblength) freesj.start+=joblength; freesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void main() initial(); int n; writedata(); system(cls); readdata(); for(;) sort(); printf(*n); printf(*n); printf(* 欢迎使用可变分区存储管理系统 *n); printf(*n); printf(* 1.显示空闲表和分配表 *n); printf(* 2.首次适应算法 *n); printf(* 3.最佳适应算法 *
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1