【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x) #define LOG 1 //1-show log 2-no show
#define TYPE 10 //page types
#define NUM 20 //page nums
#define SIZE 5 //cache size struct page{
int id;//page id
int time=0;//different meaning in different algorithm
};
struct page pageList[NUM],cache[SIZE];//page needs,page cache void init(){//random data init
printf("PageList:\n");
srand((unsigned)time(NULL));
for(int i=0;i<NUM;i++)
printf("%d ",pageList[i].id=random(TYPE));
printf("\n");
} void cacheClear(){//clear the cache
for(int i=0;i<SIZE;i++){
cache[i].id=-1;
cache[i].time=0;
}
} int cacheHit(int i){//find cache hit or not
for(int j=0;j<SIZE;j++)
if(cache[j].id==pageList[i].id){
if(LOG)
printf(" hit ");
return j;
}
if(LOG)
printf(" ");
return -1;
} int cacheRoom(){//find cache have free room or not
for(int i=0;i<SIZE;i++)
if(cache[i].id==-1)
return i;
return -1;
} void cacheShow(){//show the cache pages
if(LOG) {
printf("cache: ");
for(int i=0;i<SIZE;i++)
if(cache[i].id==-1){
printf("N\t");
}else
printf("%d\t",cache[i].id);
printf("\n");
}
} void cacheTimeAdd(){//add the pages time in cache
for(int i=0;i<SIZE;i++)
cache[i].time++;
} int FIFOfun(){//FIFO replace
int maxtime=cache[0].time,t=0;
for(int i=1;i<SIZE;i++)
if(maxtime<cache[i].time){
maxtime=cache[i].time;
t=i;
}
return t;
} double FIFO(){//time in FIFO:live time
double ret;
if(LOG)
printf("\nFIFO:\n");
cacheClear();
int hitsum=0;
for(int i=0;i<NUM;i++){
if(LOG)
printf("input:%d\t",pageList[i].id);
int hit=cacheHit(i);
if(hit==-1){//if not hit
int room=cacheRoom();
if(room!=-1)// if have free room
cache[room]=pageList[i];//use room save page
else//if have not free room
cache[FIFOfun()]=pageList[i];//use FIFO to replace
}else{//if hit
hitsum++;
}
cacheShow();
cacheTimeAdd();
}
if(LOG) {
printf("PageReplacement:%d\n",hitsum);
printf("PageFault:%d\n",NUM-hitsum);
}
printf("HitRate:%lf\n",ret=(double)hitsum/NUM);
return ret;
} double LRU(){//time:from last use to now
double ret;
if(LOG)
printf("\nLRU:\n");
cacheClear();
int hitsum=0;
for(int i=0;i<NUM;i++){
if(LOG)
printf("input:%d\t",pageList[i].id);
int hit=cacheHit(i);
if(hit==-1){//if not hit
int room=cacheRoom();
if(room!=-1)//if have free room
cache[room]=pageList[i];//use free room to save page
else//if have not free room
cache[FIFOfun()]=pageList[i];//use LRU ,because time have different meaning ,function is same as FIFO
}else{//if hit
hitsum++;
cache[hit].time=0;//LRU:every hit reflash time
}
cacheShow();
cacheTimeAdd();
}
if(LOG){
printf("PageReplacement:%d\n",hitsum);
printf("PageFault:%d\n",NUM-hitsum);
}
printf("HitRate:%lf\n",ret=(double)hitsum/NUM);
return ret;
} double NUR(){//time:notuse-0 use-1
double ret;
if(LOG)
printf("\nNUR:\n");
cacheClear();
int hitsum=0,clockcur=0;//cur of the cache
for(int i=0;i<NUM;i++){
if(LOG)
printf("input:%d\t",pageList[i].id);
int loop=1,ishit=0;
for(int j=0;j<SIZE;j++){ //first loop to find hit or not
if(cache[j].id==pageList[i].id){
clockcur=j;
cache[clockcur].time=1;
clockcur=(clockcur+1)%SIZE;
ishit=1;
loop=0;// if hit ,there not next loop
break;
}
}
while(loop){//next loop to find one to replace
loop=0;
if(cache[clockcur].id==-1){ //id==-1,free room,loop end
cache[clockcur]=pageList[i];
cache[clockcur].time=1;
}else if(cache[clockcur].time==0){//time==0,replace,loop end
cache[clockcur]=pageList[i];
cache[clockcur].time=1;
}else{ //time==1,change time to 0,loop continue
cache[clockcur].time=0;
loop=1;
}
clockcur=(clockcur+1)%SIZE;
}
if(ishit){//show hit
hitsum++;
if(LOG)
printf(" hit ");
}else{
if(LOG)
printf(" ");
}
cacheShow();
}
if(LOG){
printf("PageReplacement:%d\n",hitsum);
printf("PageFault:%d\n",NUM-hitsum);
}
printf("HitRate:%lf\n",ret=(double)hitsum/NUM);
return ret;
} int OPTfun(int i){//OPT replace
int arr[SIZE];//save cache page next use
for(int j=0;j<SIZE;j++){
arr[j]=INT_MAX;
for(int k=i+1;k<NUM;k++){
if(cache[j].id==pageList[k].id){
arr[j]=k;
break;
}
}
}
int arrmax=arr[0],t=0;//find the longest next use
for(int j=1;j<SIZE;j++){
if(arr[j]>arrmax){
arrmax=arr[j];
t=j;
}
}
return t;
} double OPT(){
double ret;
if(LOG)
printf("\nOPT:\n");
cacheClear();
int hitsum=0;
for(int i=0;i<NUM;i++){
if(LOG)
printf("input:%d\t",pageList[i].id);
int hit=cacheHit(i);
if(hit==-1){//if not hit
int room=cacheRoom();
if(room!=-1)//if have free room
cache[room]=pageList[i];//use free room to save
else// not free room
cache[OPTfun(i)]=pageList[i];//use OPT replace
}else{//if hit
hitsum++;
}
cacheShow();
cacheTimeAdd();
}
if(LOG){
printf("PageReplacement:%d\n",hitsum);
printf("PageFault:%d\n",NUM-hitsum);
}
printf("HitRate:%lf\n",ret=(double)hitsum/NUM);
return ret;
} int main(){
int alltime=LOG?1:100;
double arr[4]={0,0,0,0};
for(int i=0;i<alltime;i++){
init();
arr[0]+=FIFO();
arr[1]+=LRU();
arr[2]+=NUR();
arr[3]+=OPT();
}
printf("\n");
printf("FIFO:%lf\n",arr[0]/alltime);
printf("LRU:%lf\n",arr[1]/alltime);
printf("NUR:%lf\n",arr[2]/alltime);
printf("OPT:%lf\n",arr[3]/alltime);
return 0;
}
【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法的更多相关文章
- [Operate System & Algorithm] 页面置换算法
页面置换算法是什么?我们看一下百度百科对页面置换算法给出的定义:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必 ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发 ...
- FIFO、LRU、OPT页面调度算法及样例
网上非常多介绍3种页面置换算法的样例和过程是不对的, 本文依据<操作系统概念>第七版对三种算法做介绍,并给出正确的样例以验证算法. 一.FIFO先进先出页面置换算法,创建一个FIFO队列来 ...
- 操作系统 页面置换算法LRU和FIFO
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
随机推荐
- 学习java的第十二天
一.今日收获(前两天家里有事,博客都忘了发了,唉) 1.通过看哔哩哔哩看黑马程序员的教学视频,学习了java中的数据类型自动转换.强制转换及注意事项三节 2.简单看了看完全学习手册 二.今日问题 1. ...
- 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))
1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...
- [PE结构]导出表结构浅析
导出函数的总数-->以导出函数序号最大的减最小的+1,但导出函数序号是可自定义的,所以NumbersOfFunctions是不准确的 1.根据函数名称找,函数名称表->对应索引函数序号表中 ...
- Maven 目录结构[转载]
转载至:http://www.cnblogs.com/haippy/archive/2012/07/05/2577233.html Maven 标准目录结构 好的目录结构可以使开发人员更容易理解项目, ...
- Output of C++ Program | Set 3
Predict the output of below C++ programs. Question 1 1 #include<iostream> 2 using namespace st ...
- mysql与clickhouse的字段类型对应表
- linux系统的一些常用命令
cd 进入某个目录 ifconfig 查看本机的ip cp (要复制的文件的位置) (要把文件复制的位置) ll 查看文件下,文件的操作权限 ls查看该文件夹下的有那些文件和文件夹 vi filena ...
- SpringBoot 项目不加载 application.properties 配置文件
起因:新安装的idea第一次运行springboot项目报url错误(Failed to configure a DataSource: 'url' attribute is not specifie ...
- mybatis处理集合、数组参数使用in查询等语句的两种方法
对于mybatis的参数类型是集合数组的时候进行查询. 第一种:参数list使用mybatis的标签 SELECT * FROM TABLE_NAME AS a <where> <i ...
- 【C/C++】子数组的最大累加和问题
#include <bits/stdc++.h> using namespace std; class Solution { public: /** * max sum of the su ...