暴力直接上代码,主要是用了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. 编译:一个 C 程序的艺术之旅(转载)

    C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理.编译.汇编.链接这四道工序?让我们从这段简单的 C 程序开始. 为什么要编译 这并不是一个简单的问题.我们知道 ...

  2. java学习之IO装饰设计模式

    装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...

  3. QT中QWidget类简介

    一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject,  大家可以查阅Qt source 即可 ...

  4. CUDA samples 2.3节 用CUDA示例来创建CUDA项目

    2.3.1. Creating CUDA Projects for Windows 略 2.3.2  Creating CUDA Projects for Linux 默认的samples的安装路径 ...

  5. Android经常使用UI组件 - TextView

    TextView是Android里面用的最多的UI组件,一般使用在须要显示一些信息的时候,其不能输入,仅仅能初始设定或者在程序中改动. 实例:TextViewDemo 执行效果: 代码清单: 布局文件 ...

  6. rbd块映射

    rbd块映射: root@u18:~# rbd create kvm/test002.img --size root@u18:~# rbd info kvm/test002.img rbd image ...

  7. ubuntu安装greenplum依赖包

    ubuntu安装greenplum的过程中有两个比较难找的包,特地写出来给大家分享一下: 错误提示1:configure: error: header file <ldap.h> is r ...

  8. [Swust OJ 763]--校门外的树 Plus(暴力枚举)

    题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有 ...

  9. Android:WebView(慕课网)

    使用webview最重要的三点: 1 WebView加载本地资源(webView.loadUrl("file:///android_asset/example.html");) 2 ...

  10. javascript时间函数

    //时间函数 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear();    //获取完 ...