FIFO算法
优点:
实现简单:页面按进入内存的时间排序,淘汰队头页面。
缺点:
进程只有按顺序访问地址空间时页面命中率才最理想。
异常现象:对于一些特定的访问序列,随分配的页框增多,缺页率反而增加!
LRU算法
实现
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();
}
总结
本篇文章对页面淘汰算法进行了简单介绍和实现。
有任何问题都可以在评论区和我交流~~