暴力直接上代码,主要是用了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 计算缺页率的更多相关文章

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

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

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

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

  3. 页面置换算法之Clock算法

    1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内 ...

  4. 【页面置换算法】LRC算法和FIFS算法

    算法介绍 FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针, ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Unable to connect to your virtual device!解决方法

    使用Genymotion安卓模拟器的用户,很多朋友在启动安卓系统的时候就弹出了以下英文,不知道如何处理,今天电脑知识网小编来教您处理Genymotion安卓模拟器启动出错的问题. Error Unab ...

  2. MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

    ////////////////////////////////////////////////////////////////////////////////////                 ...

  3. Average(模拟)

      Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  4. hdu 1232 畅通project

    题目: 链接:点击打开链接 算法: 赤裸裸的并查集. 代码: #include<iostream> #include<cstdio> #include<cstring&g ...

  5. RGB,CMYK,HSB各种颜色表示的转换 C#语言

    Introduction Why an article on "colors"? It's the same question I asked myself before writ ...

  6. 简单仿京东导航下拉菜单 javascript

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  7. Python 2.7 学习笔记 模块和包

    我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...

  8. redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存

    redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用  http://liuyieyer.iteye.com/blog/207809 ...

  9. php __autoload使用

    官方介绍: void __autoload ( string $class ) 你可以通过定义这个函数来启用类的自动加载. 转载一篇文章: PHP autoload机制详解 (1) autoload机 ...

  10. Mojo 返回一维和二维数组

    这种情况不断的网数组@arr2里放入数据,返回的内容为: 这种情况是一维数组: while( $selStmt->fetch() ){ print "\$a1 is $a1\n&quo ...