理想型算法(OPT)虚拟存储管理页面淘汰算法(C)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int indexOf(char* s, char c, int len, int i) {
    for (; i < len; i++) {
        if (s[i] == c) {
            return i;
        }
    }

    return -1;
}

// 数组整体往前移一位 最后一位用c代替
void moveForward(char *s, char c, int len) {
    len--;
    for (int i = 0; i < len; i++) {
        s[i] = s[i + 1];
    }
    s[len] = c;
}

// 将后面字符串中排前面的字符 放在数组的后面 优先释放数组队首的字符
int sort(int* arry, char* memory, int len, int max) {
    len--;
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            if (arry[j] < arry[j + 1]) {
                int temp = arry[j];
                arry[j] = arry[j + 1];
                arry[j + 1] = temp;

                char c = memory[j];
                memory[j] = memory[j + 1];
                memory[j + 1] = c;
            }
        }
    }
    
    for (int i = 0; i < len; i++) {
        if (arry[i] != max) {
            if (i == 0) {
                return len;
            }
            return i - 1;
        }
    }

    return len;
}

void replacePage(char* memory, char* s, char c, int index, int len) {
    int* arry = malloc(sizeof(int) * len);
    int sLen = strlen(s);

    // memory中的页面是否存在后续的页面访问串中
    // 如果不存在则使用FIFO算法
    int isExit = 0;

    for (int i = 0; i < len; i++) {
        int temp = indexOf(s, memory[i], sLen, index);
        if (temp == -1) {
            arry[i] = sLen;
        } else {
            arry[i] = temp;
            isExit = 1;
        }
    }

    if (isExit == 1) {
        int replaceIndex = sort(arry, memory, len, sLen);
        printf("eliminate %c \n", memory[0]);
        moveForward(memory, c, replaceIndex + 1);
    } else {
        printf("eliminate %c \n", memory[0]);
        moveForward(memory, c, len);
    }
}

void main() {
    // 进程允许拥有的页数
    int pages;
    // 页面访问字符串
    char s[100];
    printf("Number of pages allowed by the process: ");
    scanf("%d", &pages);
    printf("Please enter an access string: ");
    scanf("%s", s);


    char* memory;
    // 缺页次数
    int times = 0;
    int index = 0;

    for (int i = 0, len = strlen(s); i < len; i++) {
        char c = s[i];
        if (index < pages) {
            if (indexOf(memory, c, pages, 0) == -1) {
                memory[index] = c;
                index++;
                times++;
            }
        } else {
            if (indexOf(memory, c, pages, 0) == -1) {
                replacePage(memory, s, c, i + 1, pages);
                times++;
            }
        }
    }
    printf("Total number of page missing: %d", times);
}
点赞