当前位置:   article > 正文

java实现FIFO和LRU页面置换算法_java编程实现lru算法,置换算法程序提供内存访问序列的输入界面,输出正确的置换过

java编程实现lru算法,置换算法程序提供内存访问序列的输入界面,输出正确的置换过

   FIFO是内存管理的一种页面置换算法,FIFO(First Input First Output),即先进先出队列。例:在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开。这就是一种先进先出机制,先排队的客户先行结账离开。

  LRU内存管理的另一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。 LRU是Least Recently Used的缩写,即最近最久未使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

JAVA实现如下(可以直接执行):

  1. import java.util.Scanner;
  2. class wuli{
  3. int vlu;
  4. int falt;
  5. wuli(int vlu ){
  6. this.falt=-1;
  7. this.vlu=vlu;
  8. }
  9. }
  10. public class fifolru {
  11. int mun; //物理块数
  12. int yemianmun; //页面个数
  13. fifolru(int mun,int yemianmun) {
  14. this.mun=mun;
  15. this.yemianmun=yemianmun;
  16. }
  17. public static void fifo(wuli a[],int b[] ) { //------------------------------------------fifo------------
  18. System.out.println("+++++++++++++FIFO算法++++++++++++++++");
  19. int mun=0;
  20. int count=0;
  21. for(int q=0;q<a.length;q++)
  22. a[q]=new wuli (-2); //初始化对象
  23. for(int q=0;q<b.length;q++) {
  24. if(count==a.length) {
  25. int f=0; //处理满的情况
  26. for(int qq=0;qq<a.length;qq++) {
  27. if(a[qq].falt==b[q]) {
  28. System.out.println("*发现相同,不存入 ");
  29. f=1;
  30. break;
  31. }
  32. }
  33. if(f==0) {
  34. System.out.println("到达一个元素"+b[q]+"已经满,弹出第一个元素"+a[0].falt+" 末尾加入元素"+b[q]);
  35. mun++;
  36. for(int z=0;z<a.length-1;z++) { //前移
  37. a[z].falt=a[z+1].falt;
  38. }
  39. a[a.length-1].falt=b[q]; //最后一个赋值
  40. }
  41. continue;
  42. }
  43. int k=0;
  44. for(int qq=0;qq<a.length;qq++) { //处理未满情况
  45. if(a[qq].falt==b[q]) {
  46. System.out.println("发现相同,不存入 ");
  47. k=1;
  48. break;
  49. }
  50. }
  51. if(k==0)
  52. {
  53. for(int z=0;z<a.length;z++)
  54. if(a[z].vlu==-2) //找到没用到的物理块
  55. { a[z].falt=b[q]; a[z].vlu=0; mun++;count++;System.out.println("没有发现相同,存入 "); break;}
  56. }
  57. continue;
  58. }
  59. System.out.print("++++++++++结果物理块的值:"); //fifo结果
  60. for(int a1=0;a1<a.length;a1++) {
  61. System.out.print(a[a1].falt+" ");
  62. }
  63. System.out.println("++++++++++");
  64. System.out.println("++++++++++FIFO缺页次数:"+mun+"次 +++++++++++");
  65. }
  66. public static void lru(wuli a[],int b[] ) { //------------------------------------------------lru
  67. System.out.println("++++++++++LRU算法++++++++++++");
  68. int mun=0;
  69. int count=0;
  70. for(int q=0;q<a.length;q++)
  71. a[q]=new wuli (-2); //初始化对象
  72. for(int q=0;q<b.length;q++) {
  73. if(count==a.length) { //处理满的情况
  74. int f=0;
  75. for(int qq=0;qq<a.length;qq++) {
  76. if(a[qq].falt==b[q]) {
  77. System.out.println("*发现相同,不存入,更新位置 ");
  78. int ji=qq;
  79. for(int s=qq;s>0;s--)
  80. a[s].falt=a[s-1].falt;
  81. a[0].falt=b[q];
  82. f=1;
  83. break;
  84. }
  85. }
  86. if(f==0) {
  87. System.out.println("到达一个元素"+b[q]+"已经满,弹出最后一个元素"+a[a.length-1].falt+" 首部加入元素"+b[q]);
  88. mun++;
  89. for(int s=a.length-1;s>0;s--)
  90. a[s].falt=a[s-1].falt;
  91. a[0].falt=b[q];
  92. }
  93. continue;
  94. }
  95. int k=0;
  96. for(int qq=a.length-1;qq>= 0;qq--) { //处理未满情况
  97. if(a[qq].falt==b[q]) {
  98. System.out.println("发现相同,不存入,更新位置 ");
  99. int ji=qq;
  100. while(a[ji-1].falt!=-1)
  101. { a[ji].falt=a[ji-1].falt ;
  102. ji--;
  103. }
  104. for(int z=a.length-1;z>=0;z--)
  105. if(a[z].vlu==-2)
  106. a[z+1].falt=b[q];
  107. k=1;
  108. break;
  109. }
  110. }
  111. if(k==0)
  112. {
  113. for(int z=a.length-1;z>=0;z--)
  114. if(a[z].vlu==-2) //找到没用到的物理块
  115. { a[z].falt=b[q]; a[z].vlu=0; mun++; count++;System.out.println("没有发现相同,存入 ");
  116. break;}
  117. }
  118. continue;
  119. }
  120. System.out.print("++++++++++结果物理块的值:"); //lru结果
  121. for(int a1=0;a1<a.length;a1++) {
  122. System.out.print(a[a1].falt+" ");
  123. }
  124. System.out.println("++++++++++");
  125. System.out.println("++++++++++FIFO缺页次数:"+mun+"次 +++++++++++");
  126. }
  127. public static void main(String arg[]) {
  128. Scanner input=new Scanner(System.in);
  129. System.out.println("请输入分配给程序的物理块数");
  130. int mun0=input.nextInt();
  131. wuli wulikuai[]=new wuli[mun0]; //物理块数组
  132. System.out.println("请输入页面流的个数");
  133. int mun1=input.nextInt();
  134. int yemianmun[]=new int[mun1]; //页面个数数组
  135. fifolru text=new fifolru(mun0, mun1);
  136. System.out.print("请顺序输入页面流");
  137. for(int a=0;a<yemianmun.length;a++) {
  138. int shuju = input.nextInt();
  139. yemianmun[a]=shuju;
  140. }
  141. System.out.print("选择fifo算法,还是LRU算法。1——fifo,2——LRU,3——都选择");
  142. int key=input.nextInt();
  143. switch (key) {
  144. case 1:
  145. fifo(wulikuai, yemianmun);
  146. break;
  147. case 2:
  148. lru(wulikuai, yemianmun);
  149. break;
  150. case 3:
  151. fifo(wulikuai, yemianmun);
  152. lru(wulikuai, yemianmun);
  153. break;
  154. }
  155. }
  156. }


运行:




总结:具体的运行流程结果比较清楚了~就不多解释了,要是有bug请指教~







声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/163648
推荐阅读
相关标签
  

闽ICP备14008679号