FIFO算法与LRU算法的C++实现

#include <bits/stdc++.h>
using namespace std;
/**
 * FIFO算法的实现:其实是可以采用双端队列,然后限制一下
 * 双端队列的长度,根据我的限制应该是4。对于查询是否出现
 * 在这个队列里面,我们可以采用一个数组标记是否有存在。
 *
 * 测试数据如下
16 4
0 1 2 4 3 4 5 1 2 5 1 2 3 4 5 6
 * **/
struct FIFO{
    int len, m;///长度, len - 总访问数; m - 分配的物理块数
    int arr[105];///存储访问页面的编号
    deque<int>que;
    int vids[15];///标记数组,标记在当前可以查找到的序号
    double result;
    int a;///a - 非缺页数
    void Print(deque<int>a){
        while(!a.empty()){
            printf("%d ", a.front());
            a.pop_front();
        }
        printf("\n");
    }
    void Init(){///初始化函数
        while(!que.empty()){
            que.pop_back();
        }
        memset(vids, 0, sizeof(vids));
    }
    void solve(){
        scanf("%d%d", &len, &m);///输入处理的数字的长度,输入有多少可用物理块
        for(int i = 0; i < len; i ++){
            scanf("%d", &arr[i]);///预先输入处理的数据
        }
        int r = 0;///从第一个数据开始判断
        while(r < len){///如果没有到达尾部,接着运行
            if(!vids[arr[r]]){///如果不在物理块中
                a ++;///非缺页数加一
                printf("*: ");
                if(que.size() < m){///物理块的储存的内容小于m
                    que.push_back(arr[r]);///则将序号放入双端队列
                }
                else{///数量超过了,要实现的是弹出队头,然后把在队列中的标记去掉
                    int nums = que.front();///获取队头元素
                    que.pop_front();///弹出队头
                    vids[nums] --;///把出现过的标志去掉
                    que.push_back(arr[r]);///队列压入新的元素
                }
                vids[arr[r]] ++;///把对应的元素的值++
            }
            Print(que);
            r ++;///移动到下一个元素
        }
        printf("Number of page breaks = %d Total number of visits = %d\n", a, len);
        result = double(a) / double(len);
        printf("f = %f\n", result);
    }
}f;
int main(){
    f.Init();
    f.solve();
}
#include <bits/stdc++.h>
using namespace std;
/**
 * LRU算法的实现:可以使用一个结构体,来储存对应的数据
 * 那么使用一个vector动态数组来储存当前的物理块中的内容
 * 那么每访问一次就更新结构体中的value值,那么对vector数组
 * 进行对应sort排序,即按照value从大到小排序,然后每次弹出队尾
 * 将最小的value值的结构体弹出
 * 测试数据如下
16 4
0 1 2 4 3 4 5 1 2 5 1 2 3 4 5 6
 * **/
struct LRU_node{///LRU的节点结构
    int key, value;///key代表节点最后一次出现的序号,value代表节点的权值
};
bool cmp(const LRU_node &a, const LRU_node &b){
    return a.key > b.key;///排序,自定义排序cmp方法
}
struct LRU{
    int arr[105];///arr即存储当前的数据
    vector<LRU_node>vec;///动态数组储存节点
    int vids[105];///标记数组
    void Init(){///清空函数
        memset(vids, 0, sizeof(vids));
        memset(arr, 0, sizeof(arr));
        vec.clear();
    }
    void slove(){
        int n, m;
        scanf("%d%d", &n, &m);///n 代表输入的序列的长度是多少, m代表物理块的大小
        for(int i = 0; i < n; i ++){
            scanf("%d", &arr[i]);
        }
        int flag = 0;///缺页数
        int r = 0;///遍历边界
        while(r < n){
            LRU_node a;
            a.key = r;
            a.value = arr[r];///获取一个节点
            if(!vids[a.value]){///物理块中没有这个数
                flag ++;///缺页数加一
                printf("*: ");///代表缺页
                if(vec.size() < m){///vec的数量小于物理块m
                    vec.push_back(a);
                    vids[a.value] ++;///标记块中出现的数
                    sort(vec.begin(), vec.end(), cmp);///排序,保证弹出的肯定是时间最开始的那个
                }
                else{///vec的数量等于物理块的大小
                    sort(vec.begin(), vec.end(), cmp);///排序
                    LRU_node en = vec[vec.size() - 1];///取出最后的那个即时间最开始的那个
                    vids[en.value] --;///把弹出的数去掉
                    vec.pop_back();
                    vec.push_back(a);///把新的值压入vec
                    vids[a.value] ++;///标记新的值在块中出现
                    sort(vec.begin(), vec.end(), cmp);///排序
                }
                for(int i = 0; i < vec.size(); i ++){
                    printf("%d ", vec[i].value);
                }
                printf("\n");
            }
            else{///否则在块中有对应的数
                for(int i = 0; i < vec.size(); i ++){///遍历块中数据
                    if(vec[i].value == a.value){
                        vec[i].key = a.key;///更新块中的数据所对应的key值,即出现的最后的时间
                        break;
                    }
                }
                sort(vec.begin(), vec.end(), cmp);///排序
                for(int i = 0; i < vec.size(); i ++){
                    printf("%d ", vec[i].value);
                }
                printf("\n");
            }
            r ++;
        }
        printf("Number of page breaks = %d Total number of visits = %d\n", flag, n);
        printf("f = %lf\n", double(flag) / double(n));
    }
}l;
int main(){
    l.Init();
    l.slove();
    return 0;
}

原文地址:https://www.cnblogs.com/qq136155330/p/10817299.html

时间: 2024-11-05 21:58:25

FIFO算法与LRU算法的C++实现的相关文章

C语言实现FIFO算法与LRU算法

在操作系统中,当程序在运行过程中,若其所要访问的页面不再内存中而需要把他们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存调出一页程序或数据送磁盘的兑换区中.但哪一个页面调出,须根据一定的算法确定.通常,把选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms).置换算法的好坏将直接影响到系统的性能. 1) 先进先出(FIFO)页面置换算法 该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.该算法实现简单,只需

【算法】—— LRU算法

LRU原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. 实现1 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:  1. 新数据插入到链表头部: 2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部: 3. 当链表满的时候,将链表尾部的数据丢弃. 分析 [命中率] 当存在热点数据时,LRU的效率很好,但偶发性的.周期性的批量操作会导致LRU命中率急剧下

【算法】LRU算法

缓存一般存放的都是热点数据,而热点数据又是利用LRU(最近最久未用算法)对不断访问的数据筛选淘汰出来的. 出于对这个算法的好奇就查了下资料. LRU算法四种实现方式介绍 缓存淘汰算法 原文地址:https://www.cnblogs.com/2YSP/p/10424376.html

FIFO调度算法和LRU算法

一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了,你只能放在地下室里面.你看书的时候不会在地下室看书,而是在书房看书.每次,你想看书都必须跑到地下室去找出来你想看的书,然后抱回来放到书桌上,之后才开始看.还有就是,有一些书你会反复的看,今天看了也许过几天又要看.总之,你自己是不知道你哪天会需要看哪本书的.你的老师每天下课的时候会给你布置一个书单,

LRU算法原理解析

LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的. 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理.他将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存和磁盘之间来回传送数据.虚拟内存被组织为存放在磁盘上的N个连续的字节组成的数组,每个字节都有唯一的虚拟地址,作为到数组的索引.虚拟内存被分割为大小固定的数据块虚拟页(Virtual Page,VP),这些数据块作为主

使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法

一,LRU算法介绍 LRU算法是最近最少未使用算法.当内存缺页时,总是优先选出距离当前最久未使用的页面换出,并把当前的缺页换入.该算法可用栈模拟实现. 栈顶总是保存当前最近访问的页面号,栈底则总是保存最久未访问的页面号.对于下一个页面,有两种情况: ①命中,则需要:更新栈顶元素.即将当前命中的页面号放到栈顶. ②未命中,这里还需要考虑栈是否满了.1)若栈未满,直接将未命中的页面号放到栈顶即可.2)栈已经满了,则需要选中一页换出(栈底元素是最久未访问的页面),然后再将新页面放入栈顶. 二,代码实现

操作系统页面置换算法(opt,lru,fifo,clock)实现

#include <iostream> #include<map> #include<set> #include <algorithm> #include<cstdio> #include<cstring> #include<cmath> #define N 200 using namespace std; int page[N];//页面引用号 int block[N];//物理块,内存 int dist[N][N];/

页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:FIFO置换算法.LRU置换算法.LFU置换算法 最佳置换算法:不可能实现-->是衡量其他置换算法的方法. FIFO置换算法:先进先出置换算法,淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.(实现简单) LRU置换算法:最近最久未使用置换算法,该算法赋予每个页面一个访问字段,用来记录一

缓存算法:LRU、LFU、FIFO

  LRU全称是Least Recently Used,即最近最久未使用的意思.如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰. LFU(Least Frequently Used)最近最少使用算法.它是基于"如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小"的思路.注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的.