// VC08---虚拟内存页面置换算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
const int MaxNumber=100;
    int  PageOrder[MaxNumber];//页面访问序列
    int  Simulate[MaxNumber][MaxNumber];//访问各个时刻物理块的记录
    int  PageCount[MaxNumber];//物理块
    int  PageNum,LackNum,blockNum;//PageNum页面个数,LackNum缺页数
    double  LackPageRate;//缺页率
    bool found;
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 初始化 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void initialization(){
        cin>>blockNum;
        cin>>PageNum;
        for(int i=0;i<PageNum;cin>>PageOrder[i++]);
        cout<<"初始化的页面访问序列"<<endl;
        for(int i=0;i<PageNum;cout<<PageOrder[i++]<<" , ");
        cout<<endl;
    
    }
    void display(){
        int i=0,j=0;
        for(i=0;i<PageNum;i++)
        {    cout<<"第 "<<i+1<<" 次 : ";
            for(j=0;j<blockNum;j++)
                cout<<Simulate[i][j]<<" , ";
            cout<<endl;
        }
        cout<<"LackNum : "<<LackNum<<endl;
        cout<<"缺页率"<<LackNum<<"/"<<PageNum<<endl;
    }



    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FIFO(先进先出) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void FIFO(){
        int next=0; LackNum=0;
        int page_index=0;//页面在物理块中的存储下标;
        int i,j;
        for(  i=0;i<PageNum;i++){
            //判断所要的页面是否在页面中;
            found=false;
            for( j=0;j<next;j++)
            {
               if(Simulate[i-1][j]==PageOrder[i])
                    found=true;
            }
            //所需要的页面不在内存中;
            if(!found){    
                //内存已满
                if(next>=blockNum)
                {
                    LackNum++;                
                    //更新内存空间
                    for(j=0;j<blockNum;j++)
                        {if(j==page_index)Simulate[i][j]=PageOrder[i];
                         else Simulate[i][j]=Simulate[i-1][j];}        
                    //寻找替换的页位置;
                    page_index=(page_index+1)%blockNum;                    
                }
                //内存还有空闲空间
                else{
                    for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}    
                    Simulate[i][next++]=PageOrder[i];
                    }                
            }
            else  for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
            

        }
        
    }


    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OPTimal(最佳置换) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void OPT(){
        int next=0; LackNum=0;
        int page_index=0;//页面在物理块中的存储下标;
        int page_distance=0;//后面第几个页面访问时才需要调度
        int i,j,k;
        bool zhaodao=false;
        for( i=0;i<PageNum;i++){
            //判断所要的页面是否在页面中;
            found=false;
            for( j=0;j<next;j++)
            {
               if(Simulate[i-1][j]==PageOrder[i])
                    found=true;
            }
            //所需要的页面不在内存中;
            if(!found){    
                //内存已满
                if(next>=blockNum)
                {
                    LackNum++;
                    page_index=0; page_distance=0;
                    //寻找替换的页位置;                    
                    for(j=0;j<blockNum;j++){
                        
                        for(  k=i+1;k<PageNum;k++)
                        {   
                            if(Simulate[i-1][j]==PageOrder[k])
                            {                                
                                 if(k>page_distance)
                                 {page_index=j;page_distance=k;}
                                 zhaodao=true;break;                                
                            }
                            
                        }
                        if(!zhaodao){page_index=j;page_distance=MaxNumber+1;break;}
                        zhaodao=false;
                    }                    
                    //更新内存空间
                    for(j=0;j<blockNum;j++)
                        {if(j==page_index)Simulate[i][j]=PageOrder[i];
                         else Simulate[i][j]=Simulate[i-1][j];}        
                        
                }
                //内存还有空闲空间
                else{
                    for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}    
                    Simulate[i][next++]=PageOrder[i];
                    }                    
            }    
            else  for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
        }
    
    }



    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRU(least recently used最近最久未使用) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void LRU(){
        int next=0; LackNum=0;
        int page_index=0;//页面在物理块中的存储下标;
        int page_distance=0;//后面第几个页面访问时才需要调度
        int i,j,k;        
        for( i=0;i<PageNum;i++){
            //判断所要的页面是否在页面中;
            found=false;
            for( j=0;j<next;j++)
            {
               if(Simulate[i-1][j]==PageOrder[i])
                    found=true;
            }
            //所需要的页面不在内存中;
            if(!found){    
                //内存已满
                if(next>=blockNum)
                {
                    LackNum++;
                    page_index=0; page_distance=i;
                    //寻找替换的页位置;
                    for(j=0;j<blockNum;j++){
                        for(k=i-1;k>=0;k--)
                        {
                            if(Simulate[i-1][j]==PageOrder[k])
                            {
                                 if(k<page_distance)
                                 {page_index=j;page_distance=k;}
                                 break;
                            }
                        }                        
                    }        
                    //更新内存空间
                    for(j=0;j<blockNum;j++)
                        {if(j==page_index)Simulate[i][j]=PageOrder[i];
                         else Simulate[i][j]=Simulate[i-1][j];}        
                        
                }
                //内存还有空闲空间
                else{
                        for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}    
                        Simulate[i][next++]=PageOrder[i];
                    }                
            }        
            else  for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
        }
    
    
    }


    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ main @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



int _tmain(int argc, _TCHAR* argv[])
{
    int choice;
    freopen("text.txt","rt",stdin);
    initialization();
    cout<<"block===  "<<blockNum<<endl;
    while(cin>>choice){
        if(choice==1){cout<<"FIFO(先进先出)算法"<<endl;FIFO();display();}
        else if(choice==2){cout<<"Optimal(最佳置换)算法"<<endl;OPT();display();}
        else if(choice==3){cout<<"LRU(least recently used最近最久未使用)算法"<<endl;LRU();display();}
        else cout<<"输入选择算法的序号错误"<<endl;    
    }

    return 0;
}



posted on 2012-11-29 17:50  叶城宇  阅读(943)  评论(0编辑  收藏  举报