zoukankan      html  css  js  c++  java
  • 【页面置换算法】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. 运行结果
  • 相关阅读:
    题解【JOI 2020/2021 二次予選】B
    求导公式
    题解【洛谷P6875】[COCI2013-2014#6] KRUŽNICE
    二项式反演小记
    Matrix-Tree 定理小记
    2020ICPC南京D. Degree of Spanning Tree
    Codeforces Round #712 (Div. 1) C. Travelling Salesman Problem
    2021湖南多校对抗赛第四场 I
    2021湖南多校对抗赛第二场 C
    2021湖南多校对抗赛第二场 B
  • 原文地址:https://www.cnblogs.com/yitou13/p/10156452.html
Copyright © 2011-2022 走看看