#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页面置换算法的更多相关文章

  1. [Operate System & Algorithm] 页面置换算法

    页面置换算法是什么?我们看一下百度百科对页面置换算法给出的定义:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必 ...

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

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

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

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

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

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

  5. FIFO、LRU、OPT页面调度算法及样例

    网上非常多介绍3种页面置换算法的样例和过程是不对的, 本文依据<操作系统概念>第七版对三种算法做介绍,并给出正确的样例以验证算法. 一.FIFO先进先出页面置换算法,创建一个FIFO队列来 ...

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

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

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

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

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

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

  9. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

随机推荐

  1. idea安装插件 JClassLib Bytecode viewer

    目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...

  2. 练习1--爬取btc论坛的title和相应的url

    爬不到此论坛的html源码,应该涉及到反爬技术,以后再来解决,代码如下 import requests from lxml import etree import json class BtcSpid ...

  3. map和forEach的区别

    总结 forEach()可以做到的东西,map()也同样可以.反过来也是如此. map()会分配内存空间存储新数组并返回,forEach()不会返回数据. forEach()允许callback更改原 ...

  4. Java 总纲

    Java基础篇 Java资源下载 IntelliJ IDEA为类和方法自动添加注释 为什么JAVA对象需要实现序列化? maven ubantu安装maven Java Maven项目搭建 maven ...

  5. shell神器curl命令的用法 curl用法实例笔记

    shell神器curl命令的用法举例,如下: ##基本用法(配合sed/awk/grep) $curl http://www.jquerycn.cn ##下载保存 $curl http://www.j ...

  6. springboot+vue集成mavon-editor,开发在线文档知识库

    先睹为快,来看下效果: 技术选型 SpringBoot.Spring Security.Oauth2.Vue-element-admin 集成mavon-editor编辑器 安装 mavon-edit ...

  7. 【Linux】【Services】【Web】Haproxy

    1. 概念 1.1. 官方网站 http://www.haproxy.org/ 2. 安装 yum安装 yum -y install haproxy keepalived 配置haproxy日志,修改 ...

  8. 【Linux】【Services】【Package】rpm包制作

    1. 概念 1.1. BUILD:源代码解压之后存放的位置 1.2. RPMS:制作完成之后的RPM包的存放位置,包括架构的子目录,比如x86,x86_64 1.3. SOURCES:所有的原材料都应 ...

  9. 面渣逆袭:Java集合连环三十问

    大家好,我是老三.上期发布了一篇:面渣逆袭:HashMap追魂二十三问,反响很好! 围观群众纷纷表示 不写,是不可能不写的,只有卷才能维持了生活这样子. 当然,我写的这一系列,不是背诵版,是理解版,很 ...

  10. 「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

    前言 资源是影响 Spark 应用执行效率的一个重要因素.Spark 应用中真正执行 task 的组件是 Executor,可以通过spark.executor.instances 指定 Spark ...