操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率
暴力直接上代码,主要是用了vector来实现,有些方法比較费时,不太好,请各位大神斧正。这是个人的作业, 这是代码下载页http://download.csdn.net/detail/l631068264/7644569 里面还有多级反馈队列进程调度的MFC版
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <stdlib.h> /*用到了srand函数*/
#include <time.h> /*用到了time函数*/
using namespace std; const int AddressSize = 320;//地址数组大小
const int AddressRange = 319;//地址值范围
struct TimeNode{
int data;//页面序列号
int read;//引用位
};
class PageReplace{
public:
void Create();//创建地址序列
void AddChangePage(int size);//转换为页面序列
void Print();//打印控制
PageReplace();
~PageReplace();
private:
int PageSize;//页面大小
int PageNum;//页面数
int* Address;//地址数组
vector< int > PageOrder;//页面序列
double OPT(int j);//j 是物理块数
double FIFO(int j);
double LRU(int j);
double CLOCK(int j);
};
PageReplace::PageReplace()
{
Address = new int[AddressSize];
}
PageReplace::~PageReplace()
{
delete[]Address;
}
void PageReplace::Create()
{
srand((unsigned)time(NULL));
int i;
int Range = AddressRange;
for (i=0;i<AddressSize;i=i+5)
{
Address[i] = rand()%AddressRange;
Address[i+1] = Address[i]+1;
Address[i+2] = rand()%Address[i+1];
Address[i+3] = Address[i+2]+1;
//rand%(b-a+1) + a =>[a,b]随机数
Address[i+4] = Address[i+3]+1+(rand()%AddressRange-Address[i+3]);
}
for (int j=0;j<AddressSize;j++)
{
printf("%3d ",Address[j]);
if ((j+1)%18==0)
{
cout<<endl;
}
}
cout<<endl;
}
void PageReplace::AddChangePage(int size)
{
//页面大小 K
PageSize = size;
int i,j;
int AddNum_PerPage = 10*PageSize;//每K 10条指令排列虚地址 每页指令数
PageNum = AddressSize/AddNum_PerPage;//页面数
for (i=0;i<AddressSize-1;i++)
{//计算页号
int m = Address[i]/AddNum_PerPage;
int n = Address[i+1]/AddNum_PerPage;
if (m != n)
{//序列相邻同样的不要
PageOrder.push_back(m);
}
}
for (j=0;j<PageOrder.size();j++)
{
printf("%2d ",PageOrder[j]);
if ((j+1)%20==0)
{
cout<<endl;
}
}
cout<<endl;
}
double PageReplace::OPT(int j)
{
vector<int> opt;//取代内存块
int i,d2,k;
double l=0;
for (i=0;i<PageOrder.size();i++)
{//缺页推断
vector<int >::iterator flag = find(opt.begin(),opt.end(),PageOrder[i]);
if (flag == opt.end())
{
l++;//缺页数
if (opt.size()<j)
{
opt.push_back(PageOrder[i]);
}
else
{//找出当前序列位置 最迟訪问
vector<int>::iterator m = find(PageOrder.begin()+i,PageOrder.end(),PageOrder[i]);
int max = 0;
for ( k=0;k<opt.size();k++)
{
vector<int>::iterator n = find(PageOrder.begin()+i,PageOrder.end(),opt[k]);
if (max < n-m)
{
max = n-m;
d2 = k;//块下标
}
}
opt[d2] = PageOrder[i];
}
}
}
return (double)l/PageOrder.size();//缺页率
} double PageReplace::FIFO(int j)
{
int i;
double l=0;
vector<int> fifo; for (i=0;i<PageOrder.size();i++)
{
vector<int >::iterator flag = find(fifo.begin(),fifo.end(),PageOrder[i]);
if (flag==fifo.end())
{
l++;
if (fifo.size()<j)
{
//头插入
fifo.push_back(PageOrder[i]);
}
else{
fifo.erase(fifo.begin());
fifo.push_back(PageOrder[i]);
}
}
}
return (double)l/PageOrder.size();
}
double PageReplace::LRU(int j)
{
vector<int> lru;
int i;
double l=0;
for (i=0;i<PageOrder.size();i++)
{
vector<int >::iterator flag = find(lru.begin(),lru.end(),PageOrder[i]);
if (flag == lru.end())
{//缺页
l++;
if (lru.size()<j)
{ //头插入
lru.push_back(PageOrder[i]);
}
else{
lru.erase(lru.begin());
lru.push_back(PageOrder[i]);
}
}
else
{//不缺页
for (int m =0 ;m<lru.size();m++)
{
if (lru[m] == PageOrder[i])
{
lru.erase(lru.begin()+m);
lru.push_back(PageOrder[i]);
break;
}
}
}
}
return (double)l/PageOrder.size();
}
double PageReplace::CLOCK(int j)
{
int i,m,flag;
double l=0;
TimeNode p;
vector<TimeNode> time;
for (i=0;i<PageOrder.size();i++)
{
for (m=0;m<time.size();m++)
{
if(time[m].data ==PageOrder[i])
{
flag = m;
break;
}
}
//vector<TimeNode>::iterator flag = find(time.begin(),time.end(),PageOrder[i]);
if (flag<0)
{
l++;
if (time.size()<j)
{
p.data = PageOrder[i];
p.read = 0;
time.push_back(p);
}
else
{
for (m=0;m<time.size();m++)
if (time[m].read == 0)
{
time.erase(time.begin()+m);
p.data = PageOrder[i];
p.read = 0;
time.push_back(p);
break;
}
}
}
else
{
time[flag].read = 1;
}
//相当于定时器 每调用5个页面全部引用位清0
if ((i+1)%5 == 0)
{
for (m=0;m<time.size();m++)
time[m].read = 0;
}
}
return (double)l/PageOrder.size();
}
void PageReplace::Print()
{
int i;
printf("页面大小 %d K\n",PageSize);
printf("输入分配内存块数( 1 ~ %d )\n",PageNum);
scanf("%d",&i);
printf("OPT 算法 缺页中断率: %.2f%%\n",OPT(i)*100);
printf("FIFO 算法 缺页中断率: %.2f%%\n",FIFO(i)*100);
printf("LRU 算法 缺页中断率: %.2f%%\n",LRU(i)*100);
printf("CLOCK 算法 缺页中断率: %.2f%%\n",CLOCK(i)*100);
cout<<endl;
} int main()
{
PageReplace p;
bool flag=true;
while(flag)
{
cout<<"1. 页面置换实验 0. 退出"<<endl;
int choice,size;
cin>>choice;
switch (choice)
{
case 1:
cout<<"生成新序列"<<endl;
p.Create();
cout<<"输入页面大小(1/2/4/8/16)单位 K 按0 退出页面大小选择"<<endl;
cin>>size;
while (size)
{
p.AddChangePage(size);
p.Print(); cout<<"输入页面大小(1/2/4/8/16)单位 K 按0 退出页面大小选择"<<endl;
cin>>size;
}
break;
case 0:
flag = false;
break;
}
}
return 0;
}
操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率的更多相关文章
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...
- 页面置换算法之Clock算法
1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内 ...
- 【页面置换算法】LRC算法和FIFS算法
算法介绍 FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针, ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发 ...
- 操作系统 页面置换算法LRU和FIFO
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...
- 缓存算法(页面置换算法)-FIFO、LFU、LRU
在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...
随机推荐
- ajax 基础实例
优点:使用ajax读取数据文件,不需要刷新页面就能取出文件数据 目 录 1.0 基于ajax请求的理论支持 1.1 js 实现jquray中 ajax请求功能 基于ajax请求的理论支持 < ...
- JAVA的一些小笔记
构造块优先于构造方法执行,而且每当有一个新的实例化对象产生时,就会重复执行构造块的程序. 静态块优先于构造块执行,而且不管有多少个实例化对象产生,静态块只会执行一次,它的主要作用是为类中的static ...
- 转:Javascript的10个设计缺陷
作者: 阮一峰 日期: 2011年6月30日 前几篇文章,我经常说Javascript的设计不够严谨,有很多失误. 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设 ...
- 第2次增加ssh 主机信任脚本
dr-mysql01:/root# cat a1.sh #用户名 uname="$1" #密码 passwd="$2" #执行检测并安装expect模块 ep= ...
- 基于visual Studio2013解决C语言竞赛题之0416完数
题目 解决代码及点评 完数的解决方案依旧是遍历,然后写出判断完数的函数进行处理 /************************************************** ...
- oracle dg坏境主库redolog改动大小
--备库standby 主库四个redolog 曾经都是50M大小 SQL> alter database recover managed standby database cancel; ...
- android的fragment基本介绍
可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1.使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容. 如果您的 ...
- Sort List 分类: leetcode 算法 2015-07-10 15:35 1人阅读 评论(0) 收藏
对链表进行排序,要求时间复杂度为O(n log n) ,不使用额外的空间. 我一开始的想法是借助quicksort的思想,代码如下: # time O(nlog(n)) # Definition fo ...
- source insight 中文注释为乱码解决
1. source insight 中文注释为乱码解决 http://blog.csdn.net/bingfeng1210/article/details/7527059 2. Source Insi ...
- GitHub 使用教程图文详解
大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...