#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. 【leetcode】43. Multiply Strings(大数相乘)

    Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and ...

  2. Linux学习 - 文本编辑器Vim

    一.Vim工作模式 二.命令 插入 a 光标后插入 A 光标所在行尾插入 i 光标前插入 I 光标所在行首插入 o 光标下插入新行 O 光标上插入新行   删除 x 删除光标处字符 nx 删除光标处后 ...

  3. class.getName()和class.getSimpleName()的区别

    根据API中的定义: Class.getName():以String的形式,返回Class对象的"实体"名称: Class.getSimpleName():获取源代码中给出的&qu ...

  4. MFC入门示例之静态文本框、编辑框

    点击按钮计算文本框中文本长度 void CMFCApplication1Dlg::OnBnClickedButton1() { CString strInput; GetDlgItemText(IDC ...

  5. html上传图片的预览功能实现

    表单代码(仅取上传文件部分): <input class="selectImg" style="position:absolute;opacity: 0;width ...

  6. 【C#】【MySQL】【GridView】删除出现Parameter index is out of range

    [编程语言]C# [数据库]MySQL [控件]GridView [问题描述]GridView控件中自带[删除],[编辑],[选择],三个按钮[编辑],[选择]正常使用,但是在使用删除时,却报错Par ...

  7. NGNIX 开启socket分发的使用配置

    worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/err ...

  8. 9、Redis五大数据类型---有序集合Zset(sorted set)

    一.简介 zset与set异同 相同之处: 都是没有重复元素的字符串集合 不同之处: 有序集合zset的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排 ...

  9. Redis集群断电恢复

    再集群整体断点或关闭后,默认启动集群后,会成为孤立的单点,需要删除每个节点的pid文件,node.conf.并将RDB和AOF文件移动出来,再挨个启动每个节点,并用create创建集群脚本,重新创建集 ...

  10. Jenkins pipeline声明式语法

    目录 一.最简结构 二.简单例子 一.最简结构 pipeline {     agent any     stages {         stage('pull') {             st ...