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<