存储管理实验_第1页
存储管理实验_第2页
存储管理实验_第3页
存储管理实验_第4页
存储管理实验_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三存储管理实验一.

目的要求:1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二.实验题:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。程序代码:#include<stdio.h>#include<stdio.h>#include<math.h>#include<stdlib.h>#defineNUM4#definealloMemory(type)(type*)malloc(sizeof(type))structpartiTab{intno;intsize;intfirstAddr;charstate;}parTab[NUM];typedefstructpartiTabPARTITAB;typedefstructjcb/*定义作业控制块JCB,局部信息省略*/{charname[10];//作业名intsize; //作业大小structjcb*link;//链指针}JCB;typedefstruct{JCB*front,*rear;}jcbQue;jcbQue*jcbReadyQue;voidAllocateMemory(intsize);voidcreateTab();voidcheckTab();voidrecycleMemory(inti);voidAllocateMemory(intsize){inti;for(i=0;i<NUM;i++){PARTITABp=parTab[i];if(p.state='N'&&p.size>size)parTab[i].state='Y';elseprintf("没有空闲分区,无法分配内存!\n");}}voidcreateTab(){inti;for(i=1;i<=NUM;i++){//getPartiTab(PARTITAB);parTab[i-1].no=i;parTab[i-1].size=20;parTab[i-1].firstAddr=21;parTab[i-1].state='N';}}voidcheckTab(){inti;printf("分区号\t大小\t起址\t状态\n");for(i=0;i<NUM;i++){printf("%d\t",parTab[i].no);printf("%d\t",parTab[i].size);printf("%d\t",parTab[i].firstAddr);printf("%c\t",parTab[i].state);printf("\n");}}voidrecycleMemory(inti){parTab[i-1].state='N';}intmain(intargc,char*argv[]){inti;createTab();checkTab();printf("请按任意键继续:\n");getchar();printf("每个分区装入一道作业:\n");for(i=0;i<NUM;i++){AllocateMemory((i+1)*3);}checkTab();printf("请按任意键继续:\n");getchar();printf("假设一段时间后,其中一个作业结束,回收给它分配的分区(假设该作业在第2分区)\n");recycleMemory(2);checkTab();printf("请按任意键继续:\n");getchar();printf("接着,从外存后备作业队列中选择一个作业装入该分区(假设该作业大小为10)\n");AllocateMemory(10);checkTab();return0;}运行结果:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。#include<iostream>#include<stdlib.h>#defineFree0//空闲状态#defineBusy1//已用状态#defineOK1//完成#defineERROR0//出错#defineMAX_length640//最大内存空间为640KBusingnamespacestd;typedefintStatus;typedefstructfreearea//定义一个空闲区说明表结构{intID;//分区号longsize;//分区大小longaddress;//分区地址intstate;//状态}ElemType;//线性表的双向链表存储结构typedefstructDuLNode//doublelinkedlist{ElemTypedata;structDuLNode*prior;//前趋指针structDuLNode*next;//后继指针}DuLNode,*DuLinkList;DuLinkListblock_first;//头结点DuLinkListblock_last;//尾结点Statusalloc(int);//内存分配Statusfree(int);//内存回收StatusFirst_fit(int,int);//首次适应算法StatusBest_fit(int,int);//最正确适应算法voidshow();//查看分配StatusInitblock();//开创空间表StatusInitblock()//开创带头结点的内存空间链表{block_first=(DuLinkList)malloc(sizeof(DuLNode));block_last=(DuLinkList)malloc(sizeof(DuLNode));block_first->prior=NULL;block_first->next=block_last;block_last->prior=block_first;block_last->next=NULL;block_last->data.address=0;block_last->data.size=MAX_length;block_last->data.ID=0;block_last->data.state=Free;returnOK;}//分配主存Statusalloc(intch){intID,request;cout<<"请输入作业(分区号):";cin>>ID;cout<<"请输入需要分配的主存大小(单位:KB):";cin>>request;if(request<0||request==0){cout<<"分配大小不适宜,请重试!"<<endl;returnERROR;}if(ch==2)//选择最正确适应算法{if(Best_fit(ID,request)==OK)cout<<"分配成功!"<<endl;elsecout<<"内存缺乏,分配失败!"<<endl;returnOK;}else//默认首次适应算法{if(First_fit(ID,request)==OK)cout<<"分配成功!"<<endl;elsecout<<"内存缺乏,分配失败!"<<endl;returnOK;}}//首次适应算法StatusFirst_fit(intID,intrequest)//传入作业名及申请量{//为申请作业开辟新空间且初始化DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));temp->data.ID=ID;temp->data.size=request;temp->data.state=Busy;DuLNode*p=block_first->next;while(p){if(p->data.state==Free&&p->data.size==request){//有大小恰好适宜的空闲块p->data.state=Busy;p->data.ID=ID;returnOK;break;}if(p->data.state==Free&&p->data.size>request){//有空闲块能满足需求且有剩余"temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size-=request;returnOK;break;}p=p->next;}returnERROR;}//最正确适应算法StatusBest_fit(intID,intrequest){intch;//记录最小剩余空间DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));temp->data.ID=ID;temp->data.size=request;temp->data.state=Busy;DuLNode*p=block_first->next;DuLNode*q=NULL;//记录最正确插入位置while(p)//初始化最小空间和最正确位置{if(p->data.state==Free&&(p->data.size>request||p->data.size==request)){q=p;ch=p->data.size-request;break;}p=p->next;}while(p){if(p->data.state==Free&&p->data.size==request){//空闲块大小恰好适宜p->data.ID=ID;p->data.state=Busy;returnOK;break;}if(p->data.state==Free&&p->data.size>request){//空闲块大于分配需求if(p->data.size-request<ch)//剩余空间比初值还小{ch=p->data.size-request;//更新剩余最小值q=p;//更新最正确位置指向}}p=p->next;}if(q==NULL)returnERROR;//没有找到空闲块else{//找到了最正确位置并实现分配temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.size=ch;returnOK;}}//主存回收Statusfree(intID){DuLNode*p=block_first;while(p){if(p->data.ID==ID){p->data.state=Free;p->data.ID=Free;if(p->prior->data.state==Free)//与前面的空闲块相连{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;}if(p->next->data.state==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;p->next->next->prior=p;p->next=p->next->next;}break;}p=p->next;}returnOK;}//显示主存分配情况voidshow(){cout<<"+++++++++++++++++++++++++++++++++++++++\n";cout<<"+++主存分配情况+++\n";cout<<"+++++++++++++++++++++++++++++++++++++++\n";DuLNode*p=block_first->next;while(p){cout<<"分区号:";if(p->data.ID==Free)cout<<"Free"<<endl;elsecout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address<<endl;cout<<"分区大小:"<<p->data.size<<"KB"<<endl;cout<<"状态:";if(p->data.state==Free)cout<<"空闲"<<endl;elsecout<<"已分配"<<endl;cout<<"——————————————"<<endl;p=p->next;}}//主函数intmain(){intch;//算法选择标记cout<<"动态分区分配方式的模拟\n";cout<<"1)首次适应算法\n2)最正确适应算法\n";cout<<"请选择分配算法:";cin>>ch;Initblock();//开创空间表intchoice;//操作选择标记while(1){cout<<"1:分配内存\n2:回收内存\n";cout<<"3:查看分配\n0:退出\n";cout<<"请输入您的操作:";cin>>choice;if(choice==1)alloc(ch);//分配内存elseif(choice==2)//内存回收{intID;cout<<"请输入您要释放的分区号:";cin>>ID;free(ID);}elseif(choice==3)show();//显示主存elseif(choice==0)break;//退出else//输入操作有误{cout<<"输入有误,请重试!"<<endl;continue;}}}运行结果:首次适应算法:最正确适应算法:3、编写并调试一个段页式存储管理的地址转换的模拟程序。#include<iostream>#include<string>usingnamespacestd;typedefstructQuick{intqs;//快表段号intqp;//快表页号intqb;//快表段号}Quick;typedefstructData{intnum;//内存的块数stringstr;//对应数据块的作业内容,简化起见说明内容为一串字符。}Data;//页表typedefstructPage{intnum;//页号intflag;//页状态,即是否在内存。intblock;//该页对应的块号}Page;typedefstructStack{intnum;//段号intflag;//段状态intplen;//页表长度intpsta;//页表始址}Stack;//段表存放器typedefstructStare{intssta;//段表始址intslen;//段表长度}Stare;Stackss[10];////全局变量Starest;///////全局变量Datawork[20];//全局变量Quickqu;//////全局变量Pagepage[5][5];boolmenuflag=0;intbbs;//内存块大小intbs;//内存大小voidmenu();voidstart();voidchange();intmain(){menu();return0;}voidmenu(){cout<<"请选择:"<<endl;cout<<endl;cout<<"1、初始化表"<<endl;cout<<"2、物理地址转换"<<endl;cout<<"3、退出"<<endl;intmenu1;cin>>menu1;if(menu1!=1&&menu1!=2&&menu1!=3){cout<<"请输入正确的选项"<<endl;menu();}switch(menu1){case1:{menuflag=1;start();break;}case2:{if(menuflag==0){cout<<"请初始化表"<<endl;menu();}change();break;}case3:return;}//switch}voidstart(){cout<<"请输入内存大小(K)"<<endl;cin>>bs;cout<<"请输入内存块的大小(k)"<<endl;cin>>bbs;intblocknum;blocknum=bs/bbs;cout<<"内存一共被分为"<<blocknum<<"块,每块"<<bbs<<"k"<<"一共"<<bs<<"k"<<endl;cout<<"请输入进程个数"<<endl;intpn;cin>>pn;//下面求所有进程的总段数和段表,并为每段创立页表intsums=0;for(intpn1=0;pn1<pn;pn1++){cout<<"请输入第"<<pn1<<"个进程的段数"<<endl;intppn;cin>>ppn;sums+=ppn;}for(intss1=0;ss1<sums;ss1++){cout<<"请输入第"<<ss1<<"个段表数据:段号,状态,页表长度,页表始址"<<endl;cin>>ss[ss1].num>>ss[ss1].flag>>ss[ss1].plen>>ss[ss1].psta;cout<<"请初始化第"<<ss1<<"段的页表,输入两个数据页表状态和对应块号"<<endl;for(intsss1=0;sss1<ss[ss1].plen;sss1++){page[ss1][sss1].num=sss1;cout<<"请输入该段第"<<sss1<<"个页表的页表状态和对应块号"<<endl;cin>>page[ss1][sss1].flag>>page[ss1][sss1].block;}}//初始化段表存放器cout<<"初始化段表存放器的段表始址"<<endl;cin>>st.ssta;st.slen=sums;//初始化内存中物理地址每一块的数据区cout<<"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址"<<endl;for(intbn=0;bn<blocknum;bn++){work[bn].num=bn;cout<<"请输入第"<<bn<<"个内存块里的作业内容"<<endl;cin>>work[bn].str;}//初始化快表cout<<"简单起见,我们初始化快表只有一个"<<endl;cout<<"请输入要作为快表的段号和页号"<<endl;cin>>qu.qb>>qu.qp;while(ss[qu.qb].flag!=1||page[qu.qb][qu.qp].flag!=1){cout<<"该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号"<<endl;cin>>qu.qb>>qu.qp;}qu.qs=page[qu.qb][qu.qp].block;menu();}voidchange(){cout<<"请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)"<<endl;intsnum,pnum,dnum;cin>>snum>>pnum>>dnum;//首先查快表if(snum==qu.qb&&pnum==qu.qp){cout<<"快表命中"<<"对应块号是"<<qu.qs<<endl;cout<<"该块中作业数据是"<<work[page[qu.qb][qu.qp].block].str<<endl;cout<<"物理地址是"<<qu.qs*bbs*1024+dnum<<endl;;menu();}//访问段表存放器else{cout<<"快表没有命中,访问段表存放器,段号等于段表始址加上偏移地址"<<endl;intssnum;ssnum=st.ssta+snum;if(ssnum>st.slen-1){cout<<"越界中断"<<endl;menu();}//访问段表else{if(ssnum>=0&&ssnum<=st.slen-1){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论