操作系統頁面置換模擬算法實現(C語言版)

目錄

一、實驗內容

二、LRU算法

三、代碼實現

四、運行結果


一、實驗內容

熟悉頁面置換的算法,編寫LRU置換算法

  • 假定一個能夠存放M個頁面的內存,當發生缺頁時,調入一個頁面,通過LRU算法求出應該置換出的頁面號。輸入一連串的頁面號,程序自動選擇調出的頁面並計算缺頁率。
  • LRU算法的實現要歸功於一個寄存器。

二、LRU算法

思想:利用局部性原理,根據一個進程在執行過程中過去的頁面訪問蹤跡來推測未來的行爲。認爲過去一段時間裏不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。即利用“最近的過去”預測“最近的將來”。        

選擇最近一段時間內最久不用的頁面予以淘汰。性能接近最佳算法。

三、代碼實現

#include<stdio.h>

/*數據結構*/
int block_num;   /*分配的物理塊數*/
int page_num;   /*要訪問的頁面序列個數*/
int page[100]; /*要訪問的頁面序列*/
int memory[10]; /*物理塊中的頁號*/
int table[100][10]; /*顯示矩陣*/
int reg[10];  /*寄存器--記錄頁面的訪問時間*/
char Que[100];  /*數組,記錄是否缺頁*/

/*主函數*/
int main()
{	
    int count=0; /*記錄缺頁次數*/    
    int i,j,k;

	printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
	printf("|               實驗四:LRU頁面置換算法          |\n");
	printf("|                                                |\n");
    printf("|                 學號:***********              |\n");
	printf("|                 姓名:******                   |\n");
	printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
	
	while(1) 
	{
		printf("請輸入分配的物理塊的個數(M<=10):\n");
		scanf("%d",&block_num);
		if(block_num>10)
			printf("輸入不合法,請重新輸入"); 
		printf("\n");
		break;
	}
		
	while(1)
	{
		printf("請輸入要訪問的頁面序列個數(P<=100):\n");
		scanf("%d",&page_num);			
		if(page_num>100)
			printf("輸入不合法,請重新輸入");
		printf("\n");
		break;
	}
	
	printf("請依次輸入要訪問的頁面序列,以空格隔開:\n");
	for(i=0;i<page_num;i++)
	{
		scanf("%d",&page[i]);
		Que[i] = 'N';
	}
		 	
	for(i=0;i<block_num;i++)
	     memory[i]=-1;   //初始內存塊中默認爲空,用-1表示

    //訪問頁面
	for(i=0;i<page_num;i++)
	{
		if(i==0)   //訪問的第一個頁面
		{
			memory[i]=page[i];
			reg[i]=i;
			for(j=0;j<block_num;j++)
				table[i][j]=memory[j];
			Que[i]='Y';
			count++;
		}
		else
		{    /*判斷新頁面號是否在物理塊中*/   
			for(j=0,k=0;j<block_num;j++)
			{
				if(memory[j]!=page[i])
					k++;
				else
				{    /*新頁面在內存塊中*/
					reg[j]=i;  //刷新該頁面的訪問時間
					for(int n=0;n<block_num;n++)
						table[i][n]=memory[n];
				}
			}
		}
		if(k==block_num)   /*新頁面不在物理塊中,缺頁*/
		{
			int q=0;
			Que[i]='Y';
		    count++;
			for(int j=0;j<block_num;j++)
			{
				if(memory[j]==-1)   /*內存塊未滿*/
				{
					memory[j]=page[i];
				    reg[j]=i;
				    for(int n=0;n<block_num;n++)
					    table[i][n]=memory[n]; 
					break;
				}
				else   
					q++;	
			}
			if(q==block_num)/*內存塊已滿,需採用LRU置換算法選擇換出頁*/ 
			{
			    int min=0;  //記錄換出頁
        	    for(int m=1;m<block_num;m++)
			        if(reg[m]<reg[min])
				    	min=m;
		        memory[min]=page[i];
                reg[min]=i; /*記錄該頁的訪問時間(新到的頁面進入之前min的位置,需將min位置的訪問時間更改)*/
                for(int n=0;n<block_num;n++)
			       table[i][n]=memory[n];
			}
		}
    }
    
 	/*輸出運行過程及結果*/   
	printf("採用LRU頁面置換算法結果如下: \n");
	printf("\n");
	printf("\n");
	printf("頁號:");
	for(i=0;i<page_num;i++)
		printf("%3d",page[i]);
	printf("\n");
	printf("-----------------------------------------------------\n");
	for(i=0;i<block_num;i++) 	
	{
		printf("塊%2d:",i);	 
		for(j=0;j<page_num;j++)
			printf("%3d",table[j][i]);
		printf("\n");
	}
    printf("-----------------------------------------------------\n");
	printf("缺頁:");
	for(i=0;i<page_num;i++)
	    printf("%3c",Que[i]);
	printf("\n");
	
	printf("-----------------------------------------------------\n");
	printf("\t缺頁次數:%d\n",count);
	printf("\t缺頁率:%d/%d\n",count,page_num);
	printf("-----------------------------------------------------\n");
}

四、運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章