页面置换算法(FIFO/LRU/OPT)

编写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;
}

// FIFO 页面置换算法
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);
}

// LRU 页面置换算法
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);
}

// OPT 页面置换算法
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;
}


//gcc -o page_replacement page_replacement.c
//./page_replacement

猜你喜欢

转载自blog.csdn.net/qq_54226199/article/details/130735470
今日推荐