java中的OPT算法實現(xiàn)方式
java實現(xiàn)OPT算法
1966年,Belady提出最佳頁面替換算法(OPTimal replacement,OPT)。是操作系統(tǒng)存儲管理中的一種全局頁面替換策略 。
當(dāng)要調(diào)入一頁而必須淘汰舊頁時,應(yīng)該淘汰以后不再訪問的頁,或距最長時間后要訪問的頁面。
它所產(chǎn)生的缺頁數(shù)最少,然而,卻需要預(yù)測程序的頁面引用串,這是無法預(yù)知的,不可能對程序的運行過程做出精確的斷言,不過此理論算法可用作衡量各種具體算法的標(biāo)準(zhǔn)。
例子:
OPT?? ??? ?4?? ?3?? ?2?? ?1?? ?4?? ?3?? ?5?? ?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 共缺頁中斷7次
摘自百度百科
由上面的解釋可知,opt算法就是將最遠(yuǎn)要訪問到的頁或者不再訪問的頁淘汰掉。
直接上代碼:
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; /* * 說明: * 數(shù)據(jù)由文件讀入,需要自己創(chuàng)建文件,然后將數(shù)據(jù)放入其中 * 第一個數(shù)據(jù)代表內(nèi)存中的頁數(shù) * 接下來為訪問次序,數(shù)據(jù)已回車分隔*/ public class OPTTest { public static void main(String[] args) { OPT opt = new OPT("E:\\java\\io_copy\\opt.txt"); opt.algorithm(); } } class OPT { public OPT(String filePath) { memoryList = new ArrayList<Integer>(); rd = new ReadData(filePath); memoryMaxSize = rd.readNext(); processList = rd.read(); } ReadData rd; List<Integer> processList; List<Integer> memoryList; int memoryMaxSize; public void algorithm() {//opt算法 int missPage = 0; for (int i = 0; i < processList.size(); i++) { int nowProcess = processList.get(i); if (memoryList.contains(nowProcess)) { ; } else if (memoryList.size() < memoryMaxSize) { missPage++; memoryList.add(nowProcess); } else { int val = 0, index = 0; for (int j = 0; j < memoryList.size(); j++) { int now = processList.lastIndexOf(memoryList.get(j)); if (now > index || now < i) { index = now < i ? Integer.MAX_VALUE : now; val = memoryList.get(j); } } memoryList.remove(memoryList.indexOf(val)); memoryList.add(nowProcess); missPage++; } for (int k = 0; k < memoryList.size(); k++) { System.out.println(memoryList.get(k)); } System.out.println("-------------"); } System.out.println(missPage); } } class ReadData {//讀取數(shù)據(jù) public ReadData(String filePath) { dataList = new ArrayList<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實現(xiàn)
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算法中用了一個額外的數(shù)組用來標(biāo)記接下來頁面中該數(shù)據(jù)出現(xiàn)的位置,然后通過這個標(biāo)記值判斷替換哪個,是我自己想出來覺得還不錯的一個方法,沒有標(biāo)注注釋,請諒解。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis那些約定的配置你真的都了解嗎(經(jīng)驗總結(jié))
mybatsi中Mapper和xml文件之間有很多約定俗稱的規(guī)則,比如名稱匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件2021-06-06Spring?Boot項目中使用?TrueLicense?生成和驗證License的詳細(xì)步驟
這篇文章主要介紹了Spring?Boot項目中使用?TrueLicense?生成和驗證License,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-10-10SpringCloud Eureka實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)
Eureka是一種基于REST(具像狀態(tài)傳輸)的服務(wù),主要用于AWS云中定位服務(wù),以實現(xiàn)中間層服務(wù)器的負(fù)載平衡和故障轉(zhuǎn)移。本文記錄一個簡單的服務(wù)注冊與發(fā)現(xiàn)實例。感興趣的小伙伴們可以參考一下2019-01-01SpringBoot @PostMapping接收HTTP請求的流數(shù)據(jù)問題
這篇文章主要介紹了SpringBoot @PostMapping接收HTTP請求的流數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Java利用POI實現(xiàn)導(dǎo)入導(dǎo)出Excel表格
這篇文章主要為大家詳細(xì)介紹了Java利用POI實現(xiàn)導(dǎo)入導(dǎo)出Excel表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08