1.代码:
(1)memswap.h 页面置换算法头文件
#ifndef _MEMSWAP_H
#define _MEMSWAP_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curses.h>
#define _CRT_SECURE_NO_WARNINGS
#define P 3
#define RS_MAX_SIZE 50
int rs[RS_MAX_SIZE];
int rs_size;
int pf[P];
int call_loc[P];
int swap_loc;
//页面置换
void Swap(int which);
//最佳置换算法,返回最佳置换淘汰物理页块号
int OPT(int begin);
//创建页面号引用串
void CreateRS();
//显示进程装在物理页框中的页面号
void printPF(int n);
int Contains(int rs_p);
//标记清理
void cleanFlag();
#endif
(2)新建两个文件,一个用于存放头文件,一个用来写入主程序
(3)swapMain.c – 页面置换算法主程序
#include "memswap.h"
int Page[pf]={0};
typedef struct{
int block;
int time;
}BLock;
typedef struct LNode{
BLock B[3];
}Mem;
Mem M;
void CreatePage(){
//初始化页面
printf("页面走向:\n");
for(int i=0;i<pf;i++){
Page[i]=rand()%9+1;
printf("%d ",Page[i]);
}
printf("\n");
}
int max(int a,int b,int c){
int x,z;
if(a>=b)
x=a;
else x=b;
if(x>=c)
z=x;
else
z=c;
return z;
}
void InitM()
{
for(int q=0;q<pf;q++){
M.B[q].block=0;
}
for(int q=0;q<pf;q++){
M.B[q].time=0;
}
}
void LRU() //最近最久未使用算法
{
printf("具体实现过程:\n");
InitM();
int i=0,j=0;
int a=-1,b=-1;
int Max=-1;
int MaxU=0;
int count=0;
for(i=0;i<pf;i++){
for(j=0;j<RS_MAX_SIZE;j++)
if(M.B[j].block==0){
a=j;
break;
}
for(j=0;j<RS_MAX_SIZE;j++){
if(M.B[j].block==Page[i])
b=j;
}
for(j=0;j<RS_MAX_SIZE;j++){
if(M.B[j].time>MaxU){
MaxU=M.B[j].time;
Max=j;
}
}
if(b==-1){
if(a!=-1){
M.B[a].block=Page[i];
M.B[a].time=0;
for(j=0;j<=a;j++)
M.B[j].time++;
a=-1;
}
else{
M.B[Max].block=Page[i];
M.B[Max].time=0;
for(j=0;j<RS_MAX_SIZE;j++)
M.B[j].time++;
Max=-1;
MaxU=0;
count++;
}
}
else{
M.B[b].block=Page[i];
M.B[b].time=0;
if(a!=-1){
M.B[a].time=0;
}
for(j=0;j<RS_MAX_SIZE;j++){
M.B[j].time++;
}
Max=-1;
MaxU=0;
b=-1;
}
for(j=0;j<RS_MAX_SIZE;j++){
printf("%d ",M.B[j].block);
}
printf("\n");
}
}
//创建页面号引用串
void CreateRS()
{
int i;
printf("请输入进程逻辑空间的页面个数: ");
scanf("%d",&rs_size);
if(rs_size>RS_MAX_SIZE)
{
printf("非法!页面个数超出进程空间的最大范围\n");
return;
}
printf("请输入进程页面号引用串(空格隔开,<=%d 个页面号):\n",RS_MAX_SIZE);
for (i=0;i<rs_size;i++) scanf("%d",&rs[i]);
}
void printPF(int n)
{
int i;
for (i=0;i<n;i++) printf("%d ",pf[i]);
printf("\n");
}
int Contains(int rs_p)
{
int i, result = 0;
for (i=0; i<P; i++)
{
if(rs_p == pf[i])
{
result = 1;
break;
} }
return result;
}
//页面置换
void Swap(int which)
{
int i,swap_loc=0,count=0;
char s[40];
int LackPage=0;
int q=1,w=1;
int flag=0;
for (i=0;i<rs_size;i++)
{
if(i<P) //有空页框
{
pf[i]=rs[i];
printf("当前内存页:");
printPF(i+1);
}
else //无空页框,可能需要换页
{
if(!Contains(rs[i]))
{
count++;
if(which==1)
{
swap_loc = OPT(i);
printf("第[%d]次页面置换:物理块号[%d]上的页[%d]被换出到虚存,逻辑页[%d]被调入内存。\n",count,swap_loc,pf[swap_loc],rs[i]);
pf[swap_loc]=rs[i];
}
else if(which==2)
{
printf("第[%d]次页面置换:物理块号[%d]上的页[%d]被换出到虚存,逻辑页[%d]被调入内存。\n",count,swap_loc,pf[swap_loc],rs[i]);
pf[swap_loc]=rs[i];
swap_loc++;
swap_loc%=P;
}
else if(which==3)
{
LRU();
}
printf("当前内存页:");
printPF(P);
}
else printf("访问页面[%d]未缺页\n",rs[i]);
} }
printf("进程执行完毕!\n");
if(which==1) strcpy(s,"最佳");
else if(which==2) strcpy(s,"先进先出");
else strcpy(s,"最近最久未使用");
printf("采用%s 置换算法,总共发生了%d 次页面置换。\n\n\n",s,count);
}
int main()
{
int choice, flag=1;
printf("本程序为页面置换算法模拟练习:\n");
printf("目前你的进程分配的物理内存页框个数为:%d\n", P);
CreateRS();
while(flag)
{
printf("请选择: \n");
printf("1.最佳(OPT)页面置换算法\n");
printf("2.先进先出(FIFO)页面置换算法\n");
printf("3.最近最久未使用(LRU)页面置换算法\n");
printf("4.退出程序\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("最佳(OPT)页面置换算法运行结果:\n");
Swap(1);
break;
case 2:
printf("先进先出(FIFO)页面置换算法运行结果:\n");
Swap(2);
break;
case 3:
printf("最近最久未使用(LRU)页面置换算法运行结果:\n");
Swap(3);
break;
default:
flag=0;
} }
return 0;
}
//标记清理
void cleanFlag()
{
int i;
for(i=0;i<P;i++) call_loc[i]=0;
}
//最佳置换算法
//计算最佳置换淘汰物理页块号
int OPT(int begin)
{
int i,j, swap_loc,count=0;
cleanFlag();
for (j=begin+1;j<rs_size;j++)
{
for (i=0; i<P; i++)
{
if(rs[j] == pf[i] && call_loc[i]==0)
{
call_loc[i]=-1;
count++;
break;
} }
if(P-count==1) break;
}
for (i=0;i<P;i++)
{
if(call_loc[i]!=-1)
{
swap_loc=i;
break;
} }
return swap_loc;
}
2、运行结果:
(1)输入进程逻辑空间的页面个数和进程页面号引用串
(2)OPT页面置换算法
(3)FIFO页面置换算法
(4)LRU页面置换算法
(5)退出程序