c编写程序模拟页面置换算法OPT、FIFO、LRU和clock算法
时间: 2023-12-21 11:04:29 浏览: 127
以下是C语言代码实现OPT、FIFO、LRU和Clock页面置换算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define FRAME_NUM 3 // 物理帧数
#define REFERENCE_LEN 12 // 引用串长度
int reference[REFERENCE_LEN] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5}; // 引用串
// OPT页面置换算法
void opt() {
int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧
int faults = 0; // 缺页数
int i, j, k, max, flag;
for (i = 0; i < REFERENCE_LEN; i++) {
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == reference[i]) { // 命中
flag = 1;
break;
}
}
if (!flag) { // 未命中
faults++;
if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == -1) {
frames[j] = reference[i];
flag = 1;
break;
}
}
}
if (!flag) { // 物理帧已满,进行页面置换
int future[FRAME_NUM] = {0};
for (j = 0; j < FRAME_NUM; j++) {
for (k = i + 1; k < REFERENCE_LEN; k++) {
if (frames[j] == reference[k]) {
future[j] = k - i;
break;
}
}
}
max = future[0];
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (future[j] == 0) {
frames[j] = reference[i];
flag = 1;
break;
}
if (future[j] > max) {
max = future[j];
k = j;
}
}
if (!flag) {
frames[k] = reference[i];
}
}
}
// 输出物理帧情况
for (j = 0; j < FRAME_NUM; j++) {
printf("%d ", frames[j]);
}
printf("\n");
}
printf("OPT页面置换算法缺页数:%d\n", faults);
}
// FIFO页面置换算法
void fifo() {
int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧
int faults = 0; // 缺页数
int i, j, index = 0, flag;
for (i = 0; i < REFERENCE_LEN; i++) {
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == reference[i]) { // 命中
flag = 1;
break;
}
}
if (!flag) { // 未命中
faults++;
if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满
frames[index++] = reference[i];
} else { // 物理帧已满,进行页面置换
frames[index++] = reference[i];
if (index == FRAME_NUM) {
index = 0;
}
}
}
// 输出物理帧情况
for (j = 0; j < FRAME_NUM; j++) {
printf("%d ", frames[j]);
}
printf("\n");
}
printf("FIFO页面置换算法缺页数:%d\n", faults);
}
// LRU页面置换算法
void lru() {
int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧
int faults = 0; // 缺页数
int i, j, k, min, flag;
int used[FRAME_NUM] = {0}; // 页表,记录物理帧最近使用情况
for (i = 0; i < REFERENCE_LEN; i++) {
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == reference[i]) { // 命中
flag = 1;
used[j] = i + 1;
break;
}
}
if (!flag) { // 未命中
faults++;
if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == -1) {
frames[j] = reference[i];
used[j] = i + 1;
flag = 1;
break;
}
}
}
if (!flag) { // 物理帧已满,进行页面置换
min = used[0];
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (used[j] < min) {
min = used[j];
k = j;
}
if (frames[j] == -1) {
frames[j] = reference[i];
used[j] = i + 1;
flag = 1;
break;
}
}
if (!flag) {
frames[k] = reference[i];
used[k] = i + 1;
}
}
}
// 输出物理帧情况
for (j = 0; j < FRAME_NUM; j++) {
printf("%d ", frames[j]);
}
printf("\n");
}
printf("LRU页面置换算法缺页数:%d\n", faults);
}
// Clock页面置换算法
void clock() {
int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧
int faults = 0; // 缺页数
int i, j, index = 0, flag;
int used[FRAME_NUM] = {0}; // 页表,记录物理帧最近使用情况
int hand = 0; // 指针,指向下一个要替换的物理帧
for (i = 0; i < REFERENCE_LEN; i++) {
flag = 0;
for (j = 0; j < FRAME_NUM; j++) {
if (frames[j] == reference[i]) { // 命中
flag = 1;
used[j] = 1;
break;
}
}
if (!flag) { // 未命中
faults++;
if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满
frames[index++] = reference[i];
used[index - 1] = 1;
} else { // 物理帧已满,进行页面置换
while (used[hand] == 1) {
used[hand] = 0;
hand++;
if (hand == FRAME_NUM) {
hand = 0;
}
}
frames[hand] = reference[i];
used[hand] = 1;
hand++;
if (hand == FRAME_NUM) {
hand = 0;
}
}
}
// 输出物理帧情况
for (j = 0; j < FRAME_NUM; j++) {
printf("%d ", frames[j]);
}
printf("\n");
}
printf("Clock页面置换算法缺页数:%d\n", faults);
}
int main() {
printf("引用串:");
int i;
for (i = 0; i < REFERENCE_LEN; i++) {
printf("%d ", reference[i]);
}
printf("\n\n");
printf("OPT页面置换算法:\n");
opt();
printf("\n");
printf("FIFO页面置换算法:\n");
fifo();
printf("\n");
printf("LRU页面置换算法:\n");
lru();
printf("\n");
printf("Clock页面置换算法:\n");
clock();
return 0;
}
```
这个程序模拟了一个长度为12的引用串,分别使用了OPT、FIFO、LRU和Clock四种页面置换算法,并输出了每次页面置换后的物理帧情况和最终的缺页数。其中,FRAME_NUM和REFERENCE_LEN可以根据需要自行修改。
阅读全文