#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 - 1050)To the Max 最大连续子矩阵和

    Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...

  2. PIE SDK打开矢量数据

    1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...

  3. .net: 泛型List<T> 轉換成 DataTable類型

    public static DataTable ListToDataTable<T>(List<T> entitys) { //检查实体集合不能为空 ) { return ne ...

  4. oracle 基础知识(十四)----索引扫描

    (1)索引唯一扫描(index unique scan) 通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个 ...

  5. mysql 学习之 DDl语句

    mysql 1,登入mysq1: mysql -uroot -p  ---->密码隐藏登入好点 2,mysql操作: 创建数据库:create databases test1; 查看数据库:sh ...

  6. python-URL转jpg图片

    问题描述 有图片地址,可以在网页打开 URL:https://bdfile.bluemoon.com.cn/group2/M00/0A/BA/wKg_HlwzY1SAIdXDAAFyo-ZOLKQ39 ...

  7. Java基础22-Static关键字

    1.static关键字 public class Test{ public static void main(String[] args){ Persion p1=new Persion(); Per ...

  8. filter 静态资源

    package com.itheima.web.filter; import java.io.IOException; import javax.servlet.Filter; import java ...

  9. Beam概念学习系列之SDKs

    不多说,直接上干货! https://beam.apache.org/get-started/beam-overview/ Beam SDK 提供了一个统一的编程模型,来处理任意规模的数据集,其中包括 ...

  10. 让C:\Users文件夹放在D盘

    新安装win7 在安装Win7的过程中,要求输入用户名及密码的时候,先不如输入任何信息,按“Shift+F10”呼出DOS窗口,输入以下命令: robocopy "C:\Users" ...