编写C语言程序,模拟页面置换算法(FIFO/LRU/OPT),使用gcc编译并运行
#include <stdio.h>
#define FRAME_SIZE 3
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void fifo(int pages[], int num_pages) {
int frames[FRAME_SIZE];
int frame_index = 0;
int page_faults = 0;
for (int i = 0; i < FRAME_SIZE; i++) {
frames[i] = -1;
}
for (int i = 0; i < num_pages; i++) {
int page = pages[i];
int page_found = 0;
for (int j = FRAME_SIZE-1; j >=0; j--) {
if (frames[j] == page) {
int value = frames[j];
for (int k = j; k > 0; k--) {
frames[k] = frames[k -1];
}
frames[0] = value;
page_found = 1;
break;
}
}
if (!page_found) {
for (int k = FRAME_SIZE - 1; k > 0; k--) {
frames[k] = frames[k - 1];
}
frames[0] = page;
; frame_index = (frame_index + 1) % FRAME_SIZE;
page_faults++;
}
printf("Page %d: ", page);
for (int j = 0; j < FRAME_SIZE; j++) {
if (frames[j] == -1) {
printf("- ");
}
else {
printf("%d ", frames[j]);
}
}
printf("\n");
}
printf("FIFO Page Faults: %d\n", page_faults);
}
void lru(int pages[], int num_pages) {
int frames[FRAME_SIZE];
int page_faults = 0;
for (int i = 0; i < FRAME_SIZE; i++) {
frames[i] = -1;
}
int counter = 0;
int timestamps[FRAME_SIZE];
for (int i = 0; i < num_pages; i++) {
int page = pages[i];
int page_found = 0;
for (int j = 0; j < FRAME_SIZE; j++) {
if (frames[j] == page) {
page_found = 1;
timestamps[j] = counter++;
break;
}
}
if (!page_found) {
int least_recently_used = 0;
int min_timestamp = timestamps[0];
for (int j = 1; j < FRAME_SIZE; j++) {
if (timestamps[j] < min_timestamp) {
least_recently_used = j;
min_timestamp = timestamps[j];
}
}
frames[least_recently_used] = page;
timestamps[least_recently_used] = counter++;
page_faults++;
}
printf("Page %d: ", page);
for (int j = 0; j < FRAME_SIZE; j++) {
if (frames[j] == -1) {
printf("- ");
}
else {
printf("%d ", frames[j]);
}
}
printf("\n");
}
printf("LRU Page Faults: %d\n", page_faults);
}
void opt(int pages[], int num_pages) {
int frames[FRAME_SIZE];
int page_faults = 0;
for (int i = 0; i < FRAME_SIZE; i++) {
frames[i] = -1;
}
for (int i = 0; i < num_pages; i++) {
int page = pages[i];
int page_found = 0;
for (int j = 0; j < FRAME_SIZE; j++) {
if (frames[j] == page) {
page_found = 1;
break;
}
}
if (!page_found) {
int replace_index = -1;
int farthest_page_index = -1;
for (int j = 0; j < FRAME_SIZE; j++) {
int page_found = 0;
for (int k = i + 1; k < num_pages; k++) {
if (frames[j] == pages[k]) {
page_found = 1;
if (k > farthest_page_index) {
farthest_page_index = k;
replace_index = j;
}
break;
}
}
if (!page_found) {
replace_index = j;
break;
}
}
frames[replace_index] = page;
page_faults++;
}
printf("Page %d: ", page);
for (int j = 0; j < FRAME_SIZE; j++) {
if (frames[j] == -1) {
printf("- ");
}
else {
printf("%d ", frames[j]);
}
}
printf("\n");
}
printf("OPT Page Faults: %d\n", page_faults);
}
int main() {
int pages[] = {
4,3,2,4,1,2,3,5,4,3,2,1,5 };
int num_pages = sizeof(pages) / sizeof(pages[0]);
fifo(pages, num_pages);
printf("\n");
lru(pages, num_pages);
printf("\n");
opt(pages, num_pages);
return 0;
}