赞
踩
优点:
实现简单:页面按进入内存的时间排序,淘汰队头页面。
缺点:
进程只有按顺序访问地址空间时页面命中率才最理想。
异常现象:对于一些特定的访问序列,随分配的页框增多,缺页率反而增加!
1.编写所需库函数
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
2.设置相关全局变量
#define commandnumber 640 //指令个数
#define MAXRAM 32//内存最大值
int command[commandnumber];//命令
char page[commandnumber];//页
char RAM[MAXRAM];//内存
3.FIFO算法编写
int FIFO(char page[], int pageNum, int use) { for (int i = 0; i < use; i++) { RAM[i] = NULL; } int count = 0; int location = 0; for (int i = 0; i < pageNum; i++) { bool flag = true; for (int j = 0; j < use; j++) { if (RAM[j] == page[i]) { flag = false; break; } } if (flag == true) { count++; RAM[location] = page[i]; location = (location + 1) % use; } } return count; }
通过输入命令页面流,命令页面流长度以及分配的页面数进行FIFO算法。
主要首先使用一个bool值进行是否缺页的记录。
并使用缺页淘汰机制,淘汰在内存中停留最久的页面。
4.LRU算法编写
int LRU(char page[], int pageNum, int use) { for (int i = 0; i < use; i++) { RAM[i] = NULL; } int lasttime[MAXRAM] = { 0 }; int count = 0; for (int i = 0; i < pageNum; i++) { for (int t = 0; t < use; t++) { lasttime[t]++; } bool flag = true; for (int j = 0; j < use; j++) { if (RAM[j] == page[i]) { flag = false; lasttime[j] = 0; break; } } if (flag == true) { count++; int x = 0; int distance = 0; for (int j = 0; j < use; j++) { if (RAM[j] == NULL) { x = j; break; } if (lasttime[j] > distance) { distance = lasttime[j]; x = j; } } RAM[x] = page[i]; } } return count; }
通过输入命令页面流,命令页面流长度以及分配的页面数进行LRU算法。
用lasttime数组记录上次使用页的时间。
而后会把lasttime数组之中停留最久的页面清除,每次匹配正确后都会把该页面的lasttime值重置为0,因为其已经使用过了。
5.命令生成函数编写
for (int i = 0; i < commandnumber; i++)
{
command[i] = rand() % 260;
page[i] = command[i] / 10 + 'A';
}
命令共有260种,页有26种,为A-Z
6.主函数编写
float sum[3] = { 0 };
for (int i = 0; i < 5; i++)
{
initialize();
sum[1] += FIFO(page, commandnumber, num_of_box);
sum[2] += LRU(page, commandnumber, num_of_box);
}
sum[1] /= 5;
sum[2] /= 5;
printf(" %d\t |\t %.2f\t %.2f%%\t |\t %.2f\t %.2f%%\t |\t\n",num_of_box, sum[1], (float)(100 * ((float)sum[1] / (float)commandnumber)), sum[2], (float)(100 * ((float)sum[2] / (float)commandnumber)));
通过一个数组计算缺页次数,每次操作六次,并计算其平均值。
#include<stdio.h> #include<time.h> #include<stdlib.h> #define commandnumber 640 #define MAXRAM 32 int command[commandnumber]; char page[commandnumber]; char RAM[MAXRAM]; int FIFO(char page[], int pageNum, int use) { for (int i = 0; i < use; i++) { RAM[i] = NULL; } int count = 0; int location = 0; for (int i = 0; i < pageNum; i++) { bool flag = true; for (int j = 0; j < use; j++) { if (RAM[j] == page[i]) { flag = false; break; } } if (flag == true) { count++; RAM[location] = page[i]; location = (location + 1) % use; } } return count; } int LRU(char page[], int pageNum, int use) { for (int i = 0; i < use; i++) { RAM[i] = NULL; } int lasttime[MAXRAM] = { 0 }; int count = 0; for (int i = 0; i < pageNum; i++) { for (int t = 0; t < use; t++) { lasttime[t]++; } bool flag = true; for (int j = 0; j < use; j++) { if (RAM[j] == page[i]) { flag = false; lasttime[j] = 0; break; } } if (flag == true) { count++; int x = 0; int distance = 0; for (int j = 0; j < use; j++) { if (RAM[j] == NULL) { x = j; break; } if (lasttime[j] > distance) { distance = lasttime[j]; x = j; } } RAM[x] = page[i]; } } return count; } void initialize() { for (int i = 0; i < commandnumber; i++) { command[i] = rand() % 260; page[i] = command[i] / 10 + 'A'; } } int main() { srand((unsigned)time(NULL)); int num_of_box = 7; printf("\t\t\t FIFO\t\t\t LRU\n"); printf("分配页框数 | 平均缺页次数\t平均缺页率 | 平均缺页次数\t平均缺页率\n"); for (; num_of_box <= MAXRAM; num_of_box++) { float sum[3] = { 0 }; for (int i = 0; i < 6; i++) { initialize(); sum[1] += FIFO(page, commandnumber, num_of_box); sum[2] += LRU(page, commandnumber, num_of_box); } sum[1] /= 6; sum[2] /= 6; printf(" %d\t |\t %.2f\t %.2f%%\t |\t %.2f\t %.2f%%\t |\t\n", num_of_box, sum[1], (float)(100 * ((float)sum[1] / (float)commandnumber)), sum[2], (float)(100 * ((float)sum[2] / (float)commandnumber))); } getchar(); }
本篇文章对页面淘汰算法进行了简单介绍和实现。
有任何问题都可以在评论区和我交流~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。