虛存管理頁面置換算法 — FIFO和RUL算法模擬實現


本篇博文為追憶以前寫過的算法系列第一篇(20081021)

溫故知新


目的: 為了解決內存容量有限與多作業執行的沖突。運用了虛擬存儲技術。能從邏輯上對內存進行擴充,達到擴充內存的效果。分頁存儲管理是實現虛擬存儲的一種方案。通過模擬算法的實驗。加深理解,虛擬存儲器的基本原理和方法。


要求: 1.請求分頁的置換算法(FIFO && RUL算法實現);2.按給定的順序列,輸出頁面調度過程包含命中 / 缺頁,調入/調出;3.計算缺頁率,頻率。


說明

vp_list[N]        //訪問序列
bs[M]             //內存塊表,M為內存塊大小
struct pt{
	int pno;       //頁號
	int bno;       //塊號
	int flag;       //狀態位,為0時在不內存。為1時在內存
    int order;      //優先序號
};


算法流程:

程序:

/* gujinjin 08/10/20 */
/* 程序名稱:fifo &&LRU */
/* 程序目的:頁面置換算法的FIFO編程實現 */

#include<iostream>
using namespace std;

#define N 20 //訪問序列數組大小
#define M 10  //內存塊表數組大小

struct pt{
	int pno;	//頁號
	int bno;	//塊號
	int flag;	//狀態位,為0時在不內存,為1時在內存
	int order;	//優先序列
};

/*------------------------------------------*/
/*輸入函數*/
/*------------------------------------------*/
void input(int *a,int n)
{
	for(int i=0;i<n;i++){cin>>*a;a++;}
}

/*------------------------------------------*/
/*輸出函數*/
/*------------------------------------------*/
void output(int *a,int n)
{
	for(int i=0;i<n;i++){cout<<*a<<'\t';a++;}
	cout<<'\n';
}

/*------------------------------------------*/
/*算法fifo && LRU函數*/
/*------------------------------------------*/
void fifo(int*vp_list,int*bs,int n,int m)
{
	pt ptlist[N];//定義結構數組
	

	int k=0,flag,cn=0,i,j;//cn——統計缺頁數
	for(j=0;j<m;j++)//賦初值
	{
		bs[j]=0;
	}

	for(i=0;i<n;i++)// 訪問序列循環
	{
		flag=0;
		for(j=0;j<m;j++)
			if(vp_list[i]==bs[j]){flag=1;break;}
		if(flag==1)//命中
		{
			ptlist[i].bno =j+1;
			ptlist[i].flag =1;
			ptlist[i].pno =vp_list[i];
		}
		else{
			ptlist[i].flag =0;
			ptlist[i].pno =vp_list[i];

			bs[k]=vp_list[i];
			ptlist[i].bno =k+1;
			k=(k+1)%m;//取模——循環隊列
			cn++;
		}
	}
	cout<<"FIFO算法:\n";
	cout<<"----------------------------------**\n";
	cout<<"缺頁率為:"<<'\t'<<(float)cn/n<<'\n';
	cout<<"-------------------------------------------------------------------**\n";
	cout<<"序列號\n";
	cout<<"-------------------------------------------------------------------**\n";
	for(i=0;i<m;i++)
	{
		cout<<vp_list[i]<<"\t缺頁!\t"<<"直接存入內存塊!\n";
	    cout<<"-------------------------------------------------------------------**\n";
	}
	for(i=m;i<n;i++)
	{
		if(ptlist[i].flag ==0)
			cout<<vp_list[i]<<"\t缺頁!\t"<<"調出------塊號為"<<ptlist[i].bno <<"--頁號為"<<ptlist[i].pno <<'\n';
		else cout<<vp_list[i]<<"\t命中!"<<"\t位置------塊號為"<<ptlist[i].bno <<"--頁號為"<<ptlist[i].pno <<'\n';;
		cout<<"-------------------------------------------------------------------**\n";
	}
}
void LRU(int*vp_list,int*bs,int n,int m)
{  
	//----------------------------------------------------------------------------------------------**
    pt ptlist_LRU[N];
	int k=0,flag,cn=0,i,j;//cn——統計缺頁數
	int com;
	for(j=0;j<m;j++)//賦初值
	{
		bs[j]=0;
	}
	for(j=0;j<n;j++)ptlist_LRU[j].order =0;

	for(i=0;i<n;i++)// 訪問序列循環
	{
		flag=0;
		for(j=0;j<m;j++)
			if(vp_list[i]==bs[j]){flag=1;break;}
		if(flag==1)//命中
		{
			ptlist_LRU[i].bno =j+1;
			ptlist_LRU[i].flag =1;
			ptlist_LRU[i].pno =vp_list[i];
			ptlist_LRU[i].order--;
			com=ptlist_LRU[i].order;
			for(j=0;j<m;j++)
				if(ptlist_LRU[j].order <com)
				{com=ptlist_LRU[j].order;k=ptlist_LRU[j].bno ;}
		}

		else{
			ptlist_LRU[i].flag =0;
			ptlist_LRU[i].pno =vp_list[i];

			bs[k]=vp_list[i];
			ptlist_LRU[i].bno =k+1;

			if(i<m)k=(k+1)%m;
			cn++;
		}
	}
	cout<<"LRU*算法:\n";
    cout<<"----------------------------------**\n";
	cout<<"缺頁率為:"<<'\t'<<(float)cn/n<<'\n';
	cout<<"-------------------------------------------------------------------**\n";
	cout<<"序列號\n";
	cout<<"-------------------------------------------------------------------**\n";
	for(i=0;i<m;i++)
	{
		cout<<vp_list[i]<<"\t缺頁!\t"<<"直接存入內存塊!\n";
	    cout<<"-------------------------------------------------------------------**\n";
	}
	for(i=m;i<n;i++)
	{
		if(ptlist_LRU[i].flag ==0)
			cout<<vp_list[i]<<"\t缺頁!\t"<<"調出------塊號為"<<ptlist_LRU[i].bno <<"--頁號為"<<ptlist_LRU[i].pno <<'\n';
		else cout<<vp_list[i]<<"\t命中!"<<"\t位置------塊號為"<<ptlist_LRU[i].bno <<"--頁號為"<<ptlist_LRU[i].pno <<'\n';;
		cout<<"-------------------------------------------------------------------**\n";
	}
}
	
/*------------------------------------------*/
/*主函數*/
/*------------------------------------------*/
void main()
{
	int vp_list[N],bs[M];//定義訪問序列數組和內存塊表數組
	int n,m,choose;
	cout<<"輸入序列個數:\n";
	cin>>n;
	cout<<"輸入內存塊大小:\n";
	cin>>m;
	cout<<"請輸入訪問序列:\n";
	input(vp_list,n);
	cout<<"選FIFO算法輸入1,選LRU*算法輸入2:";
	cin>>choose;

	cout<<"訪問序列:"<<endl;
	output(vp_list,n);
	cout<<"**----------------------------------------**";
	cout<<'\n';
	if(choose==1)
	fifo(vp_list,bs,n,m);//調用fifo函數
	if(choose==2)
	LRU(vp_list,bs,n,m);
}

結果演示:







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM