操作系统实验课---页面置换算法Optimal和LRU

最佳页面置换算法 Optimal,(后续出现的最少次数的替换)

最近最少使用算法 LRU

数据:

1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6

 代码:

#include <cstdio>

#include <cstring>

#include <iostream>

#include <algorithm>

using namespace std;



const int PAGE_MAX_NUM = 4;

const int LEN_MAX = 100;



void Print(const int num, const int *p, const int len){

	printf("%d :%d",num,p[0]);

	for(int i = 1; i < len; i++){

		printf(" %d",p[i]);	

	}

	printf("\n");

}



void LRU(const int *list, const int len){

	int i,lack;

	int hash[PAGE_MAX_NUM+1];

	int time[PAGE_MAX_NUM+1];

	for(i = 0; i< PAGE_MAX_NUM; i++){ hash[i] = 0; time[i] = 0;}

 

	lack = 0;

	hash[0] = list[0];

	time[0] = 1;

	Print(1,hash,4);

	for(i = 1;i < len; i++){



		for(int j = 0; j< 4; j++){

			if(hash[j] == list[i]){

				time[j] = i;

				Print(i+1,hash,4);

				break;

			}

		}

		if(j == 4)

		{

			lack ++;

			int min = 0;

			for(int j = 1;j < 4; j++){

				if(time[j] < time[min]){

					min = j;

				} 

			}

			time[min] = i;

			hash[min] = list[i];

			Print(i+1,hash,4);

		}	

	}

	printf("总共缺页 %d 次\n",lack);

}



void Optimal(const int *list, const int len){

	int i,lack;

	int hash[PAGE_MAX_NUM+1];

	int time[LEN_MAX+1];

	for(i = 0; i< PAGE_MAX_NUM; i++){ hash[i] = 0; }

	for(i = 0; i< LEN_MAX; i++){ time[i] = 0; }

	

	for(i = 0; i< len; i++){ 

		time[list[i]] ++;

	}



	lack = 0;

	hash[0] = list[0];

	time[list[0]]--;

	Print(1,hash,4);

	for(i = 1; i < len; i++){

		for(int j = 0; j< 4; j++){

			if(hash[j] == list[i]){

				Print(i+1,hash,4);

				time[list[i]]--;

				break;

			}

		}

		if(j == 4){

			lack ++;

			int min = 0;

			for(int j = 1;j < 4; j++){

				if(time[hash[j]] < time[hash[min]])

					min = j;

			}		

			hash[min] = list[i];

			time[list[i]]--;

			Print(i+1,hash,4);

		}

	}

	printf("总共缺页 %d 次\n",lack);

}



int main()

{

	int list[100];

	int a,len,flag;

	char c;

	

	len = 0;

	cout<<"请输入要访问页面的列表,用空格隔开"<<endl;

	while( scanf("%d%c", &a, &c) ){

		if( c == '\n' ){
              list[len++] = a; printf( "使用 Optimal 请按 <0>\n使用 LRU 请按 <1>\n" ); scanf("%d", &flag); if(flag == 0){ Optimal(list, len); } else if(flag == 1){ LRU(list, len); } len = 0; }else{ list[len++] = a; } } return 0; }

 

你可能感兴趣的:(操作系统)