如何c语言实现FIFO,LRU,CLOCK,OPT替换页算法
时间: 2023-08-18 08:08:34 浏览: 205
FIFO(First-In-First-Out)页面替换算法:
```c
#define MAXSIZE 1024 // 最大页面数
int page[MAXSIZE];
int front = 0, rear = 0; // 队头和队尾
int is_exist(int p) { // 判断页面是否在内存中
for (int i = front; i < rear; i++) {
if (page[i] == p) {
return 1;
}
}
return 0;
}
void page_replace(int p) { // 页面替换函数
if (rear < MAXSIZE) {
page[rear++] = p;
} else {
page[front++] = p;
if (front == MAXSIZE) {
front = 0;
}
}
}
int main() {
int n, m, p, count = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d", &p);
if (!is_exist(p)) {
count++;
page_replace(p);
}
}
printf("%d", count);
return 0;
}
```
LRU(Least Recently Used)页面替换算法:
```c
#define MAXSIZE 1024 // 最大页面数
int page[MAXSIZE];
int top = 0; // 栈顶
int is_exist(int p) { // 判断页面是否在内存中
for (int i = 0; i < top; i++) {
if (page[i] == p) {
for (int j = i; j < top - 1; j++) {
page[j] = page[j + 1];
}
page[top - 1] = p;
return 1;
}
}
return 0;
}
void page_replace(int p) { // 页面替换函数
if (top < MAXSIZE) {
page[top++] = p;
} else {
for (int i = 0; i < top - 1; i++) {
page[i] = page[i + 1];
}
page[top - 1] = p;
}
}
int main() {
int n, m, p, count = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d", &p);
if (!is_exist(p)) {
count++;
page_replace(p);
}
}
printf("%d", count);
return 0;
}
```
CLOCK页面替换算法:
```c
#define MAXSIZE 1024 // 最大页面数
int page[MAXSIZE];
int clk[MAXSIZE];
int top = 0; // 栈顶
int is_exist(int p) { // 判断页面是否在内存中
for (int i = 0; i < top; i++) {
if (page[i] == p) {
clk[i] = 1;
return 1;
}
}
return 0;
}
void page_replace(int p) { // 页面替换函数
while (1) {
if (top < MAXSIZE) {
page[top] = p;
clk[top++] = 1;
break;
} else {
if (clk[0] == 0) {
for (int i = 0; i < top - 1; i++) {
page[i] = page[i + 1];
clk[i] = clk[i + 1];
}
page[top - 1] = p;
clk[top - 1] = 1;
break;
} else {
for (int i = 0; i < top - 1; i++) {
page[i] = page[i + 1];
clk[i] = clk[i + 1];
}
page[top - 1] = p;
clk[top - 1] = 0;
}
}
}
}
int main() {
int n, m, p, count = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d", &p);
if (!is_exist(p)) {
count++;
page_replace(p);
}
}
printf("%d", count);
return 0;
}
```
OPT(Optimal)页面替换算法:
```c
#define MAXSIZE 1024 // 最大页面数
int page[MAXSIZE];
int top = 0; // 栈顶
int is_exist(int p) { // 判断页面是否在内存中
for (int i = 0; i < top; i++) {
if (page[i] == p) {
return 1;
}
}
return 0;
}
int get_optimal_page(int* ref, int n, int start) { // 获取最优页面
int optimal = -1, max_dist = -1;
for (int i = 0; i < top; i++) {
int j = start;
while (j < n && ref[j] != page[i]) {
j++;
}
if (j == n) {
return i;
}
if (j - start > max_dist) {
max_dist = j - start;
optimal = i;
}
}
return optimal;
}
void page_replace(int p, int* ref, int n, int start) { // 页面替换函数
if (top < MAXSIZE) {
page[top++] = p;
} else {
int i = get_optimal_page(ref, n, start);
page[i] = p;
}
}
int main() {
int n, m, p, count = 0;
scanf("%d%d", &n, &m);
int ref[n];
for (int i = 0; i < m; i++) {
scanf("%d", &ref[i]);
if (!is_exist(ref[i])) {
count++;
page_replace(ref[i], ref, n, i + 1);
}
}
printf("%d", count);
return 0;
}
```
阅读全文