目前在上实验课,理论以后在进行补充。以下只放上纯模拟的代码。
其实模拟还是很好模拟的,三者仅仅只是发生缺页时调度方法不同,尤其是LRU和OPT两者代码只有一个地方不同,区别之处就在于LRU是向前找,而OPT算法则是向后找。以下以序列{2,3,2,1,5,2,4,5,3,2,5,2} 12个数为例。想要用户输入可以在主函数里写个输入,定义一个全局的数组长度即可。系统内存的块则用的数组b来代表,也可自己设置数组b的长度,大体同上。
//栾兆威 16171120
#include <bits/stdc++.h>
using namespace std;
int a[]={2,3,2,1,5,2,4,5,3,2,5,2}; //12个
int b[3]={-1,-1,-1}; //只分配了三个块
void LRU(){
int cnt = 0,kk = 0;
memset(b,-1,sizeof(b));
for(int i=0;i<12;i++){
if(kk<3){ //前三个页调入内存
bool flag = false;
for(int j = 0;j < i ;j++){ //看看内存块中是否已经存在
if(a[i]==b[j]){
flag = true;
break;
}
}
if(flag==false){
b[kk] = a[i];
cnt++;
kk++;
}
}
else{
bool flag = false;
for(int j = 0;j < 3;j++){
if(a[i]==b[j]){
//cout<<"~~~~~~~"<<a[i]<<endl;
flag = true;
break;
}
}
//造成缺页
if(flag == false){
int tmp = 0;
bool vis[3];
memset(vis,false,sizeof(vis));
for(int j = i;j >=0;j--){//向前找
for(int k=0;k<3;k++){
if(a[j]==b[k]){
vis[k]=true;
tmp++;
break;
}
}
if(tmp==2)
break;
}
for(int j = 0;j<3;j++){
if(vis[j]==false){
cnt++;
b[j]=a[i];
break;
}
}
}
}
cout<<a[i]<<": [";
for(int j=0;j<3;j++){
if(b[j]==-1)
cout<<"* ";
else
cout<<b[j]<<" ";
}
cout<<"]"<<endl;
}
cout<<"缺页数为: "<<cnt<<endl;
}
void OPT(){
int cnt = 0,kk = 0;
memset(b,-1,sizeof(b));
for(int i=0;i<12;i++){
if(kk<3){
bool flag = false;
for(int j = 0;j < i ;j++){
if(a[i]==b[j]){
flag = true;
break;
}
}
if(flag==false){
b[kk] = a[i];
cnt++;
kk++;
}
}
else{
bool flag = false;
for(int j = 0;j < 3;j++){
if(a[i]==b[j]){
//cout<<"~~~~~~~"<<a[i]<<endl;
flag = true;
break;
}
}
//造成缺页
if(flag == false){
int tmp = 0;
bool vis[3];
memset(vis,false,sizeof(vis));
for(int j = i+1;j <12;j++){//向后找
for(int k=0;k<3;k++){
if(a[j]==b[k]){
vis[k]=true;
tmp++;
break;
}
}
if(tmp==2)
break;
}
for(int j = 0;j<3;j++){
if(vis[j]==false){
cnt++;
b[j]=a[i];
break;
}
}
}
}
cout<<a[i]<<": [";
for(int j=0;j<3;j++){
if(b[j]==-1)
cout<<"* ";
else
cout<<b[j]<<" ";
}
cout<<"]"<<endl;
}
cout<<"缺页数为: "<<cnt<<endl;
}
void FIFO(){
int cnt = 0,t = 0;
for(int i = 0;i <12 ;i++){
bool flag = false;
for(int j = 0;j < 3;j++){
if(a[i]==b[j]){
flag=true;
break;
}
}
if(flag==false){//缺页
cnt++;
b[t]=a[i];
t++;
if(t==3)
t=0;
}
cout<<a[i]<<": [";
for(int j=0;j<3;j++){
if(b[j]==-1)
cout<<"* ";
else
cout<<b[j]<<" ";
}
cout<<"]"<<endl;
}
cout<<"缺页数为: "<<cnt<<endl;
}
int main(){
cout<<"先进先出淘汰算法:"<<endl;
cout<<"*********************"<<endl;
FIFO();
cout<<"*********************"<<endl;
cout<<endl;
cout<<"最近最久未用淘汰算法:"<<endl;
cout<<"*********************"<<endl;
LRU();
cout<<"*********************"<<endl;
cout<<endl;
cout<<"最佳淘汰算法淘汰算法:"<<endl;
cout<<"*********************"<<endl;
OPT();
cout<<"*********************"<<endl;
cout<<endl;
return 0;
}