题目:给定一个进程执行时的访问页面数N,进程拥有的内存块个数M,以及进程执行时页面访问次序数组page。采用最佳淘汰算法OPT和最近最久未使用淘汰算法LRU,通过编程,计算这两种方法的缺页次数以及缺页率。
代码示意:
PS:本人是初学者,如有错误和优化的地方还请大佬斧正!
#include<iostream>
using namespace std;
int page[100];
/*给定一个进程执行时的访问页面数N,进程拥有的内存块个数M,以及进程执行时页面访问次序数组page。
采用最佳淘汰算法OPT和最近最久未使用淘汰算法LRU,通过编程,
计算这两种方法的缺页次数以及缺页率。
*/
int replace_OPT(int memory[],int M,int page[],int N,int n){
int position=0;
int max=0;
//找到最佳置换的位置
for(int i=0;i<M;i++){
int j;
for(j=n+1;j<N;j++){
if(memory[i]==page[j]){
break;
}
}
if(j>max){
max=j;
position=i;
}
}
// cout<<"position:"<<position<<endl;
return position;
}
int replace_LRU(int memory_time[],int M){
int position=0;
int max=0;
for(int i=0;i<M;i++){
if(memory_time[i]>max){
max=memory_time[i];
position=i;
}
}
return position;
}
//采用最佳淘汰算法OPT
void OPT(int page[],int N,int M,int memory[]){
int lose=0;
int i,j;
for(i=0;i<N;i++){
//先让页面进入内存
if(i<=M-1){
memory[i]=page[i];
}
else{
//先找有没有在内存里
for(j=0;j<M;j++){
if(page[i]==memory[j])
break;
}
if(j<M){
continue;
}
else{
//没有在内存里,产生缺页
lose++;
// cout<<"lose:"<<lose<<endl;
// cout<<"page["<<i<<"]:"<<page[i]<<endl;
memory[replace_OPT(memory,M,page,N,i)]=page[i];
// cout<<"memory:"<<endl;
// for(int k=0;k<M;k++)
// cout<<memory[k]<<" ";
// cout<<endl;
}
}
}
cout<<"利用最佳置换算法得到的缺页次数为:"<<lose<<" "<<"缺页率为:"<<((double)lose/(N-M))*100<<"%"<<endl;
}
//采用最近最久未使用淘汰算法LRU
void LRU(int page[],int N,int M,int memory[]){
int lose=0;
int i,j;
int memory_time[100]={0};
for(i=0;i<N;i++){
//先让页面进入内存
if(i<=M-1){
memory[i]=page[i];
memory_time[i]++;
}
else{
//先找有没有在内存里
for(j=0;j<M;j++){
if(page[i]==memory[j])
break;
}
if(j<M){
for(int l=0;l<M;l++){
if(l==j)
memory_time[j]=0;
else
memory_time[l]++;
}
continue;
}
else{
//没有在内存里,产生缺页
lose++;
int position=replace_LRU(memory_time,M);
memory[position]=page[i];
for(int l=0;l<M;l++){
if(l==position)
memory_time[position]=0;
else
memory_time[l]++;
}
}
}
}
cout<<"利用最近最久未使用算法得到的缺页次数为:"<<lose<<" "<<"缺页率为:"<<((double)lose/(N-M))*100<<"%"<<endl;
}
int main(){
//给定一个进程执行时的页面数N,进程拥有的内存块个数M
int N,M;
cout<<"请输入进程执行时的页面数:"<<endl;
cin>>N;
cout<<"请输入进程拥有的内存块个数:"<<endl;
cin>>M;
cout<<"请输入进程执行时页面访问的次序数组:"<<endl;
for(int i=0;i<N;i++)
cin>>page[i];
int memory[100];
OPT(page,N,M,memory);
LRU(page,N,M,memory);
return 0;
}