第4章 存储器管理实验

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

description

第4章 存储器管理实验. 4.1 实验目的 4.2 准备知识 4.3 实验内容 4.4 实验指导. 4.4.1 FIFO 页面置换算法. 4.4.2 LRU 页面置换算法. 4.4.3 NUR 页面置换算法. 4.4.4 OPT 页面置换算法. 4.5 参考源程序代码. # ifndef _PAGE_H #define _PAGE_H class cpage { public: int m_nPageNumber, m_nPageFaceNumber, m_nCounter, m_nTime; }; - PowerPoint PPT Presentation

Transcript of 第4章 存储器管理实验

Page 1: 第4章  存储器管理实验

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

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

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

Page 2: 第4章  存储器管理实验

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

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

Page 3: 第4章  存储器管理实验

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

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

Page 4: 第4章  存储器管理实验

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

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

Page 5: 第4章  存储器管理实验

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

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

Page 6: 第4章  存储器管理实验

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

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

int m_nPageNumber,m_nPageFaceNumber,m_nCounter,m_nTime;

};#endif

Page 7: 第4章  存储器管理实验

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

#ifndef _PAGECONTROL_H#define _PAGECONTROL_Hclass CpageControl {public:

int m_nPageNumber,m_nPageFaceNumber;

class CPageControl * m_pNext;};#endif

Page 8: 第4章  存储器管理实验

存储器管理实验 _ 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);

Page 9: 第4章  存储器管理实验

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

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

_vMemoryPages;CPageControl

*_pFreepf_head, *_pBusypf_head, *_pBusypf_tail;

vector<int> _vMain,_vPage,_vOffset;

int _nDiseffect;}; 

Page 10: 第4章  存储器管理实验

存储器管理实验 _ 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);

Page 11: 第4章  存储器管理实验

存储器管理实验 _ 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;

Page 12: 第4章  存储器管理实验

存储器管理实验 _ 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;

}}

Page 13: 第4章  存储器管理实验

存储器管理实验 _ 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;

}

Page 14: 第4章  存储器管理实验

存储器管理实验 _ 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++) {

Page 15: 第4章  存储器管理实验

存储器管理实验 _ 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;

}

Page 16: 第4章  存储器管理实验

存储器管理实验 _ 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;

}

Page 17: 第4章  存储器管理实验

存储器管理实验 _ 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);

Page 18: 第4章  存储器管理实验

存储器管理实验 _ 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;}

Page 19: 第4章  存储器管理实验

存储器管理实验 _ 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;}

Page 20: 第4章  存储器管理实验

存储器管理实验 _ 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;

Page 21: 第4章  存储器管理实验

存储器管理实验 _ 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;

Page 22: 第4章  存储器管理实验

存储器管理实验 _ 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];

Page 23: 第4章  存储器管理实验

存储器管理实验 _ 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; }

Page 24: 第4章  存储器管理实验

存储器管理实验 _ 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;

Page 25: 第4章  存储器管理实验

存储器管理实验 _ 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;}

Page 26: 第4章  存储器管理实验

存储器管理实验 _ 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

Page 27: 第4章  存储器管理实验

存储器管理实验 _ 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);

Page 28: 第4章  存储器管理实验

存储器管理实验 _ 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;}

Page 29: 第4章  存储器管理实验

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

• 4.6 4.6 程序运行程序运行

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