#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);
}
理想型算法(OPT)虚拟存储管理页面淘汰算法(C)
最新推荐文章于 2024-01-18 10:50:56 发布