【页面置换算法】LRC算法和FIFS算法
- 算法介绍
- FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。
- LRU(least recently used)是将近期最不会访问的数据给淘汰掉,LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低。LRU算法简单,存储空间没有被浪费,所以还是用的比较广泛的。
- 实现思路
- 数组作为内存块,另一个数组存储页号
- FIFS:
读入的页号首先在内存块中查找,没有查找到,当前物理块若为空,则调入页号,若非空,则按照先到先出的顺序,调入调出,若查找到页号,则继续查找下一个。
- LUR:
内存块为空时,先读入的页号进入内存块直到内存块满,将其等待时间都置为0,接下来的页号,如果在内存块中找到,则将该页号的等待时间置为0,若找不到,则查找内存块中等待时间最长的页号置换出去,新进来的页号等待时间置为0。然后将内存块中其余页号的等待时间都加1。
流程图:
lur:
FIFS:
- 代码
- #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 ;
- }
- #include<iostream>
- 运行结果
【页面置换算法】LRC算法和FIFS算法的更多相关文章
- 网络流之最大流算法(EK算法和Dinc算法)
最大流 网络流的定义: 在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出. 最大流:就是求s-->t的最大流量 假设 u,v 两个 ...
- 单源最短路径算法——Bellman-ford算法和Dijkstra算法
BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V ...
- TCP_NODELAY和TCP_CORK nagle算法和cork算法
TCP_NODELAY 默认情况下,发送数据採用Nagle 算法.这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的.使用TCP_NODELAY选项能够禁止Nag ...
- FIFO调度算法和LRU算法
一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
随机推荐
- linux下双网卡双网关配置
要求: eth0:192.168.100.203 连接内网,网关为192.168.100.1.需要和192.168.10.0.192.168.12.0.192.168.100.0.10.2.2.0.1 ...
- jenkins主要目录用途
主目录 除了Jenkins的WAR包所在目录,Jenkins还有一个更重要的目录——Jenkins的所有重要数据都存放在这个独立的目录中,称为Jenkins主目录,它的默认位置是在当前用户根目录的隐藏 ...
- Linux基础 -Ubuntu
Ubuntu 下: sudo 以管理员权限执行 apt 是Advanced Packaging Tool ,Ubuntu下的安装包管理工具,早期使用apt-get,从Ubuntu16开始建议使用apt ...
- 末学者笔记--apache编译安装及LAMP架构上线
apache介绍 一.Apache的三种工作模式 Apache一共有3种稳定的MPM模式(多进程处理模块),它们分别是prefork.worker.event.http-2.2版本的httpd默认的m ...
- Zabbix (三)
一.zabbix支持的主要监控方式: zabbix主要Agent,Trapper,SNMP,JMX,IPMI这几种监控方式,本文章主要通过监控理论和实际操作测试等方式来简单介绍这几种方式的监控原理和优 ...
- 单机MongoD搭建
MongoD 安装 1 .下载地址: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.8.tgz 2 .添加 ...
- .Net Core小技巧 - Hosted Services + Quartz实现定时任务调度
背景 之前一直有朋友问,.Net Core + Linux环境有没有类似Windows服务的东西.其实是有的,我了解的方法有两种: #1 创建一个ASP.Net Core的Web项目(如Web API ...
- 西风 West Wind Html帮助构建器
https://helpbuilder.west-wind.com/ 示例文档: https://helpbuilder.west-wind.com/docs/_03101e5wp.htm
- json随笔
<script> var obj2={};//这只是JS对象 var obj3={width:100,height:200};/*这跟JSON就更不沾边了,只是JS的对象 */ var o ...
- unity Tab键实现切换输入框功能
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...