JAVA实现页面置换算法(OPT,FIFO,LRU)

  1. public class page_replacement {
  2. private int n;//内储页框
  3. private int m;//访问次数
  4. private int F;//没能直接找到的次数,(F/m)为缺页率
  5. private List<Integer>list=null;//访问地址走向
  6. private Map<Integer,Integer>map=null;
  7. public page_replacement(){
  8. F=0;
  9. map=new HashMap<Integer,Integer>();//存储每一个内储页框所存的内容
  10. Scanner cin=new Scanner(new BufferedInputStream(System.in));
  11. System.out.println("请输入用户访问页地址走向");
  12. list=new ArrayList<Integer>();
  13. String s=cin.nextLine();
  14. String []s1=s.split(" ");
  15. m=s1.length;
  16. for (int i=0;i<m;i++)
  17. list.add(Integer.valueOf(s1[i]));
  18. System.out.println("请输入内储叶框数量");
  19. n=cin.nextInt();
  20. menu();
  21. switch(cin.nextInt()){
  22. case 1:OPT();break;
  23. case 2:FIFO();break;
  24. case 3:LRU();break;
  25. }
  26. cin.close();
  27. }
  28. public void menu(){
  29. System.out.println("**** 选择最佳置换算法请按1 **********");
  30. System.out.println("**** 选择先进先出置换算法请按2 *******");
  31. System.out.println("**** 选择最近最远未使用置换算法请按3 ***");
  32. }
  33. public void OPT(){//最佳置换算法
  34. int j;
  35. for (int i=0;i<m;i++)
  36. {
  37. int k=list.get(i);//待处理元素
  38. //System.out.print(map);
  39. if (!map.containsValue(k)){
  40. F++;//不能直接找到次数加1
  41. if (map.size()<n){//如果没有装满
  42. int temp=map.size();
  43. map.put(temp, k);
  44. }
  45. else{//如果装满了
  46. int index=0;//把哪个位置的淘汰出去
  47. int min=0;//初始最长长度
  48. for (int t=0;t<n;t++)
  49. {
  50. for (j=i+1;j<m;j++){//看后面哪一个出现的最晚
  51. if (list.get(j)==map.get(t)){//第一次找到
  52. if (j-i>min){
  53. index=t;//更新值
  54. min=j-i;
  55. }
  56. break;
  57. }
  58. }
  59. if (j==m){//如果到最后
  60. index=t;
  61. min=j-i;
  62. }
  63. }
  64. map.remove(index);
  65. map.put(index,k);//修改表内元素
  66. }
  67. }
  68. }
  69. System.out.println("误码率为:"+F*1.0/m);
  70. }
  71. public void FIFO(){//先进先出置换算法
  72. Queue<Integer>q=new LinkedList<Integer>();
  73. for (int i=0;i<m;i++)
  74. {
  75. int k=list.get(i);//待处理元素
  76. if (!map.containsValue(k)){
  77. F++;//不能直接找到次数加1
  78. if (map.size()<n){//如果没有装满
  79. int temp=map.size();
  80. map.put(temp, k);
  81. q.offer(temp);
  82. }
  83. else
  84. {
  85. int temp=q.poll();//排除的元素位置
  86. map.remove(temp);
  87. map.put(temp,k);
  88. q.offer(temp);
  89. }
  90. }
  91. }
  92. System.out.println("误码率为:"+F*1.0/m);
  93. }
  94. public void LRU(){//最近最远未使用置换算法
  95. List<Integer>linkedlist=new LinkedList<Integer>();
  96. int start=0;
  97. for (int i=0;i<m;i++)
  98. {
  99. int k=list.get(i);//待处理元素
  100. if (!map.containsKey(k)){
  101. F++;//不能直接找到次数加1
  102. if (map.size()<n){//如果没有装满
  103. int temp=map.size();
  104. map.put(k,temp);
  105. linkedlist.add(k);//添加位置
  106. }
  107. else
  108. {
  109. int temp=linkedlist.get(0);
  110. int c=map.get(temp);//位置
  111. map.remove(temp);
  112. map.put(k,c);
  113. linkedlist.remove(0);
  114. linkedlist.add(k);
  115. }
  116. }
  117. else//如果包含这个值,把这个值拿走并在后面压入
  118. {
  119. int d=linkedlist.indexOf(k);//查找存在位置
  120. linkedlist.remove(d);
  121. linkedlist.add(k);
  122. }
  123. }
  124. System.out.println("误码率为:"+F*1.0/m);
  125. }
  126. public static void main(String args[]){
  127. page_replacement p=new page_replacement();
  128. }
  129. }

JAVA实现页面置换算法(OPT,FIFO,LRU)

相关推荐