经过读题,我觉得这两个题目要表达的意思应该是完全相同的,当然也可能是我的理解出现了偏差。所以就把LRU 和 LFT 当作是一个。

 当然,因为这个缘故,我把最近最久未使用的LRU当作了最久未使用写到底,到最后发现还是更像最不常用置换算法LFT一些。

  下面就是代码了,用C语言链表实现,希望能给同学们提供一种思路。

Main函数中有测试样例,思路什么的就不写了,代码中都已经注释出来了,如果有疑问的话请评论区留言。


LFT.h

#include<stdio.h>
#include<time.h>
#define MaxSize 21
typedef struct Node{struct Node *next;      //页面指针,指向下一个 struct Node *pre;       //指向上一个 int num;                //所属页面号
}Node;int n;                    //总的任务个数
int m;                      //主存大小
int used;                   //已经使用的主存块个数
int missNum = 0;            //缺页次数
Node *FirstNode;            //首元结点
Node *current;              //当前任务指针
Node *last;                 //指向最后一个任务
int process[MaxSize];       //任务队列
double missRate;            //缺页中断率
double t;                   //时间 //初始化首元结点
void init(){FirstNode = (Node*)malloc(sizeof(Node));FirstNode->num = -1;FirstNode->next = FirstNode;FirstNode->pre = FirstNode;current = FirstNode;}//显示当前主存中的页面
void show(){Node *show;show = FirstNode->next;printf("   ·当前主存中页面为: ");while(show->num!=-1){printf("%d ",show->num);show = show->next;}printf("\n");
}void miss(){printf("\n※ 总共的缺页次数为: %d\n",missNum);printf("※ 缺页中断率为: %.3lf",missNum*1.0/n);
}void input(){printf("请输入任务数: ");scanf("%d",&n); printf("请输入主存大小: ");scanf("%d",&m);for(int i=1;i<=n;i++){printf("请输入第%d任务所在页面号: ",i);scanf("%d",&process[i]); }
} //最久未使用页面置换算法
double LFT(){printf("************  最久未使用算法  ************\n");//输入 input();    clock_t start,end;//计时start = clock();//初始化 init();//算法开始 printf("\n************  系统调用如下  ************\n");for(int i=1; i<=n; i++){ printf("\n第%d次查找页面:\n",i);//第一次必定发生缺页中断 if(i==1){printf("\n     ·发生缺页中断\n");Node *node;node = (Node*)malloc(sizeof(Node));node->num = process[1];node->next = FirstNode;node->pre = FirstNode;FirstNode->next = node;FirstNode->pre = node;missNum++;used++;}//接下来的要检查主存中有没有任务所在页数 else{while(current->num != process[i]) {//一直往下找 current = current->next;//current指向首元结点,证明发生了缺页中断 if(current->num == -1){printf("\n   ·发生缺页中断\n");//如果主存块满了,删除最后没有用过的 if(used >= m){last = current->pre;last->pre->next = current;current->pre = last->pre; last->next = NULL;last->pre = NULL;printf("    ·删除页面: %d\n",last->num); free(last);}//当前任务加入到队头(头插法) Node *node;node = (Node*)malloc(sizeof(Node));node->num = process[i];node->pre = current;node->next = current->next;current->next->pre = node;current->next = node;missNum++;used++;break; }//if }//whileif(current->num == process[i]){//证明不是因为break跳出的while循环,将此节点插入到队头 current->pre->next = current->next;current->next->pre = current->pre;current->pre = FirstNode;current->next = FirstNode->next;FirstNode->next->pre = current;FirstNode->next = current;}}//i>1end = clock();t =(double)( end - start );show();}//formiss();return t;
}

main:

#include"LFT.h"
#define totalTime CLOCKS_PER_SECint main()
{double t;t = LFT();printf("\n\n调用Lft算法共消耗时间:%.3lf ms\n",t/totalTime);system("pause");return 0;
}/*
18
5
7
0
1
2
0
3
0
4
2
3
0
1
1
7
0
1
0
3
*/

最不常用置换算法LFT 最久未使用置换算法LRU 操作系统 C语言链表实现相关推荐

  1. 页面置换之最近最久未使用置换算法

    LRU(Least Recently Used)置换算法 LRU置换算法是选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个 ...

  2. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...

    LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...

  3. 3.2.3 OS之页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)

    文章目录 0.思维导图 1.最佳置换算法---OPT 2.先进先出置换算法---FIFO 3.最近最久未使用置换算法---LRU 4.时钟置换算法---CLOCK 5.改造型时钟置换算法 0.思维导图 ...

  4. 操作系统-最近最久未使用置换算法

    思想:赋予每个页面一个访问字段,用来记录相应页面自上次被访问以来所经历的时间t,当淘汰一个页面时,应选择所有页面中其t值最大的页面,即内存中最近一段时间内最长时间未被使用的页面予以淘汰 优点:由于考虑 ...

  5. 缓存淘汰策略——最近最久未使用策略(LRU)

    什么是缓存淘汰策略? 缓存位于内存中,而内存的空间很有限,所以缓存也有一个能使用的最大空间,当缓存中的数据超过这个最大空间时,就要使用缓存淘汰策略淘汰一些数据,空出空间给其他数据使用. 最近最久未使用 ...

  6. 最近最久未使用页面置换算法

    在一个请求分页系统中,采用最近最久未使用页面置换算法时,假如一个作业的页面走向为4.3.2.1.4.3.5.4.3.2.1.5,当分配给该作业的物理块数M分别为3和4时,试计算在访问过程中所发生的缺页 ...

  7. python实现使用最近最久未使用算法的请求分页存储管理_答疑(存储管理)之一...

    题目1:有一个计算机的虚存系统采用请求式分页机制.其中,从内存读/写一个单元需要花费100ns.该虚存系统由内存和硬盘组成,硬盘具有以下参数:转速7200RPM,磁盘块大小4KB,平均寻道时间5ms, ...

  8. 操作系统-先进先出和最近最久未使用算法-C语言

    先进先出(FIFO) 按调用顺序依次把页面调入内存,当内存还没满时,直接调入:当内存满了再调入时,如果需要置换页面,被置换的页面权值为最小值,则修改页面的权值,刚调入的页面权值为最大值,其他页面的权值 ...

  9. 「五大常用算法」一文图解分治算法和思想

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 前言 分 ...

最新文章

  1. AOP的两种实现方式
  2. ideal2018提示内存不足_IntelliJ IDEA 2018 设置代码超出限制自动换行(最新版)
  3. php检查图片大小,如何利用Javascript函数检查图片大小
  4. tencent intern learning
  5. win7讲述人修复_揭秘:干掉了win7!为何win10屡被吐槽它却“永世留芳”
  6. 在线代码编辑器 Codemirror 的轻量级 React 组件
  7. 6 操作系统第二章 进程管理 处理机调度
  8. [转]HttpWatch工具简介及使用技巧
  9. 开发人员的U盘,最好是128G
  10. Open browser failed!! Please check if you have installed the browser correctly! Alt + B无效 - VS Code
  11. lena.raw图片文件下载及打开方式
  12. Spring Boot + Vue 开发的物流管理系统,附源码
  13. 全类销项发票电子化管理系统:iBox+RPA的开票流程数字化
  14. JS里给日期增加n个月的方法
  15. 使用 Convex 进行状态管理的指南
  16. 绿色商业包装材料在行业中的重要地位
  17. 喧喧聊天的协同开源办公工具环境搭建
  18. 中兴对华为NB-IoT的大反击 - CLAA
  19. ARM通用寄存器及状态寄存器详解
  20. 【论文翻译_自监督知识蒸馏】Self-supervised Label Augmentation via Input Transformations

热门文章

  1. 电容笔哪个品牌好?十大电容笔知名品牌
  2. 湖北二本计算机大学录取分数线,湖北二本投档分数线
  3. Bat命令学习-FOR参数F的选项delims与tokens
  4. smartupload java_java servlet通过SmartUpload开发文件批量上传、批量下载源码分享
  5. U盘变成RAW格式,数据如何恢复?
  6. java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
  7. RK3399适配OV8858摄像头
  8. java手机验证码代码_发送手机验证码
  9. 揭秘软件开发中的达摩克利斯之剑
  10. FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of me