首页 > 代码库 > lru算法
lru算法
/*请求页式存储管理的页面置换算法
一.实验目的
通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二.实验属性
设计
三.实验内容
1.通过随机数产生一个指令序列
2.将指令序列变换成为页地址流
设页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条至第9条指令为第0页;第10条至19条指令为第1页;…第310条至319条指令为第31页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
最近最少使用算法(LRU)
命中率=1-页面失效次数/页地址流长度
四.思路
关于随机数的产生办法。首先要初始化设置随机数,产生序列的开始点,例如,通过下列语句实现:
计算不同算法的命中率
rate=1-1.0﹡U/320 ;
/*
输出结果
随机产生一个进程序列号为:
1 6 2 9 6 5 4 9 9 8 2 9 8 6 4 1
请输入 0 1,1运行 0退出1
更换的位置
0 1 2 3 0 2 1 0 2 0 3
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 6 | 2 | 9 | 6 | 5 | 4 | 9 | 9 | 8 | 2 | 9 | 8 | 6 | 4 | 1 |
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 2 | 2 | 2 | 2 | 4 | 4 |
| 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
| 0 | 0 | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 |
| 0 | 0 | 0 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 |
调入队列为: 1 6 2 9 5 4 8 2 6 4 1
缺页次数为: 11
缺页率: 0.687500
请输入 0 1,1运行 0退出
一.实验目的
通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二.实验属性
设计
三.实验内容
1.通过随机数产生一个指令序列
2.将指令序列变换成为页地址流
设页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条至第9条指令为第0页;第10条至19条指令为第1页;…第310条至319条指令为第31页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
最近最少使用算法(LRU)
命中率=1-页面失效次数/页地址流长度
四.思路
关于随机数的产生办法。首先要初始化设置随机数,产生序列的开始点,例如,通过下列语句实现:
计算不同算法的命中率
rate=1-1.0﹡U/320 ;
/*
输出结果
随机产生一个进程序列号为:
1 6 2 9 6 5 4 9 9 8 2 9 8 6 4 1
请输入 0 1,1运行 0退出1
更换的位置
0 1 2 3 0 2 1 0 2 0 3
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 6 | 2 | 9 | 6 | 5 | 4 | 9 | 9 | 8 | 2 | 9 | 8 | 6 | 4 | 1 |
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 2 | 2 | 2 | 2 | 4 | 4 |
| 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
| 0 | 0 | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 |
| 0 | 0 | 0 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 |
调入队列为: 1 6 2 9 5 4 8 2 6 4 1
缺页次数为: 11
缺页率: 0.687500
请输入 0 1,1运行 0退出
*/
#include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/ #define wulisize 4 //物理块大小 #define jincsize 16 //进程大小 typedef struct page { int num; /*记录页面号*/ int time; /*记录调入内存时间*/ }Page; /* 页面逻辑结构,结构为方便算法实现设计*/ Page b[wulisize]; /*内存单元数*/ int count = 0; //统计页面缺页次数 int c[wulisize][jincsize]={0}; /*暂保存内存当前的状态:缓冲区*/ int jinc[jincsize]={0}; //进程序列号 int queue[100]={0}; /*记录调入队列*/ int q=0;//记录队列数 /*初始化内存单元、缓冲区*/ void Init() { int i; for(i=0;i<jincsize;i++) { b[i].num=0; b[i].time=0; } } int* build()//随机产生序列号函数 { printf("随机产生一个进程序列号为:\n"); int i = 0; for(i=0; i<jincsize; i++) { jinc[i] = 10*rand()/(RAND_MAX+1)+1; printf("%d ",jinc[i]); } printf("\n"); return(jinc); } int searchjinc(int i)//有无相同进程 { for(int j = 0; j < wulisize; j++) if(b[j].num == jinc[i]) return j; return -1; } int searchwu(){//有无空闲区 for(int j=0; j<wulisize; j++) if(b[j].num == 0) return j; return -1; } int getmax() //获取最大的time号区 { int i; int max=-1; int tag=0; for(i=0;i<wulisize;i++) { if(b[i].time>max) { max=b[i].time; tag=i; } } return tag; } void empty() { Init(); q=0; count=0; //计数器置零 } void LRU() { Init(); int m,n;//n表示有无相同进程在,m表示是否有物理空闲区域 int v;//更换区号 int i; for(i = 0; i<jincsize; i++)//i是进程号 { n=searchjinc(i); if (n != -1)//有相同进程 { b[n].time=1; } else //无相同进程 { m=searchwu(); if (m != -1)//有空闲 { b[m].time=1; b[m].num=jinc[i]; ++count; printf("%d ", m);//更换的位置 } else//无空闲 { v=getmax(); printf("%d ", v);//更换的位置 b[v].time=1; b[v].num=jinc[i]; ++count; } queue[q++]=jinc[i]; } for (int hang = 0; hang < wulisize; ++hang) { c[hang][i]=b[hang].num;//用于输出来查看的 if(b[hang].time != 0)b[hang].time++;//时间+1; } } printf("\n"); //以下是输出 Myprintf; for(int j=0;j<jincsize;j++) printf("|%2d ",jinc[j]); printf("|\n"); Myprintf; for(i=0;i<wulisize;i++) { for(int j=0;j<jincsize;j++) { if(c[i][j]==-1) printf("|%2c ",32); else printf("|%2d ",c[i][j]); } printf("|\n"); } printf("\n调入队列为:"); for(i=0;i<q;i++) printf("%3d",queue[i]); printf("\n缺页次数为:%6d\n缺页率:%16.6f",q,(float)(q)/jincsize); } void main() { int sel ; build(); do{ printf("请输入 0 1,1运行 0退出"); scanf("%d",&sel); switch(sel) { case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break; case 1:printf("更换的位置\n");LRU();empty();printf("\n");break; default: printf("请输入正确的选项号!");printf("\n\n");break; } }while(sel!=0); }
lru算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。