#include<iostream>
#include<unistd.h>
#include<vector>
#include<wait.h>
#include<iterator>
#include<ctime>
#include<cmath>
#include<algorithm> using namespace std; const int total_i = 10;
const int mf1 = 3;
const int mf2 = 4; vector<int> access_series(total_i); int firstEmpty(vector<int>& v,int n)
{
for(int i = 0;i < n;++i)
if(v[i] == -1)
return i;
return -1;
} int getLen()
{
int index = 0;
vector<int> v = access_series;
sort(v.begin(),v.end());
for(int i = 0;i < total_i;++i)
{
if (v[index] != v[i])
v[++index] = v[i];
}
return index + 1;
} int getLeast(vector<int>& v,int n)
{
int min = v[0];
int position = 0;
for(int i = 0;i < n;++i)
{
if(v[i] != 0 && v[i] < min)
{
min = v[i];
position = i;
}
}
return position;
} void change(vector<int>& state,int size)
{
for(int k = 0;k < size;++k)
if(state[k] != -1)
state[k] >>= 1;
} void FIFO(int n)
{
int miss = 0;
vector<int> v(n,-1);
for(int i = 0;i < total_i;++i)
{
bool flag = false;
for(int j = 0;j < n;++j)
{
if(v[j] == access_series[i])
{
flag = true;
break;
}
}
if(!flag)
{
++miss;
for(int k = 0;k < n - 1;++k)
v[k] = v[k + 1];
v[n - 1] = access_series[i];
}
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
cout<<"\npage miss:"<<miss * 1.0 / total_i<<"\n";
} void LRU(int n)
{
int miss = 0;
vector<int> v(n,-1);
int size = getLen();
vector<int> state(size,0);
for(int i = 0;i < total_i;++i)
{
int pos = -1;
for(int j = 0;j < n;++j)
{
if(v[j] == access_series[i])
{
pos = j;
break;
}
}
if(pos == -1)//not found
{
++miss;
int p = firstEmpty(v,n);
if(p != -1)//has empty position
{
change(state,size);
v[p] = access_series[i];
state[p] = pow(2,size - 1);
}
else
{
change(state,size);
int p1 = getLeast(state,size);
v[p1] = access_series[i];
state[p1] = pow(2,size - 1);
}
}
else
{
change(state,size);
//state[pos] >>= 1;
state[pos] += pow(2,size - 1);
}
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
cout<<"\npage miss:"<<miss * 1.0 / total_i<<"\n";
} int main()
{
int p1,p2,p3;
srand((unsigned)time(0));
for(int i = 0;i < total_i;++i)
access_series[i] = rand() % 6;
//cin>>access_series[i];
copy(access_series.begin(),access_series.end(),ostream_iterator<int>(cout," "));
cout<<endl;
while((p1 = fork()) == -1);
if(p1 == 0)
{
cout<<"\nFIFO:\n";
FIFO(mf1);
}
else
{
wait(0);
while((p2 = fork()) == -1);
if(p2 == 0)
{
cout<<"\nFIFO:\n";
FIFO(mf2);
}
else
{
wait(0);
while((p3 = fork()) == -1);
if(p3 == 0)
{
cout<<"\nLRU:\n";
LRU(mf1);
}
}
}
return 0;
}

操作系统页面置换算法之FIFO,LRU的更多相关文章

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

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

  2. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

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

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

  4. 缓存算法(页面置换算法)-FIFO、LFU、LRU

    在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...

  5. c模拟 页式管理页面置换算法之FIFO

    写的操作系统作业.... 放上来给需要的小伙伴 需要注意的地方: 1.该算法只涉及单进程 2.只是用c模拟FIFO的思想 FIFO思想:选择在内存中存活时间最久的页面淘汰 关于该算法我的理解: 一个进 ...

  6. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  7. 虚存管理页面置换算法 — FIFO和RUL算法模拟实现

    本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...

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

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

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

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

随机推荐

  1. POJ_3262 Protecting the Flowers 【贪心】

    一.题面 POJ3262 二.分析 这题要往贪心上面想应该还是很容易的,但问题是要证明为什么比值关系就能满足. 可以选择几个去分析,入1-6  与 2-15  和 1-6 与2-5 和 1-6 与 2 ...

  2. 正确优雅地解决用户退出——JSP及Struts解决方案

    摘要       在一个有密码保护的Web应用中,正确处理用户退出过程并不仅仅只需调用HttpSession的invalidate()方法.现在大部分浏览器上都有后退和前进按钮,允许用户后退或前进到一 ...

  3. HDU4499

    In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move horizontally or ...

  4. vue搭建后台管理页面(点击左侧导航,切换右侧内容)

    home.vue页面 <template> <div style="background-color: #EBEBEB;min-height:900px"> ...

  5. Java基础21-构造函数之间的调用

    public class Test{ public static void main(String[] args){ Persion p2=new Persion("小明",22) ...

  6. (转)shell命令:echo命令详解

    shell命令:echo命令详解 原文:https://www.cnblogs.com/xyz0601/archive/2015/04/23/4450736.html 功能说明:显示文字. 语 法:e ...

  7. (转)8个有力的Awk内建变量

    8个有力的Awk内建变量 翻译原文:8 Powerful Awk Built-in Variableshttp://www.thegeekstuff.com/这个博客真是不错. 这篇文章是Awk Tu ...

  8. 面向切面编程 (AOP )

    什么是面向切面编程? 面向切面编程就是(AOP --- aspect-oriented programming), 在百科上说: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一 ...

  9. 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  10. 数据库和AI的一次火花

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由宗文 发表于云+社区专栏 | 导语 通过历史数据,基于时间序列来预测未来. 我们生活中很多数据是有时间维度的.比如说天气或者股票价格. ...