操作系统的页面置换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 ...
随机推荐
- hibernate 事务的隔离级别 5.1
脏读不可重复读幻读可序列化(符合事务的四个特性的正常情况 ) 解释: 脏读:事务A对数据1做了更新,但是还没有来得及提交 此时事务B对数据1进行了查询获得了事务A更新后的数据, 但是事务A因为一些原因 ...
- 结构体struct和联合体union以及enum枚举体5的区别
下面来自wikipedia: In computer science, a union is a value that may have any of several representations ...
- Fedora 17 安装 完全 指南
一.了解Fedora 17先来了解一下Fedora吧.它是由Red Hat赞助的一个全球性开源项目,秉承“自由”.“友爱”.“杰出”.“前卫”宗旨. 1.Fedora 17的主要系统改进内核:采用3. ...
- css中border-width 属性
border-width属性可能的值 值 描述 thin 定义细的边框. medium 默认.定义中等的边框. thick 定义粗的边框. length 允许您自定义边框的宽度. inherit 规定 ...
- .net 弹窗方式
Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('请输入 ...
- [javascript]在浏览器端应用cookie记住用户名
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【 D3.js 入门系列 — 4 】 如何使用比例尺( scale )
上一章中使用了一个很重要的概念 — 比例尺( scale ),本节将解说其使用方法. 1. 最大值和最小值 在介绍比例尺( scale )之前,先介绍两个经常和比例尺一起出现的函数,在[第3章]中也出 ...
- spring-mvc关键点掌握 high level
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- 同步fifo的verilogHDL设计实例
原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: /* date : 2014/10/14 version : modelsim ...
- QTexstStream的操作对象是QIODevice(因此QFile,QBuffer,QProcess,QTcpSocket都可以使用),或者QString
QTexstStream用于读写纯文本以及HTML,XML等文本格式的文件,此类考虑了Unicode编码与系统本地编码的或其它任意编码之间的转换问题,别且明确地处理了因使用不同的操作系统而导致的行尾符 ...