最佳淘汰算法
```c
// C语言实现操作系统最佳淘汰算法
#include <stdio.h>
#include <stdlib.h>
#define length 20//定义数组长度
int bwoList[length];//淘汰序列
void initList(int arr[]) {//生成随机访问序列
for (int i = 0; i < length; ++i) {
int randNumber = rand() % 9 + 1;
arr[i] = randNumber;
if (i < length - 1)
printf("%d ", arr[i]);
else
printf("%d\n", arr[i]);
}
}
int findMax(int a, int b, int c) {//寻找三个数最大的元素
int max = a;
if (max < b)max = b;
if (max < c)max = c;
return max;
}
int BWO(int init[], int arr[]) {//最佳淘汰算法核心
int countLoss = 0;//统计缺页次数
int arr1 = length, arr2 = length, arr3 = length;//初始化所在位置,若访问序列有 则迭代更新
for (int i = 3; i < length; ++i) {
int flag = 0;//设定是否含有待访问标志
for (int j = 0; j < 3; ++j) {
if (arr[i] == init[j]) {
flag = 1;
break;
}
}
if (flag == 0) {//待访问序列不含有所需数字
countLoss++;//缺页次数更新
for (int j = 0; j < 3; ++j) {
for (int k = 3; k < length; ++k) {
if (init[j] == arr[k]) {//寻找最远或者再未出现的元素
if (j == 0) {
arr1 = k;
break;
}
if (j == 1) {
arr2 = k;
break;
}
if (j == 2) {
arr3 = k;
break;
}
}
}
}
int max = findMax(arr1, arr2, arr3);
if (arr1 == max) {
init[0] = arr[i];
bwoList[i] = arr[i];
continue;
}
if (arr2 == max) {
init[1] = arr[i];
bwoList[i] = arr[i];
continue;
}
if (arr3 == max) {
init[2] = arr[i];
bwoList[i] = arr[i];
continue;
}
}
}
return countLoss;
}
int main() {
printf("\t欢迎来到最佳淘汰算法\n");
printf("随机生成的访问序列为:");
int arr[length];//存储随机访问序列
initList(arr);
int init[3];//存储预先装入序列
int countLoss;//计算缺页次数
for (int i = 0; i < 3; ++i) {
init[i] = arr[i];
arr[i] = 0;//表示该序列已访问
}
countLoss = BWO(init, arr);
printf("--淘汰序列为:");
int size = sizeof(bwoList) / sizeof(int);
for (int i = 0; i < size; ++i) {
if (i < size - 1 && bwoList[i] != 0) {
printf("%d-->", bwoList[i]);
} else if (bwoList[i] != 0) {
printf("%d\n", bwoList[i]);
}
}
printf("--缺页率为:%.2lf%%", (1.0 * countLoss / length) * 100);
}