• 【页面置换算法】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. 运行结果
  • 相关阅读:
    mysql数据库常用指令
    解决windows的mysql无法启动 服务没有报告任何错误的经验。
    “Can't open file for writing”或“operation not permitted”的解决办法
    启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
    如何打开windows的服务services.msc
    常见的HTTP状态码 404 500 301 200
    linux系统常用的重启、关机指令
    (wifi)wifi移植之命令行调试driver和supplicant
    linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
    alloc_chrdev_region申请一个动态主设备号,并申请一系列次设备号
  • 原文地址:https://www.cnblogs.com/yitou13/p/10156452.html
Copyright © 2020-2023  润新知