页面置换算法:
1、先进先出置换
2、最近最少使用算法
3、最优置换算法
#include<bits/stdc++.h>
using namespace std;
int a[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
int change;
int work[3]={-1,-1,-1}; //内存工作区
void print1(){
cout<<" ";
for(int i=0 ; i<3 ; i++){
if(work[i]==-1){
cout<<"_ ";
}
else
cout<<work[i]<<" ";
}
cout<<endl;
}
void print2(){
cout<<" -------";
cout<<endl;
}
void FIFO(){ //先进先出置换算法:
int cnt=0;
cout<<endl<<endl;
int pos=0;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<endl;
int flag=0;
for(int j=0 ; j<3 ; j++){
if(work[j]==a[i]){ //已经存在在页面工作区;
flag=2;
break;
}
else if(work[j]==-1){ //页面里面有空闲区域;
work[j]=a[i];
cnt++;
flag=1;
break;
}
}
if(flag==0){ //简单置换
work[pos]=a[i];
cnt++;
pos++;
if(pos==3){
pos=0;
}
print1();
}
else if(flag==2){
print2();
}
else{
print1();
}
}
printf("缺页率:%.2f",(double)cnt/20);
}
void LRU(){ //最近最少使用算法:
int cnt=0;
int vis[3]={0,0,0};
cout<<endl<<endl;
int pos=0;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<endl;
int flag=0;
for(int j=0 ; j<3 ; j++){
if(work[j]==a[i]){ //已经存在在页面工作区;
vis[j]=0;
flag=2;
if(j==2){break;}
else{
for(int k=j+1 ; k<3 ; k++){
vis[k]++;
}
}
}
else if(work[j]==-1){ //页面里面有空闲区域;
work[j]=a[i];
vis[j]=0;
cnt++;
flag=1;
break;
}
else{
vis[j]++;
}
}
if(flag==0){ //简单置换
pos=0;
for(int j=1 ; j<3 ; j++){
if(vis[pos]<vis[j]){
pos=j;
}
}
work[pos]=a[i];
vis[pos]=0;
cnt++;
print1();
}
else if(flag==2){
print2();
}
else{
print1();
}
}
printf("缺页率:%.2f",(double)cnt/20);
}
void OPT(){ //最优置换算法
int vis[3]={20,20,20};
int cnt=0;
cout<<endl<<endl;
int pos=0;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<endl;
int flag=0;
for(int j=0 ; j<3 ; j++){
if(work[j]==a[i]){ //已经存在在页面工作区;
flag=2;
vis[j]=20;
break;
}
else if(work[j]==-1){ //页面里面有空闲区域;
work[j]=a[i];
vis[j]=20;
cnt++;
flag=1;
break;
}
}
if(flag==0){ //简单置换
for(int j=i ; j<20 ; j++){
for(int k=0 ; k<3 ; k++){
if(vis[k]==20&&work[k]==a[j]){
vis[k]=j;
}
}
}
pos=0;
for(int j=1 ; j<3 ; j++){
if(vis[j]>vis[pos]){
pos=j;
}
}
work[pos]=a[i];
vis[pos]=20;
cnt++;
print1();
}
else if(flag==2){
print2();
}
else{
print1();
}
}
printf("缺页率:%.2f",(double)cnt/20);
}
void init(){
cout<<"页面置换算法:"<<endl;
cout<<"请输入页面置换的算法:(1-先进先出算法; 2-最近最少使用算法;3-最优置换算法)"<<endl;
cin>>change;
if(change==1){
cout<<endl<<"你选择的是 先进先出置换算法 内存工作区大小是 3"<<endl;
cout<<"初始页面访问顺序是:"<<endl;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<" ";
}
cout<<endl;
FIFO();
}
else if(change==2){
cout<<endl<<"你选择的是 最近最少使用算法 内存工作区大小是 3"<<endl;
cout<<"初始页面访问顺序是:"<<endl;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<" ";
}
cout<<endl;
LRU();
}
else{
cout<<endl<<"你选择的是 最优置换算法 内存工作区大小是 3"<<endl;
cout<<"初始页面访问顺序是:"<<endl;
for(int i=0 ; i<20 ; i++){
cout<<a[i]<<" ";
}
cout<<endl;
OPT();
}
}
int main()
{
init();
return 0;
}
/*
cout<<endl<<"test-----"<<endl;
for(int j=0 ; j<3 ; j++){
cout<<vis[j]<<" ";
}
cout<<endl<<"test-----"<<endl;
*/
先进先出置换
最近最少使用算法
最优置换算法