操作系统实验:用C语言编程实现最近最久未使用置换算法(LRU)

最近最久未使用置换算法(LRU),全称Least Recently Used,是一种页面置换算法。

对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

简单概括其思想:

1.根据页面调入内存后的使用情况。
2.利用“最近的过去”作为“最近的将来”的近似。
3.选择最近最久未使用的页面予以淘汰。

一般有3种方法

1.数组+时间戳

2.栈

3.队列

其中栈和队列可以选择顺序型或者是链型。

手工栈和队列代码冗长,顺序栈和顺序队列不方便从中间改动数据。链型初始化较麻烦,且考虑细节较多。主要介绍数组+时间戳法。

算法思路:

用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。当数组空间已满时,将时间戳最大的数据项淘汰。

所以要用此方法,必须定义一个二维数组或者是结构体,我结合了时间戳、栈和顺序表的思路,重新设计了一个较好的方法。

代码如下:

#include<stdio.h>
#define MAX 100 int judge(int a[],int n,int x) //判断数组中是否已有x,若有返回其下标值,没有则返回-1
{
int i;
for(i=0;i<n;i++)
if(x==a[i])
return i;
return -1;
} void init(int a[],int n) //初始化数组为-1
{
int i;
for(i=0;i<n;i++)
a[i]=-1;
} void insert(int a[],int n,int x) //栈法插入(第一个元素出,后面元素前移,新元素从尾部入)
{
int i;
for(i=0;i<n-1;i++)
a[i]=a[i+1];
a[n-1]=x;
} void move(int a[],int n,int i) //移动下标为i的元素到尾部
{
int j;
int m=a[i];
for(j=i;j<n-1;j++)
a[j]=a[j+1];
a[n-1]=m;
} void print(int a[],int n) //输出当前数组元素
{
int i;
for(i=0;i<n;i++)
if(a[i]!=-1)
printf(" %d",a[i]);
printf("\n");
} int main()
{
int stack[MAX];
int top=-1; //模仿栈的定义
int n,x;
printf("请输入物理块数:\n");
scanf("%d",&n);
init(stack,n); //初始化数组
printf("请输入内存访问序列:\n");
while(~scanf("%d",&x)) //自动读数
{
printf("访问页面%d:\n",x);
top++; //读数后top自动+1
if(top==0) //若数组无元素
stack[top]=x; //插入一个元素
else if(top<n) //若在物理块范围内
{
if(judge(stack,n,x)==-1)//若数组中不存在待插入元素
stack[top]=x; //新元素从尾部插入
else //若数组中存在待插入元素
{
move(stack,top,judge(stack,n,x));//移动下标为i的元素到尾部
top--; //因为没有插入新元素,回滚top值
}
}
else //超过物理块数的元素
{
if(judge(stack,n,x)==-1)//若数组中不存在待插入元素
{
insert(stack,n,x);  //栈法插入(第一个元素出,后面元素前移,新元素从尾部入)
top--; //因为没有插入新元素,回滚top值
}
else //若数组中存在待插入元素
{
move(stack,n,judge(stack,n,x));//移动下标为i的元素到尾部
top--; //因为没有插入新元素,回滚top值
}
}
print(stack,n); //读一个序列号,输出当前数组元素
} return 0;
}

  

运行结果:

操作系统确实博大精深,想想当初开发操作系统的计算机先驱们真是伟大,一点点从硬件层开发到软件层,这期间遇到了多少问题,耗费了多少精力,再次膜拜他们~

果然只有自己动手把代码敲出来才算真正理解了一个算法,学编程一定要动手,不怕难,多思考,才能进步啊~

页面置换算法——最近最久未使用算法(c语言实现)的更多相关文章

  1. 77.LRU Cache(最近最久未使用算法)

    Level:   Hard 题目描述: Design and implement a data structure for Least Recently Used (LRU) cache. It sh ...

  2. 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法

    前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发 ...

  3. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  4. ACM_LRU页面置换算法

    LRU页面置换算法 Time Limit: 2000/1000ms (Java/Others) Problem Description: sss操作系统没听课, 这周的操作系统作业完全不会, 你能帮他 ...

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

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  6. [Operate System & Algorithm] 页面置换算法

    页面置换算法是什么?我们看一下百度百科对页面置换算法给出的定义:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必 ...

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

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  8. 页面置换算法-LRU(Least Recently Used)c++实现

    最近最久未使用(LRU)置换算法 #include <iostream> #include <cstdio> #include <cstring> #include ...

  9. 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)

    LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

随机推荐

  1. 基于CentOS-7 部署open

    一.OpenVPN概述 OpenVPN是一个用于创建专用网络加密通道的源软件.可在公司和家庭之间.部署类似于局域网的专用网络通道 而且OpenVPN使用起来也非常方便.几乎可以运行在任何平台.同时也采 ...

  2. Ambari HDP 下 SPARK2 与 Phoenix 整合

    1.环境说明 操作系统 CentOS Linux release 7.4.1708 (Core) Ambari 2.6.x HDP 2.6.3.0 Spark 2.x Phoenix 4.10.0-H ...

  3. Mac安装Mysql-python遇到的坑,被这俩报错反复摩擦:'my_config.h' file not found 和 IndexError: string index out of range

    最后Stackoverflow上面的大神解决了问题: Link brew install mysql brew unlink mysql brew install mysql-connector-c ...

  4. 通过 python 处理 email - Email via Python

    Email via Python 1 MIME - Multipurpose Internet Mail Extensions SMTP - Simple Message Transport Prot ...

  5. 将win10激活为专业工作站版并且永久激活(图文详细教程)

    简介 win10升级为专业版.教育版.专业工作站版永久激活详细图文教程(注:只要使用相对应的产品密钥,所有的版本都可以激活) win10家庭版其实就是阉割版,越来越多的人想升级为专业版.很多电脑用户选 ...

  6. 论文《Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling》

    Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling 一.主要贡献 1. pro ...

  7. k8s系列---hpa扩容

    centos-master:172.16.100.60 centos-minion:172.16.100.62 k8s,etcd,docker等都是采用yum装的,部署参考的k8s权威指南和一个视频, ...

  8. Django (一) 基础

    创建项目 创建app     python manager.py startapp app01 修改.添加url from django.conf.urls import url,include fr ...

  9. rysnc知识梳理

    rsync语法: Local: rsync [OPTION...] SRC... [DEST] #<===本地传输数据 Access via remote shell: #<===借助通道 ...

  10. redis系列-开篇

    0x0 缘起 笔者所在的公司有一款大DAU(日活)的休闲游戏.这款游戏的后端架构很简单,可以简单理解为通讯-逻辑-存储三层结构.其中存储层大量使用了redis和mysql. 虽然存量用户的增加,red ...