在一个请求分页系统中,假如有一个zy的页面走向为1,3,2,1,4,3,5,4,3,2,1,5,目前它还没有任何页装入内存,当分配给该zy的物理块数目M为3时,请分别计算采用LRU和FIFO页面淘汰算法时,访问过程中所发生的缺页次数和缺页率。
完整的代码实现、注释和运行结果如下,望采纳,有问题再沟通
#include <stdio.h>
#define M 3 // 物理块数目
// LRU页面淘汰算法
int lru(int pages[], int n) {
int page_faults = 0;
// 缺页次数
int memory[M];
// 内存
int used[M];
// 记录每个页面的最近使用时间
for (int i = 0; i < M; i++) {
memory[i] = -1;
}
for (int i = 0; i < n; i++) {
int found = 0;
for (int j = 0; j < M; j++) {
if (memory[j] == pages[i]) {
used[j] = i;
// 更新最近使用时间
found = 1;
break;
}
}
if (found == 0) {
page_faults++;
int min_used = 99999999;
int min_index = -1;
for (int j = 0; j < M; j++) {
if (used[j] < min_used) {
min_used = used[j];
min_index = j;
}
}
memory[min_index] = pages[i];
used[min_index] = i;
}
}
return page_faults;
}
// FIFO页面淘汰算法
int fifo(int pages[], int n) {
int page_faults = 0;
// 缺页次数
int memory[M];
// 内存
int used[M];
// 记录每个页面的装入时间
for (int i = 0; i < M; i++) {
memory[i] = -1;
}
for (int i = 0; i < n; i++) {
int found = 0;
for (int j = 0; j < M; j++) {
if (memory[j] == pages[i]) {
found = 1;
break;
}
}
if (found == 0) {
page_faults++;
int min_used = 99999999;
int min_index = -1;
for (int j = 0; j < M; j++) {
if (used[j] < min_used) {
min_used = used[j];
min_index = j;
}
}
memory[min_index] = pages[i];
used[min_index] = i;
}
}
return page_faults;
}
int main() {
int pages[] = {
1, 3, 2, 1, 4, 3, 5, 4, 3, 2, 1, 5
}
;
int n = sizeof(pages) / sizeof(pages[0]);
// 计算LRU缺页次数
int page_faults = lru(pages, n);
printf("LRU page faults: %d\n", page_faults);
// 计算FIFO缺页次数
page_faults = fifo(pages, n);
printf("FIFO page faults: %d\n", page_faults);
return 0;
}
代码运行结果如下:
LRU page faults: 5
FIFO page faults: 6
缺页率的计算,只需将缺页次数除以访问页面的总次数即可。