1. 程式人生 > >C語言作業系統——頁面置換演算法(FIFO/LRU)

C語言作業系統——頁面置換演算法(FIFO/LRU)

由於本學期學習作業系統所以需要用程式碼實現一些演算法,本人大二由於對C語言掌握的不太好,所以一直逼著自己用C語言寫程式碼,還好寫出來了,在這裡與大家分享。

首先建立一個工程檔案,本人喜歡建立一個頭檔案,一個功能檔案和一個主函式檔案。

標頭檔案,page_replace.h

#include <stdio.h>
#include <windows.h>


typedef struct Page
{
int num;//固定每一行
int mark;//幾次換頁未使用的次數
}Page;


void FIFO(int input[],int sum,int count);//先進先出置換演算法
void LRU(int input[],int sum,int count);//最久未使用置換演算法



功能檔案,page_replace.cpp

#include "page_replace.h"
#define MAX 20


void FIFO(int input[],int sum,int count)//先進先出置換演算法
{
printf("\n____________FIFO演算法_____________\n");
int sub=0;//substitution置換次數
Page frame[MAX];//頁幀(物理塊可以放的頁數)
for(int i=0;i<sum;i++)//將幾個頁放到空白物理塊中
{
frame[i].num=input[i]; 
        //sub++; 
printf("%d",frame[i].num);
printf(" | ");
for(int j=0;j<=i;j++)
printf("%d ",frame[j].num);
Sleep(500);
printf("\n");
}
for(i=sum;i<count;i++)
{
int j;
for(j=0;j<sum;j++)
{
if(input[i]==frame[j].num)//在物理塊中找到需要的頁
{
printf("%d\n",input[i]);
Sleep(500);
break;
}
}
if(j==sum)//在當前物理塊中沒有匹配的頁
{
sub++;
frame[(sub-1)%sum].num=input[i];//換掉最舊的頁
printf("%d",input[i]);
printf(" | ");
for(int k=0;k<sum;k++)
printf("%d ",frame[k].num);//列印最新的物理塊中的頁
Sleep(500);
printf("\n");
}
}
printf("FIFO演算法頁面置換的次數為:%d\n\n",sub);
}


void LRU(int input[],int sum,int count)//最久未使用置換演算法
{
printf("____________LRU演算法_____________\n");
int sub=0;
Page frame[MAX];
for(int i=0;i<sum;i++)//將幾個頁放到空白物理塊中
{
frame[i].num=input[i]; 
printf("%d",frame[i].num);
printf(" | ");
for(int j=0;j<=i;j++)
printf("%d ",frame[j].num);
Sleep(500);
printf("\n");
}
for(i=sum;i<count;i++)
{
int j;
for(j=0;j<sum;j++)
{
if(input[i]==frame[j].num)
{
printf("%d\n",input[i]);
Sleep(500);
break;
}
}
if(j==sum)//在當前物理塊中沒有找到合適的頁
{
sub++;
for(j=0;j<sum;j++)
{
frame[j].mark=0;//初始化
for(int k=0;k<=i;k++)//向前遍歷,找到最近最少使用的 
{
if(frame[j].num==input[k])
frame[j].mark=k;//會被最近使用的一次給覆蓋掉,記錄一個頁面是第幾次換頁使用的,k為下標,如果k越小說明最近很少使用
}
}
for(int d=0;d<sum;d++)
{
int x=0;
for(j=0;j<sum;j++)
{
if(frame[d].mark<=frame[j].mark)//求最小的數
x++;
}
if(x==sum)
{
frame[d].num=input[i];
break;
}


}
printf("%d",input[i]);
printf(" | ");
for(int k=0;k<sum;k++)
printf("%d ",frame[k].num);
Sleep(500);
printf("\n");
}
}
printf("LRU演算法頁面置換的次數為:%d\n",sub);

}

主函式檔案,page_replace_test.cpp

#include "page_replace.h"
#define MAX 50


void main()
{
printf("_____________頁面置換演算法______________\n");
int sum=0;//物理塊數
int input[MAX];//輸入的0-9數字串流
char ch;
int flag=1;
int i=0;
printf("請輸入物理塊數(正整數):\n");
scanf("%d",&sum);
printf("請輸入0-9的數字代表頁面號,以#結束:\n");
while(flag)
{
scanf("%c",&ch);
if(ch!='#' && ch!='\n')
{
input[i]=(int)ch-48;
i++;
}
else if(ch=='#')
flag=0;
}
int count=i;//記錄頁面個數
FIFO(input,sum,count);
LRU(input,sum,count);
}

程式碼到此結束,最後的執行結果是這樣子滴得意

謝謝大家觀看,後續還會有分享。