www.pudn.com > ahei@PageReplace.rar > PageChange.cpp
// PageChange.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "PageChange.h" #include#include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object using namespace std; //颜色 #define CLR_GREEN 10 //绿 #define CLR_RED 12 //红 #define CLR_SECRED 13 //次红 #define CLR_YELLOW 14 //黄 #define CLR_IN CLR_RED //输入颜色 #define CLR_NORMALOUT CLR_GREEN //一般输出颜色 #define CLR_CRITICALOUT CLR_RED //重要输出颜色 #define CLR_NORMALRESULT CLR_YELLOW //一般结果输出颜色 #define CLR_CRITICALRESULT CLR_RED //重要结果输出 #define CLR_SECCRITICALRESULT CLR_SECRED //次重要结果输出 //声音类型 #define CB_ERROR 0 //错误 #define CB_OK 1 //正确 #define MAXACCESSPAGECNT 20 //最大访问页面数 #define MINACCESSPAGECNT 10 //最小访问页面数 #define INFINITTIME MAXACCESSPAGECNT #define MAXSLEEPTIME 500 //最大暂停时间 #define RANDDF rand()*1.0/RAND_MAX //产生0~1之间的随机小数 struct PAGE_LFU; typedef int PAGE; //页面 typedef list
PAGEL; //页面访问链表 typedef list PAGEL_LFU; enum PRA { Optimal, //最佳 FIFO, //先进先出 LRU, //最近最久未使用 LFU, //最少使用 }; struct PAGE_LFU { PAGE page; //页面 int nAccessedCnt; //被访问的次数 operator ==(PAGE_LFU pageLFU) { return page==pageLFU.page && nAccessedCnt==pageLFU.nAccessedCnt; } }; void AboutMe(); //关于 void Exit(); //退出系统 BOOL CtrlHandler(DWORD dwCtrlType); //处理控制台事件 void Clean(); //事后清理 void CoolBeep(UINT uiCbSort); //非常酷的蜂鸣声 void PageCntSet(); //配置内存最大页面数 void PressAnyKey(); void AnimatePrint(char* pStr); DWORD WINAPI GetRandEvent(LPVOID lpParam); void Reset(); void Test(); void Replace(); //置换程序 void Replace_Optimal(); void Replace_FIFO(); void Replace_LRU(); void Replace_LFU(); BOOL FindPageInPageL(PAGEL pageL,PAGE page); //在页面链表里查找页面 BOOL FindPageInPageL_LFU(PAGEL_LFU pageL,PAGE_LFU page); //在页面链表里查找页面 PAGE_LFU GetReplacePage_LFU(PAGEL_LFU pageLMem); //得到要置换的页面 PAGE GetReplacePage_Optimal(PAGEL::iterator pStart,PAGEL listPAccess,PAGEL listMem); //得到要置换的页面 int GetPageAccessedTime(PAGEL::iterator pStart,PAGE page,PAGEL listPAccess); //得到页面将被访问的时间 HANDLE g_hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); PAGEL g_listPageAccess; //被访问页面链表 PAGEL g_listPageMemory; //内存中的页面链表 PAGEL_LFU g_listPageMemory_LFU; //内存中的页面链表 PRA g_algoPageReplace; //页面置换算法 BOOL g_bIsEnd; //是否结束 int g_nLackPageCnt; //缺页次数 int g_nPageAccessCnt; //请求的页面数 int g_nMaxPageCnt=3; //内存最大页面数 CRITICAL_SECTION g_CriticalSection; //临界区 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } char cSel;//选择号 srand(time(0)); SetConsoleTitle("页面置换算法演示及其性能测试系统");//设置标题 SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler,TRUE); InitializeCriticalSection(&g_CriticalSection); Select: SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT); cout< '8') { if(cSel==27) { cout< dwCursorPosition.X-1; dwCursorPostion.Y=lpConsoleScreenBufferInfo->dwCursorPosition.Y; SetConsoleCursorPosition(g_hStdOut,dwCursorPostion); FillConsoleOutputCharacter(g_hStdOut,' ',1,dwCursorPostion,0); goto Input; } cout< GetPageAccessedTime(pStart,pageReplace,listPAccess)) pageReplace=*p; } return pageReplace; } //得到要置换的页面 PAGE_LFU GetReplacePage_LFU(PAGEL_LFU pageLMem) { PAGE_LFU pageLFU=*pageLMem.begin(); PAGEL_LFU::iterator p; for(p=pageLMem.begin();p!=pageLMem.end();p++) { if((*p).nAccessedCnt '6') { if(cSel==27) { cout< dwCursorPosition.X-1; dwCursorPostion.Y=lpConsoleScreenBufferInfo->dwCursorPosition.Y; SetConsoleCursorPosition(g_hStdOut,dwCursorPostion); FillConsoleOutputCharacter(g_hStdOut,' ',1,dwCursorPostion,0); goto Input; } cout< >pageIn; if(pageIn!=-1) { g_listPageAccess.push_back(pageIn); goto InputPage; } if(g_algoPageReplace==Optimal) Replace_Optimal(); else { g_nPageAccessCnt=g_listPageAccess.size(); g_bIsEnd=TRUE; Replace(); } } //在页面链表里查找页面 BOOL FindPageInPageL(PAGEL pageL,PAGE page) { PAGEL::iterator p; for(p=pageL.begin();p!=pageL.end();p++) { if((*p)==page) return TRUE; } return FALSE; } //在页面链表里查找页面 BOOL FindPageInPageL_LFU(PAGEL_LFU pageL,PAGE_LFU page) { PAGEL_LFU::iterator p; for(p=pageL.begin();p!=pageL.end();p++) { if((*p).page==page.page) return TRUE; } return FALSE; } //事后清理 void Clean() { DeleteCriticalSection(&g_CriticalSection); } //配置内存最大页面数 void PageCntSet() { SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT); cout<<"请输入最大内存页面数(正整数):"; Input: SetConsoleTextAttribute(g_hStdOut,CLR_IN); cin>>g_nMaxPageCnt; if(g_nMaxPageCnt<0) { SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALOUT); cout<