存儲管理實驗_第1頁
存儲管理實驗_第2頁
存儲管理實驗_第3頁
存儲管理實驗_第4頁
存儲管理實驗_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

實驗三存儲管理實驗一.

目的要求:1、通過編寫和調(diào)試存儲管理的模擬程序以加深對存儲管理方案的理解。熟悉虛存管理的各種頁面淘汰算法。2、通過編寫和調(diào)試地址轉(zhuǎn)換過程的模擬程序以加強對地址轉(zhuǎn)換過程的了解。二.實驗題:1、設(shè)計一個固定式分區(qū)分配的存儲管理方案,并模擬實現(xiàn)分區(qū)的分配和回收過程??梢约俣總€作業(yè)都是批處理作業(yè),并且不允許動態(tài)申請內(nèi)存。為實現(xiàn)分區(qū)的分配和回收,可以設(shè)定一個分區(qū)說明表,按照表中的有關(guān)信息進行分配,并根據(jù)分區(qū)的分配和回收情況修改該表。程序代碼:#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/*定義作業(yè)控制塊JCB,局部信息省略*/{charname[10];//作業(yè)名intsize; //作業(yè)大小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("沒有空閑分區(qū),無法分配內(nèi)存!\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("分區(qū)號\t大小\t起址\t狀態(tài)\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("請按任意鍵繼續(xù):\n");getchar();printf("每個分區(qū)裝入一道作業(yè):\n");for(i=0;i<NUM;i++){AllocateMemory((i+1)*3);}checkTab();printf("請按任意鍵繼續(xù):\n");getchar();printf("假設(shè)一段時間后,其中一個作業(yè)結(jié)束,回收給它分配的分區(qū)(假設(shè)該作業(yè)在第2分區(qū))\n");recycleMemory(2);checkTab();printf("請按任意鍵繼續(xù):\n");getchar();printf("接著,從外存后備作業(yè)隊列中選擇一個作業(yè)裝入該分區(qū)(假設(shè)該作業(yè)大小為10)\n");AllocateMemory(10);checkTab();return0;}運行結(jié)果:2、設(shè)計一個可變式分區(qū)分配的存儲管理方案。并模擬實現(xiàn)分區(qū)的分配和回收過程。#include<iostream>#include<stdlib.h>#defineFree0//空閑狀態(tài)#defineBusy1//已用狀態(tài)#defineOK1//完成#defineERROR0//出錯#defineMAX_length640//最大內(nèi)存空間為640KBusingnamespacestd;typedefintStatus;typedefstructfreearea//定義一個空閑區(qū)說明表結(jié)構(gòu){intID;//分區(qū)號longsize;//分區(qū)大小longaddress;//分區(qū)地址intstate;//狀態(tài)}ElemType;//線性表的雙向鏈表存儲結(jié)構(gòu)typedefstructDuLNode//doublelinkedlist{ElemTypedata;structDuLNode*prior;//前趨指針structDuLNode*next;//后繼指針}DuLNode,*DuLinkList;DuLinkListblock_first;//頭結(jié)點DuLinkListblock_last;//尾結(jié)點Statusalloc(int);//內(nèi)存分配Statusfree(int);//內(nèi)存回收StatusFirst_fit(int,int);//首次適應(yīng)算法StatusBest_fit(int,int);//最正確適應(yīng)算法voidshow();//查看分配StatusInitblock();//開創(chuàng)空間表StatusInitblock()//開創(chuàng)帶頭結(jié)點的內(nèi)存空間鏈表{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<<"請輸入作業(yè)(分區(qū)號):";cin>>ID;cout<<"請輸入需要分配的主存大小(單位:KB):";cin>>request;if(request<0||request==0){cout<<"分配大小不適宜,請重試!"<<endl;returnERROR;}if(ch==2)//選擇最正確適應(yīng)算法{if(Best_fit(ID,request)==OK)cout<<"分配成功!"<<endl;elsecout<<"內(nèi)存缺乏,分配失?。?<<endl;returnOK;}else//默認首次適應(yīng)算法{if(First_fit(ID,request)==OK)cout<<"分配成功!"<<endl;elsecout<<"內(nèi)存缺乏,分配失?。?<<endl;returnOK;}}//首次適應(yīng)算法StatusFirst_fit(intID,intrequest)//傳入作業(yè)名及申請量{//為申請作業(yè)開辟新空間且初始化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;}//最正確適應(yīng)算法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{//找到了最正確位置并實現(xiàn)分配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<<"分區(qū)號:";if(p->data.ID==Free)cout<<"Free"<<endl;elsecout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address<<endl;cout<<"分區(qū)大?。?<<p->data.size<<"KB"<<endl;cout<<"狀態(tài):";if(p->data.state==Free)cout<<"空閑"<<endl;elsecout<<"已分配"<<endl;cout<<"——————————————"<<endl;p=p->next;}}//主函數(shù)intmain(){intch;//算法選擇標記cout<<"動態(tài)分區(qū)分配方式的模擬\n";cout<<"1)首次適應(yīng)算法\n2)最正確適應(yīng)算法\n";cout<<"請選擇分配算法:";cin>>ch;Initblock();//開創(chuàng)空間表intchoice;//操作選擇標記while(1){cout<<"1:分配內(nèi)存\n2:回收內(nèi)存\n";cout<<"3:查看分配\n0:退出\n";cout<<"請輸入您的操作:";cin>>choice;if(choice==1)alloc(ch);//分配內(nèi)存elseif(choice==2)//內(nèi)存回收{(diào)intID;cout<<"請輸入您要釋放的分區(qū)號:";cin>>ID;free(ID);}elseif(choice==3)show();//顯示主存elseif(choice==0)break;//退出else//輸入操作有誤{cout<<"輸入有誤,請重試!"<<endl;continue;}}}運行結(jié)果:首次適應(yīng)算法:最正確適應(yīng)算法:3、編寫并調(diào)試一個段頁式存儲管理的地址轉(zhuǎn)換的模擬程序。#include<iostream>#include<string>usingnamespacestd;typedefstructQuick{intqs;//快表段號intqp;//快表頁號intqb;//快表段號}Quick;typedefstructData{intnum;//內(nèi)存的塊數(shù)stringstr;//對應(yīng)數(shù)據(jù)塊的作業(yè)內(nèi)容,簡化起見說明內(nèi)容為一串字符。}Data;//頁表typedefstructPage{intnum;//頁號intflag;//頁狀態(tài),即是否在內(nèi)存。intblock;//該頁對應(yīng)的塊號}Page;typedefstructStack{intnum;//段號intflag;//段狀態(tài)intplen;//頁表長度intpsta;//頁表始址}Stack;//段表存放器typedefstructStare{intssta;//段表始址intslen;//段表長度}Stare;Stackss[10];////全局變量Starest;///////全局變量Datawork[20];//全局變量Quickqu;//////全局變量Pagepage[5][5];boolmenuflag=0;intbbs;//內(nèi)存塊大小intbs;//內(nèi)存大小voidmenu();voidstart();voidchange();intmain(){menu();return0;}voidmenu(){cout<<"請選擇:"<<endl;cout<<endl;cout<<"1、初始化表"<<endl;cout<<"2、物理地址轉(zhuǎn)換"<<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<<"請輸入內(nèi)存大小(K)"<<endl;cin>>bs;cout<<"請輸入內(nèi)存塊的大小(k)"<<endl;cin>>bbs;intblocknum;blocknum=bs/bbs;cout<<"內(nèi)存一共被分為"<<blocknum<<"塊,每塊"<<bbs<<"k"<<"一共"<<bs<<"k"<<endl;cout<<"請輸入進程個數(shù)"<<endl;intpn;cin>>pn;//下面求所有進程的總段數(shù)和段表,并為每段創(chuàng)立頁表intsums=0;for(intpn1=0;pn1<pn;pn1++){cout<<"請輸入第"<<pn1<<"個進程的段數(shù)"<<endl;intppn;cin>>ppn;sums+=ppn;}for(intss1=0;ss1<sums;ss1++){cout<<"請輸入第"<<ss1<<"個段表數(shù)據(jù):段號,狀態(tài),頁表長度,頁表始址"<<endl;cin>>ss[ss1].num>>ss[ss1].flag>>ss[ss1].plen>>ss[ss1].psta;cout<<"請初始化第"<<ss1<<"段的頁表,輸入兩個數(shù)據(jù)頁表狀態(tài)和對應(yīng)塊號"<<endl;for(intsss1=0;sss1<ss[ss1].plen;sss1++){page[ss1][sss1].num=sss1;cout<<"請輸入該段第"<<sss1<<"個頁表的頁表狀態(tài)和對應(yīng)塊號"<<endl;cin>>page[ss1][sss1].flag>>page[ss1][sss1].block;}}//初始化段表存放器cout<<"初始化段表存放器的段表始址"<<endl;cin>>st.ssta;st.slen=sums;//初始化內(nèi)存中物理地址每一塊的數(shù)據(jù)區(qū)cout<<"簡單起見,我們對物理地址的每一塊用字符串進行簡單的初始化,沒有具體到每一物理地址"<<endl;for(intbn=0;bn<blocknum;bn++){work[bn].num=bn;cout<<"請輸入第"<<bn<<"個內(nèi)存塊里的作業(yè)內(nèi)容"<<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<<"該頁不在內(nèi)存請輸入一頁在內(nèi)存中的作為快表,請輸入要作為快表的段號和頁號"<<endl;cin>>qu.qb>>qu.qp;}qu.qs=page[qu.qb][qu.qp].block;menu();}voidchange(){cout<<"請輸入要轉(zhuǎn)化的邏輯地址,段號s,段內(nèi)頁號p,頁內(nèi)偏移地址d(B)"<<endl;intsnum,pnum,dnum;cin>>snum>>pnum>>dnum;//首先查快表if(snum==qu.qb&&pnum==qu.qp){cout<<"快表命中"<<"對應(yīng)塊號是"<<qu.qs<<endl;cout<<"該塊中作業(yè)數(shù)據(jù)是"<<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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論