java opt,opt算法规则

  java opt,opt算法规则

  

目录

java实现选择算法先进先出最近最少使用算法选项算法爪哇岛实现

 

  

java实现OPT算法

1966年,确保提出最佳页面替换算法(最佳替换,OPT)。是操作系统存储管理中的一种全局页面替换策略。

 

  当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距最长时间后要访问的页面。

  它所产生的缺页数最少,然而,却需要预测程序的页面引用串,这是无法预知的,不可能对程序的运行过程做出精确的断言,不过此理论算法可用作衡量各种具体算法的标准。

  例子:

  选项4 3 2 1 4 3 4 3 4 3 2 1 5页1 4 4 4 4 4 4 4 4 4 2 2 2页2 3 3 3 3 3 3 3 3 3 1 1页3 2 1 1 1 5 5 5 5 5 5缺页中断x x x x v v x v v x x v共缺页中断七次摘自百度百科

  由上面的解释可知,选择算法就是将最远要访问到的页或者不再访问的页淘汰掉。

  直接上代码:

  导入Java。io。缓冲阅读器;导入Java。io。filenotfoundexception导入Java。io。filereader导入Java。io。io异常;导入Java。util。ArrayList导入Java。util。列表;/* * 说明: * 数据由文件读入,需要自己创建文件,然后将数据放入其中* 第一个数据代表内存中的页数* 接下来为访问次序,数据已回车分隔*/public class OPT test { public static void main(String[]args){ OPT OPT=new OPT( e : Java io _ copy OPT。txt’);选择。算法();} } class OPT { public OPT(字符串文件路径){ memory list=new ArrayListInteger();rd=新的读取数据(文件路径);内存maxsize=rd。读取next();流程列表=研发。read();} read data rdlist integer processListListInteger memory listing memory maxsize公共空的算法(){//opt算法int miss page=0;for(int I=0;我处理列表。size();I){ int now process=进程列表。get(I);if(内存列表。包含(现在正在处理)){;} else if(内存列表。size()memory maxsize){ miss page;记忆列表。添加(现在正在处理);} else {int val=0,index=0;for(int j=0;j内存列表。size();j){ int now=进程列表。lastindexof(内存列表。get(j));如果(现在索引现在I){索引=现在我?整数MAX_VALUE :现在;val=内存列表。get(j);} }内存列表。删除(内存列表。(val)的索引;记忆列表。添加(现在正在处理);miss page } for(int k=0;k内存列表。size();k){系统。出去。println(内存列表。get(k));}系统。出去。println(-);}系统。出去。println(佩奇小姐);} }类ReadData {//读取数据公共读取数据(字符串文件路径){ dataList=new ArrayList lt

  ;Integer>();try {bfr = new BufferedReader(new FileReader(filePath));} catch (FileNotFoundException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}private BufferedReader bfr = null;private List<Integer> dataList;public List<Integer> read() {Integer i;while ((i = readNext()) != -1) {dataList.add(i);}return dataList;};public Integer readNext() {try {String data = bfr.readLine();if (data == null) {return -1;}return Integer.parseInt(data);} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return -1;}}

 

  

FIFO LRU OPT 算法java实现

 public static void OPT(int len ,int page[]){ int block[] = new int[len]; double hit = 0; int key = 0; int m =0; for(int i =0;i<page.length;i++){ if(m>=block.length){ for(int j=0;j<block.length;j++) { if(block[j]==page[i]){ hit++; System.out.println("命中"); key = 1; break; } } if(key==1) { key = 0; continue; } else{ int temp[] = new int[block.length]; Arrays.fill(temp, page.length); for(int f=0;f<block.length;f++){ for(int k=i;k<page.length;k++){ if(block[f]==page[k]){ temp[f] = k; break; } } } int tag=0; for(int u=0;u<temp.length;u++){ if(temp[u]>temp[tag]) tag = u; } System.out.println(block[tag]+"->"+page[i]); block[tag]=page[i]; } } else { for(int j=0;j<m;j++) { if(block[j]==page[i]){ hit++; System.out.println("命中"); key = 1; break; } } if(key==1) { key = 0; continue; } else {System.out.println("*null->"+page[i]);block[m]=page[i];m++;} } } System.out.println("命中率= "+hit/page.length); }
 public static void LRU(int len , int page[]){ int block[] = new int[len]; double hit = 0; int key = 0; int m=0; for(int i =0;i<page.length;i++){ if(m>=block.length) { for(int j=0;j<block.length;j++){ if(block[j]==page[i]){ hit++; System.out.println("命中"); int temp = block[j]; for(int v=j;v<block.length-1;v++) block[v]=block[v+1]; block[block.length-1]=temp; key = 1; break; } } if(key==1) { key = 0; continue; } else{ System.out.println(block[0]+"->"+page[i]); for(int j=0;j<block.length-1;j++) block[j]=block[j+1]; block[block.length-1]=page[i]; } } else { for(int j=0;j<m;j++) { if(block[j]==page[i]){ hit++; System.out.println("命中"); key = 1; break; } } if(key==1) { key = 0; continue; } else {System.out.println("*null->"+page[i]);block[m]=page[i];m++;} } } System.out.println("命中率= "+hit/page.length); }
 public static void FIFO(int len,int page[]){ int block[] = new int[len]; double hit=0; int key=0; int m =0; for(int i =0;i<page.length;i++){ if(m>=block.length) { for(int j=0;j<block.length;j++) { if(block[j]==page[i]){ hit++; System.out.println("命中"); key = 1; break; } } if(key==1) { key = 0; continue; } else{ System.out.println(block[0]+"->"+page[i]); for(int j=0;j<block.length-1;j++) block[j]=block[j+1]; block[block.length-1]=page[i]; } } else { for(int j=0;j<m;j++) { if(block[j]==page[i]){ hit++; System.out.println("命中"); key = 1; break; } } if(key==1) { key = 0; continue; } else {System.out.println("*null->"+page[i]);block[m]=page[i];m++;} } } System.out.println("命中率= "+hit/page.length); }

测试代码请自行编写 ,这里OPT算法中用了一个额外的数组用来标记接下来页面中该数据出现的位置,然后通过这个标记值判断替换哪个,是我自己想出来觉得还不错的一个方法,没有标注注释,请谅解。

 

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: