More Related Content Similar to 第4章 存储器管理实验 (20) 第4章 存储器管理实验7. #ifndef _PAGECONTROL_H #define _PAGECONTROL_H class 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; }; 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; } 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; } 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;} 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]; 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;} 27. #include <iostream> #include <string> #include <vector> #include <cstdlib> #include <cstdio> #include <unistd.h> using namespace std; #define INVALID -1 const 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<<"";} return 0;}