29
存存存存存存存 _ 1 成成成成成成成成 成成 4 4 成成成成成成成 成成成成成成成 4.1 4.1 成成成成 成成成成 4.2 4.2 成成成成 成成成成 4.3 4.3 成成成成 成成成成 4.4 4.4 成成成成 成成成成

第4章 存储器管理实验

Embed Size (px)

Citation preview

存储器管理实验 _ 1 成都信息工程学院 徐虹

第第 44 章 存储器管理实验章 存储器管理实验第第 44 章 存储器管理实验章 存储器管理实验

• 4.1 4.1 实验目的实验目的• 4.2 4.2 准备知识准备知识• 4.3 4.3 实验内容实验内容• 4.4 4.4 实验指导实验指导

存储器管理实验 _ 2 成都信息工程学院 徐虹

• 4.4.1 4.4.1 FIFOFIFO 页面置换算法页面置换算法

存储器管理实验 _ 3 成都信息工程学院 徐虹

• 4.4.2 4.4.2 LRULRU 页面置换算法页面置换算法

存储器管理实验 _ 4 成都信息工程学院 徐虹

• 4.4.3 4.4.3 NURNUR 页面置换算法页面置换算法

存储器管理实验 _ 5 成都信息工程学院 徐虹

• 4.4.4 4.4.4 OPTOPT 页面置换算法页面置换算法

存储器管理实验 _ 6 成都信息工程学院 徐虹

• 4.5 4.5 参考源程序代码参考源程序代码#ifndef _PAGE_H#define _PAGE_Hclass cpage {public:

int m_nPageNumber,m_nPageFaceNumber,m_nCounter,m_nTime;

};#endif

存储器管理实验 _ 7 成都信息工程学院 徐虹

#ifndef _PAGECONTROL_H#define _PAGECONTROL_Hclass CpageControl {public:

int m_nPageNumber,m_nPageFaceNumber;

class CPageControl * m_pNext;};#endif

存储器管理实验 _ 8 成都信息工程学院 徐虹

#ifndef _MEMORY_H#define _MEMORY_H class CMemory {public:

CMemory();void initialize(const int

nTotal_pf);void FIFO(const int nTotal_pf);void LRU(const int nTotal_pf);void NUR(const int nTotal_pf);void OPT(const int nTotal_pf);

存储器管理实验 _ 9 成都信息工程学院 徐虹

private:vector<CPage> _vDiscPages;vector<CPageControl>

_vMemoryPages;CPageControl

*_pFreepf_head, *_pBusypf_head, *_pBusypf_tail;

vector<int> _vMain,_vPage,_vOffset;

int _nDiseffect;}; 

存储器管理实验 _ 10 成都信息工程学院 徐虹

CMemory::CMemory(): _vDiscPages(TOTAL_VP),

_vMemoryPages(TOTAL_VP), _vMain(TOTAL_INSTRUCTION), _vPage(TOTAL_INSTRUCTION), _vOffset(TOTAL_INSTRUCTION) {int S,i,nRand;srand(getpid()*10);

存储器管理实验 _ 11 成都信息工程学院 徐虹

nRand=rand()%32767;S=(float)319*nRand/32767+1;for(i=0;i<TOTAL_INSTRUCTION;i+=4) {

_vMain[i]=S;_vMain[i+1]=_vMain[i]+1;nRand=rand()%32767;_vMain[i+2]=(float)_vMain[i]

*nRand/32767;_vMain[i+3]=_vMain[i+2]+1;nRand=rand()%32767;

存储器管理实验 _ 12 成都信息工程学院 徐虹

S=(float)nRand * (318-_vMain[i+2])/32767+_vMain[i+2]+2;

}for(i=0;i<TOTAL_INSTRUCTION;i++) {

_vPage[i]=_vMain[i]/10;_vOffset[i]=_vMain[i]%10;_vPage[i]%=32;

}}

存储器管理实验 _ 13 成都信息工程学院 徐虹

void CMemory::initialize(const int nTotal_pf){int ix;_nDiseffect=0;for(ix=0;ix<_vDiscPages.size();ix++) {

_vDiscPages[ix].m_nPageNumber=ix;

_vDiscPages[ix].m_nPageFaceNumber=INVALID;_vDiscPages[ix].m_nCounter=0;_vDiscPages[ix].m_nTime=-1;

}for(ix=1;ix<nTotal_pf;ix++) {

_vMemoryPages[ix-1].m_pNext=&_vMemoryPages[ix];

_vMemoryPages[ix-1].m_nPageFaceNumber=ix-1;

}

存储器管理实验 _ 14 成都信息工程学院 徐虹

_vMemoryPages[nTotal_pf-1].m_pNext=NULL;

_vMemoryPages[nTotal_pf-1].m_nPageFaceNumber=nTotal_pf-1;

_pFreepf_head=&_vMemoryPages[0];} void CMemory::FIFO(const int nTotal_pf) {

int i;CPageControl *p;initialize(nTotal_pf);

_pBusypf_head=_pBusypf_tail=NULL;for(i=0;i<TOTAL_INSTRUCTION;i++) {

存储器管理实验 _ 15 成都信息工程学院 徐虹

if(_vDiscPages[_vPage[i]].m_nPageFaceNumber==INVALID) {

_nDiseffect+=1; if(_pFreepf_head==NULL) // 无空闲页面

{ p=_pBusypf_head->m_pNext; _vDiscPages[_pBusypf_head-

>m_nPageNumber].m_nPageFaceNumber=INVALID;

_pFreepf_head=_pBusypf_head; _pFreepf_head->m_pNext=NULL; _pBusypf_head=p;

}

存储器管理实验 _ 16 成都信息工程学院 徐虹

p=_pFreepf_head->m_pNext;_pFreepf_head->m_pNext=NULL;_pFreepf_head->m_nPageNumber=_vPage[i];_vDiscPages[_vPage[i]].m_nPageFaceNumber =_pFreepf_head-> m_nPageFaceNumber;if(_pBusypf_tail==NULL)

_pBusypf_head=_pBusypf_tail=_pFreepf_head;else {

_pBusypf_tail->m_pNext=_pFreepf_head; _pBusypf_tail=_pFreepf_head;

}

存储器管理实验 _ 17 成都信息工程学院 徐虹

_pFreepf_head=p; } }

cout<<"FIFO: "<<1-(float)_nDiseffect/320;} void CMemory::LRU(const int nTotal_pf) { int i,j,nMin,minj,nPresentTime(0); initialize(nTotal_pf);

存储器管理实验 _ 18 成都信息工程学院 徐虹

for(i=0;i<TOTAL_INSTRUCTION;i++) { if(_vDiscPages[_vPage[i]].m_nPageFaceNumber==INVALID){

_nDiseffect++; if(_pFreepf_head==NULL) { nMin=32767; for(j=0;j<TOTAL_VP;j++) // 得到最近最少使用的页面的页号// 循环结束后 ,iMin 表示最近最少使用页面的访问次数 ;minj 表示需要换出的页号if(nMin>_vDiscPages[j].m_nTime &&_vDiscPages[j].m_nPageFaceNumber!=INVALID)

{ nMin=_vDiscPages[j].m_nTime; minj=j;}

存储器管理实验 _ 19 成都信息工程学院 徐虹

_pFreepf_head= &_vMemoryPages[_vDiscPages[minj].m_nPageFaceNumber];

_vDiscPages[minj].m_nPageFaceNumber=INVALID;_vDiscPages[minj].m_nTime=-1;_pFreepf_head->m_pNext=NULL;

}_vDiscPages[_vPage[i]].m_nPageFaceNumber= _pFreepf_head->m_nPageFaceNumber;_vDiscPages[_vPage[i]].m_nTime=nPresentTime;_pFreepf_head=_pFreepf_head->m_pNext;}

存储器管理实验 _ 20 成都信息工程学院 徐虹

else_vDiscPages[_vPage[i]].m_nTime=nPresentTime;

nPresentTime++;} cout<<"LRU: "<<1-(float)_nDiseffect/320;}void CMemory::NUR(const int nTotal_pf) { int i,j,nDiscPage,nOld_DiscPage; bool bCont_flag; initialize(nTotal_pf); nDiscPage=0;

存储器管理实验 _ 21 成都信息工程学院 徐虹

for(i=0;i<TOTAL_INSTRUCTION;i++) {if(_vDiscPages[_vPage[i]].m_nPageFaceNumber ==INVALID) { _nDiseffect++; if(_pFreepf_head==NULL) { bCont_flag=true; nOld_DiscPage=nDiscPage; while(bCont_flag) {if(_vDiscPages[nDiscPage].m_nCounter==0&&_vDiscPages[nDiscPage].m_nPageFaceNumber!=INVALID)

bCont_flag=false;

存储器管理实验 _ 22 成都信息工程学院 徐虹

else { nDiscPage++; if(nDiscPage==TOTAL_VP) nDiscPage=0; if(nDiscPage==nOld_DiscPage) for(j=0;j<TOTAL_VP;j++)

_vDiscPages[j].m_nCounter=0; }

}_pFreepf_head=&_vMemoryPages[_vDiscPages[nDiscPage].m_nPageFaceNumber];

存储器管理实验 _ 23 成都信息工程学院 徐虹

_vDiscPages[nDiscPage].m_nPageFaceNumber=INVALID; _pFreepf_head->m_pNext=NULL; }_vDiscPages[_vPage[i]].m_nPageFaceNumber=_pFreepf_head->m_nPageFaceNumber; _pFreepf_head=_pFreepf_head->m_pNext;}else _vDiscPages[_vPage[i]].m_nCounter=1; if(i%CLEAR_PERIOD==0) for(j=0;j<TOTAL_VP;j++)

_vDiscPages[j].m_nCounter=0; }

存储器管理实验 _ 24 成都信息工程学院 徐虹

cout<<"NUR:"<<1-(float)_nDiseffect/320;} void CMemory::OPT(const int nTotal_pf){ int i,j,max,maxpage,nDistance,vDistance[TOTAL_VP]; initialize(nTotal_pf); for(i=0;i<TOTAL_INSTRUCTION;i++) { if(_vDiscPages[_vPage[i]].m_nPageFaceNumber==INVALID)

{ _nDiseffect++; if(_pFreepf_head==NULL) { for(j=0;j<TOTAL_VP;j++)

if(_vDiscPages[j].m_nPageFaceNumber!=INVALID) vDistance[j]=32767;else

vDistance[j]=0;

存储器管理实验 _ 25 成都信息工程学院 徐虹

nDistance=1; for(j=i+1;j<TOTAL_INSTRUCTION;j++) { if((_vDiscPages[_vPage[j]].m_nPageFaceNumber!=INVALID)&&

(vDistance[_vPage[j]]==32767)) vDistance[_vPage[j]]=nDistance; nDistance++;} max =-1; for(j=0;j<TOTAL_VP;j++)

if(max<vDistance[j]) { max=vDistance[j]; maxpage=j;}

存储器管理实验 _ 26 成都信息工程学院 徐虹

_pFreepf_head=&_vMemoryPages[_vDiscPages[maxpage].m_nPageFaceNumber]; _pFreepf_head->m_pNext=NULL; _vDiscPages[maxpage].m_nPageFaceNumber=INVALID; }_vDiscPages[_vPage[i]].m_nPageFaceNumber=_pFreepf_head->m_nPageFaceNumber;

_pFreepf_head=_pFreepf_head->m_pNext;} } cout<<"OPT:"<<1-(float)_nDiseffect/320;}#endif

存储器管理实验 _ 27 成都信息工程学院 徐虹

#include <iostream>#include <string>#include <vector>#include <cstdlib>#include <cstdio>#include <unistd.h>using namespace std;#define INVALID -1const int TOTAL_INSTRUCTION(320);const int TOTAL_VP(32);const int CLEAR_PERIOD(50);

存储器管理实验 _ 28 成都信息工程学院 徐虹

#include "Page.h"#include "PageControl.h"#include "Memory.h"int main() {

int i;CMemory a;for(i=4;i<=32;i++) { a.FIFO(i);

a.LRU(i); a.NUR(i); a.OPT(i); cout<<"\n";}

return 0;}

存储器管理实验 _ 29 成都信息工程学院 徐虹

• 4.6 4.6 程序运行程序运行

g++ -o main main.cpp↙./main↙