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.  #include<iostream>
    using namespace std;
    //伪代码: 内存大小,作业号,
    //物理块,
    int a[],len,b[],i,j,n;
    int c[][]; void readn(int n){ cout<<"请输入页面号(-1结束)";
    len=;
    int m=;
    while(m!=-){
    cin>>a[len];
    m=a[len];
    len++;
    }
    len=len-;
    cout<<"输入完毕"<<endl;
    // for( j=0;j<len;j++){
    // cout<<a[j];
    // }
    } void FIFO(int n,int a[]){
    int cnum=;
    for( j=;j<n;j++){
    b[j]=a[j]; }
    //输出第一个b[n],
    cout<<"当前物理块存放的页号:";
    for( j=;j<n;j++){
    cout<<b[j]<<" ";
    }
    cout<<endl;
    int x=,flag=,sum=;
    for( i=n-;i<len;i++){ for( j=;j<n;j++){
    if(a[i]==b[j])
    break;
    }
    int q=x;
    if(j>=n){
    b[x]=a[i];
    x=(x+)%n; flag=;
    sum++;
    }
    if(flag==){
    cout<<"置换了b["<<q<<"]"<<endl;
    }
    cout<<"当前物理块存放的页号:";
    for( j=;j<n;j++){
    cout<<b[j]<<" ";
    }
    cout<<endl;
    flag=;
    }
    //计算缺页率
    cout<<"FIFO缺页次数:"<<sum+n<<endl;
    cout<<"FIFO置换次数:"<<sum <<endl;
    cout<<"FIFO缺页率:"<<(double)(sum+n)/len<<endl; } void LRU(int n,int a[]){ int cnum=;
    for( j=;j<n;j++){
    c[j][]=a[j];
    c[j][]=;
    }
    //输出第一个b[n],
    cout<<"当前物理块存放的页号:";
    for( j=;j<n;j++){
    cout<<c[j][]<<" ";
    }
    cout<<endl;
    int x=,flag=,sum=;
    for( i=n-;i<len;i++){
    //查找在不在内存里面
    for( j=;j<n;j++){
    if(a[i]==c[j][]){
    c[j][]=;//将时间恢复为0 //等待的时间加1
    for(int k=;k<n;k++){
    if(c[k][]!=a[i]){
    c[k][]++;
    }
    }
    break;
    } }
    int q;
    if(j>=n){//不在内存里面,找最久没用的
    int tmp=c[x][],zhen=x;
    for(int l=;l<n;l++){
    if(c[l][]>tmp){
    tmp=c[l][];
    zhen=l;
    }
    }
    x=zhen;
    q=x;
    c[x][]=a[i];
    c[x][]=;
    for(int k=;k<n;k++){
    if(c[k][]!=a[i]){
    c[k][]++;
    }
    }
    x=(x+)%n;
    flag=;
    sum++;
    }
    if(flag==){
    cout<<"置换了c["<<q<<"]"<<endl;
    }
    cout<<"当前物理块存放的页号:";
    for( j=;j<n;j++){
    cout<<c[j][]<<" ";
    }
    cout<<endl;
    flag=;
    }
    //计算缺页率
    cout<<"LUR缺页次数:"<<sum+n<<endl;
    cout<<"LUR置换次数:"<<sum <<endl;
    cout<<"LUR缺页率:"<<(double)(sum+n)/len<<endl; } int main(){
    //物理块
    cout<<"请输入物理块大小";
    cin>>n;
    readn(n);
    cout<<"FIFO算法:";
    FIFO(n,a);
    cout<<endl;
    cout<<"LRU算法:";
    LRU(n,a); return ;
    }
  5. 运行结果

【页面置换算法】LRC算法和FIFS算法的更多相关文章

  1. 网络流之最大流算法(EK算法和Dinc算法)

    最大流 网络流的定义: 在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出. 最大流:就是求s-->t的最大流量 假设 u,v 两个 ...

  2. 单源最短路径算法——Bellman-ford算法和Dijkstra算法

     BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V ...

  3. TCP_NODELAY和TCP_CORK nagle算法和cork算法

    TCP_NODELAY 默认情况下,发送数据採用Nagle 算法.这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的.使用TCP_NODELAY选项能够禁止Nag ...

  4. FIFO调度算法和LRU算法

    一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...

  5. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

  6. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  7. mahout中kmeans算法和Canopy算法实现原理

    本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...

  8. 转载:最小生成树-Prim算法和Kruskal算法

    本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...

  9. 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

    一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...

随机推荐

  1. Redis 和 I/O 多路复用

    最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的 ...

  2. 初学python之路-day09

    今天的主要内容为内存管理. 1.引用计数:垃圾回收机制的依据 # 1.变量的值被引用,该值的引用计数 +1 # 2.变量的值被解绑,该值的引用计数 -1 # 3.引用计数为0时就会被垃圾回收机制回收 ...

  3. caffe服务器搭建血泪记录

    装过很多次caffe了,但这个还是遇到了很多奇葩问题,不过以前都是在ubuntu上,这次是在centos上. 1.import error  _caffe.so: undefined symbol: ...

  4. Lesson 2-3(字符串)

    2.5 字符串 --- 字符串是不可变的. >>> str = "Hello world!" >>> str[-6:-1] = "py ...

  5. Django—第三方引用

    索引 一.富文本编辑器 1.1 在Admin中使用 1.2 自定义使用 1.3 显示 二.全文检索 2.1 创建引擎及索引 2.2 使用 三.发送邮件 一.富文本编辑器 借助富文本编辑器,网站的编辑人 ...

  6. IDEA适合的插件

    一:安装方法 在线安装 二.    官网插件地址 http://plugins.jetbrains.com/ 三.常用插件 一. )    Alibaba Java Coding Guidelines ...

  7. vue交互

    1)如果vue想做交互,本身的框架是不支持的,需要引入vue-resurce库交互方式:get.post.jsonp 1.get方式methods: {    get: function () { / ...

  8. .net基础学java系列(四)Console实操

    上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...

  9. Jmeter(1)介绍

    JMeter是什么东西 Jmeter(Apache JMeter)是一个100%基于JAVA的应用程序,它的功能是 分析和衡量 web应用程序和各种服务的性能和负载能力 Jmeter不是一个浏览器,它 ...

  10. Ubuntu 开启远程登录 SSH 的安装和配置

    SSH 为 SecureShell 的缩写,由 IETF 的网络工作小组(NetworkWorkingGroup)所制定:SSH 是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全 ...