1. 程式人生 > 其它 >頁面置換演算法--先進先出頁面置換

頁面置換演算法--先進先出頁面置換

技術標籤:作業系統作業系統

#include "stdio.h"
#include "stdlib.h" 
typedef struct item
{	int num;		//頁號	
    int time;		//等待時間,LRU演算法會用到這個屬性
}Pro; 
int pageNum;		//系統分配給作業的主存中的頁面數
int memoryNum;		//可用記憶體頁面數 

void print(Pro *page1);		//列印當前主存中的頁面
int  Search(int num1, Pro *memory1);	//在頁面集memory1中查詢num1,如果找到,返回其在memory1中的下標,否則返回-1 
int main(void)
{	int i;	
    int curmemory;		//調入記憶體中的頁面個數	
	int missNum;		//缺頁次數	
	float missRate;		//缺頁率	
	char c;				//得到使用者的輸入字元,來選擇相應的置換演算法 	
	Pro *page;			//作業頁面集	
	Pro *memory;		//記憶體頁面集 	
	printf("輸入系統分配給作業的主存中的頁面數:");	
	scanf("%d", &pageNum);	
	printf("輸入記憶體頁面數:");	
	scanf("%d", &memoryNum); 	
	page = (Pro*)malloc(sizeof(Pro)*pageNum);	
	memory = (Pro*)malloc(sizeof(Pro)*memoryNum); 	
	for (i = 0; i<pageNum; i++)	
	{		
	        printf("第 %d 個頁面號為:", i);		
	        scanf("%d", &page[i].num);		
	        page[i].time = 0;			//等待時間開始預設為0	
	} 
		
	do {		
	       for (i = 0; i<memoryNum; i++)		//初始化記憶體中頁面		
	       {			memory[i].num = -1;				//頁面為空用-1表示			
		                memory[i].time = -1;				//		
		   } 		
		   printf("*****f:FIFO頁面置換*****\n");		
		   printf("*****o:OPT頁面置換*****\n");		
		   printf("*****l:LRU頁面置換*****\n");		
		   printf("*****請選擇操作型別(f,o,l),按其它鍵結束******\n");		
		   //fflush(stdin);		
		   getchar();		
		   scanf("%c", &c); 		
		   i = 0;		
		   curmemory = 0; 		
		   if (c == 'f')			//FIFO頁面置換		
		   {			
		             missNum = 0; 			 
					 printf("FIFO頁面置換情況:   \n");			
					 for (i = 0; i<pageNum; i++)			
					 {				
					      if (Search(page[i].num, memory)<0)//若在記憶體中沒有找到該頁面				
						     {
						  					missNum++;					
											memory[curmemory].num = page[i].num;					
											print(memory);					
											curmemory = (curmemory + 1) % memoryNum;   //找出最先進入記憶體的頁面				
											}			}//end for			
											missRate = (float)missNum / pageNum;			
											printf("缺頁次數:%d   缺頁率:  %f\n", missNum, missRate); 		
							}//end if 		
							if (c == 'o')			//OPT頁面置換演算法		
							{			
							missNum = 0;			
							curmemory = 0; 			
							printf("Optimal頁面置換情況:   \n");			
							for (i = 0; i<pageNum; i++)			
							{				
							if (Search(page[i].num, memory) < 0)//若在記憶體中沒有找到該頁面				
							{ 					//找出未來最長時間內不再被訪問的頁面					
							int tem;					
							int opt = 0;					
							for (int k = 0; k < memoryNum; k++)					
							{						
							if (memory[k].num == -1)						
							{							
							curmemory = k;							
							break;						
							}					
								tem = 0;       //頁面k在未來tem時間內不會出現						
								int j;						
								for (j = i+1; j < pageNum; j++)						
								{							
								if (page[j].num == memory[k].num)							
								{								
								if (tem > opt)								
								{									
								opt = tem;									
								curmemory = k;								
								}								
								break;							
								}							
								else tem++;						
								}						
								if (j == pageNum)						
								{							
								opt = tem;							
								curmemory = k;						
								}					
								} 					
								missNum++;					
								memory[curmemory].num = page[i].num;					
								print(memory);				
								}			
								}//end for			
								missRate = (float)missNum / pageNum;				
								printf("缺頁次數:%d   缺頁率:  %f\n", missNum, missRate); 		
								}//end if 		
								if (c == 'l')			//LRU頁面置換演算法		
								{			missNum = 0;			
								curmemory = 0; 			
								printf("LRU頁面置換情況:   \n");		
								for (i = 0; i<pageNum; i++)			
								{				
								int rec=Search(page[i].num, memory);				
								if (rec < 0)    //若在記憶體中沒有找到該頁面				
								{					
								missNum++;					
								for (int j = 0; j<memoryNum; j++)     //找出最近最久未使用的頁面						
								if (memory[j].time == -1) {							
								curmemory = j; break;						
								}						
								else if (memory[j].time > memory[curmemory].time)							
								curmemory = j; 					
								memory[curmemory].num = page[i].num;					
								memory[curmemory].time = 0;					
								print(memory); 				
								}				
								else memory[rec].time = 0; 				
								for (int j = 0; j<memoryNum; j++)     //記憶體中的所有頁面等待時間+1						
								if (memory[j].num != -1)						
								memory[j].time++; 			
								}//end for			
								missRate = (float)missNum / pageNum;			
								printf("缺頁次數:%d   缺頁率:  %f\n", missNum, missRate);		
								}//end if 	
								} while (c == 'f' || c == 'l' || c == 'o');  	
								return 0;
								} 
								 void print(Pro *memory1)//列印當前的頁面
								 {	int j; 	for (j = 0; j<memoryNum; j++)	
								 	printf("%d ", memory1[j].num);
									 	printf("\n");
										 } 
//在頁面集memory1中查詢num1,如果找到,返回其在memory1中的下標,否則返回-1
int  Search(int num1, Pro *memory1)
{	
int j; 	
for (j = 0; j<memoryNum; j++)	
{		
if (num1 == memory1[j].num)			
return j;	
}	
return -1;
}

一、實驗內容

上機程式設計實現頁面置換演算法—先進先出置換演算法。

此演算法的實質是,總是選擇在主存中居留最長時間的頁面淘汰。

理由是:最早調入主存的頁,其不再被訪問的可能性最大。

二、實施步驟

程式碼分析如下:

一個作業有多少個程序,處理機只分配固定的主存頁面供該作業執行。

往往頁面數小於程序數,當請求調頁程式調進一個頁面時,可能碰到主存中並沒有空閒塊的情況,此時就產生了在主存中淘汰哪個頁面的情況。

本實驗通過編寫頁面置換演算法程式,瞭解頁面在記憶體當中依賴不同的頁面置換演算法所產生的置換過程是不一樣的。

實驗步驟

假設系統為某程序分配了三(或者4個、5個…)個物理塊,頁面引用

串(一共是20個頁面),分別為:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1。執行程式後介面顯示FIFO演算法的置換圖,並計算FIFO演算法的缺頁率。

程式設計實現演算法,可以得到利用FIFO置換演算法時的置換圖如下: