【页面置换算法】LRC算法和FIFS算法

  1. 算法介绍
      1. FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。
      2. LRU(least recently used)是将近期最不会访问的数据给淘汰掉,LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低。LRU算法简单,存储空间没有被浪费,所以还是用的比较广泛的。
  2. 实现思路
    1. 数组作为内存块,另一个数组存储页号
    2. FIFS:

      读入的页号首先在内存块中查找,没有查找到,当前物理块若为空,则调入页号,若非空,则按照先到先出的顺序,调入调出,若查找到页号,则继续查找下一个。

    3. LUR:

      内存块为空时,先读入的页号进入内存块直到内存块满,将其等待时间都置为0,接下来的页号,如果在内存块中找到,则将该页号的等待时间置为0,若找不到,则查找内存块中等待时间最长的页号置换出去,新进来的页号等待时间置为0。然后将内存块中其余页号的等待时间都加1。

    4.  

      流程图:

    5. lur:

      FIFS:

  3. 代码
  4.   1 #include<iostream>
      2 using namespace std;
      3 //伪代码: 内存大小,作业号,
      4 //物理块,
      5 int a[100],len,b[100],i,j,n; 
      6 int c[100][2];
      7 
      8 void readn(int n){
      9 
     10     cout<<"请输入页面号(-1结束)";
     11      len=0;
     12      int m=0;
     13     while(m!=-1){
     14         cin>>a[len];
     15         m=a[len];
     16          len++;
     17         } 
     18         len=len-1;
     19         cout<<"输入完毕"<<endl;    
     20 //        for( j=0;j<len;j++){
     21 //            cout<<a[j];    
     22 //        }
     23 } 
     24 
     25 void FIFO(int n,int a[]){
     26     int cnum=0;
     27     for( j=0;j<n;j++){
     28             b[j]=a[j];
     29             
     30         }
     31     //输出第一个b[n], 
     32     cout<<"当前物理块存放的页号:"; 
     33     for( j=0;j<n;j++){
     34             cout<<b[j]<<" ";    
     35         }
     36         cout<<endl;
     37     int x=0,flag=0,sum=0;
     38     for( i=n-1;i<len;i++){
     39         
     40         for( j=0;j<n;j++){
     41             if(a[i]==b[j])
     42             break;    
     43         }
     44         int q=x; 
     45         if(j>=n){
     46             b[x]=a[i];
     47             x=(x+1)%n;
     48             
     49             flag=1;
     50             sum++;
     51         }
     52         if(flag==1){
     53                 cout<<"置换了b["<<q<<"]"<<endl;
     54             }
     55         cout<<"当前物理块存放的页号:"; 
     56         for( j=0;j<n;j++){
     57             cout<<b[j]<<" ";    
     58         }
     59         cout<<endl;
     60         flag=0;
     61     }
     62     //计算缺页率
     63     cout<<"FIFO缺页次数:"<<sum+n<<endl; 
     64     cout<<"FIFO置换次数:"<<sum <<endl;
     65     cout<<"FIFO缺页率:"<<(double)(sum+n)/len<<endl;
     66 
     67 }
     68 
     69 void LRU(int n,int a[]){
     70     
     71     int cnum=0;
     72     for( j=0;j<n;j++){
     73             c[j][0]=a[j];
     74             c[j][1]=0;
     75         }
     76     //输出第一个b[n], 
     77     cout<<"当前物理块存放的页号:"; 
     78     for( j=0;j<n;j++){
     79             cout<<c[j][0]<<" ";    
     80         }
     81         cout<<endl;
     82     int x=0,flag=0,sum=0;
     83     for( i=n-1;i<len;i++){
     84         //查找在不在内存里面 
     85         for( j=0;j<n;j++){
     86             if(a[i]==c[j][0]){
     87                 c[j][1]=0;//将时间恢复为0 
     88                 
     89                 //等待的时间加1 
     90             for(int k=0;k<n;k++){
     91                 if(c[k][0]!=a[i]){
     92                     c[k][1]++;
     93                 } 
     94             }    
     95                 break;    
     96             }
     97         
     98         }
     99         int q;
    100         if(j>=n){//不在内存里面,找最久没用的 
    101             int tmp=c[x][1],zhen=x;
    102             for(int l=0;l<n;l++){
    103                 if(c[l][1]>tmp){
    104                     tmp=c[l][1];
    105                     zhen=l;
    106                 }
    107             } 
    108             x=zhen;
    109             q=x;
    110             c[x][0]=a[i];
    111             c[x][1]=0;
    112             for(int k=0;k<n;k++){
    113                 if(c[k][0]!=a[i]){
    114                     c[k][1]++;
    115                 } 
    116             }    
    117             x=(x+1)%n;
    118             flag=1;
    119             sum++;
    120         }
    121         if(flag==1){
    122                 cout<<"置换了c["<<q<<"]"<<endl;
    123             }
    124         cout<<"当前物理块存放的页号:"; 
    125         for( j=0;j<n;j++){
    126             cout<<c[j][0]<<" ";    
    127         }
    128         cout<<endl;
    129         flag=0;
    130     }
    131     //计算缺页率
    132     cout<<"LUR缺页次数:"<<sum+n<<endl; 
    133     cout<<"LUR置换次数:"<<sum <<endl;
    134     cout<<"LUR缺页率:"<<(double)(sum+n)/len<<endl;
    135 
    136     
    137     
    138 }
    139 
    140 int main(){
    141     //物理块
    142     cout<<"请输入物理块大小";
    143     cin>>n;
    144     readn(n);
    145     cout<<"FIFO算法:";
    146     FIFO(n,a);
    147     cout<<endl;
    148     cout<<"LRU算法:";
    149     LRU(n,a);
    150 
    151     return 0;
    152 } 

     

  5. 运行结果
    1.  

posted @ 2018-12-21 16:16  一头  阅读(1745)  评论(0编辑  收藏  举报