使用FIFO算法和LRU算法模拟虚拟页式存储管理
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int MAXSIZE=1000;
const int NUM=3;
typedef struct node{
int loaded;
int time;
}page;
page pages[NUM];
int queue[MAXSIZE];
int quantity;
void initial(){
int i;
for(i=0;i<NUM;i++){
pages[i].loaded=-1;
}
for(i=0;i<MAXSIZE;i++){
queue[i]=-1;
}
quantity=0;
}
void readData(){
FILE *fp;
char fname[20];
int i;
cout<<"请输入页面流文件名:";
cin>>fname;
if((fp=fopen(fname,"r"))==NULL){
cout<<"错误,文件打不开,请检查文件名";
}else{
while(!feof(fp)){
fscanf(fp,"%d ",&queue[quantity]);
quantity++;
}
}
cout<<"读入的页面流:";
for(i=0;i<quantity;i++){
cout<<queue[i]<<" ";
}
}
void FIFO() {
int i,j,p,flag;
int absence=0;
p=0;
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"先进先出调度算法(FIFO)页面调出流:";
for(i=0;i<NUM;i++){
int flag_f = 0;
for(int j = 0; j < NUM; j++){
if(queue[i] == pages[j].loaded){
flag_f = 1;
break;
}else{
continue;
}
}
if(flag_f){
continue;
}
pages[p].loaded=queue[i];
cout<<pages[p].loaded<<" ";
p=(p+1)%NUM;
}
if(p == 0){
absence = 3;
}else if(p == 2){
absence = 2;
}else if(p == 1){
absence = 1;
}
for(i=NUM;i<quantity;i++){
flag=0;
for(j=0;j<NUM;j++){
if(pages[j].loaded==queue[i])
flag=1;
}
if(flag==0){
if(pages[p].loaded == -1){
cout << queue[i] << " ";
pages[p].loaded = queue[i];
p=(p + 1) % NUM;
absence++;
}else{
cout<<pages[p].loaded<<" ";
pages[p].loaded=queue[i];
p=(p+1)%NUM;
absence++;
}
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
void LRU(){
int i,j,k,p,flag;
int absence=0;
p=0;
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最近最少使用调度算法(LRU)页面调出流:";
for(i=0;i<NUM;i++){
int flag_l = 0;
for(j = 0; j < NUM; j++){
if(queue[i] == pages[j].loaded){
flag_l = 1;
pages[j].time = 0;
break;
}else{
continue;
}
}
if(flag_l){
continue;
}
pages[p].loaded=queue[i];
cout<<pages[p].loaded<<" ";
for(j=0;j<=p;j++){
pages[j].time++;
}
p=(p+1)%NUM;
}
if(p == 0){
absence = 3;
}else if(p == 2){
absence = 2;
pages[2].time = 4;
}else if(p == 1){
absence = 1;
pages[1].time = 4;
pages[2].time = 3;
}
for(i=NUM;i<quantity;i++){
flag=0;
for(j=0;j<NUM;j++){
pages[j].time++;
if(pages[j].loaded==queue[i]){
flag=1;
pages[j].time=0;
}
}
if(flag==0){
int max=0;
for(k=1;k<NUM;k++){
if(pages[max].time<pages[k].time){
max=k;
}
}
if(pages[max].loaded == -1){
cout << queue[i] << " ";
pages[max].loaded = queue[i];
pages[max].time = 0;
absence++;
}else{
cout<<pages[max].loaded<<" ";
pages[max].loaded=queue[i];
pages[max].time=0;
absence++;
}
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
int main(){
cout<<" /**********虚拟存储管理器的页面调度**************/"<<endl;
initial();
readData();
LRU();
return 0;
}