当前位置:   article > 正文

使用C语言编程模拟实现先进先出算法(FIFO)以及最近最久未使用页面置换算法(LRU)带注释_lru算法c语言程序流程图

lru算法c语言程序流程图

 两种算法的基本原理:

(1)先进先出算法(FIFO)当要进行分页替换时,就把队列最前端的分页换出,再把要调入的分页放到队列的末端。使用链表将所有在内存的页面按照进入时间的早晚链接起来,然后每次置换链表头上的页面就行了,新加进来的页面则挂在链表的末端。

(2)最近最久未使用算法(LRU)选择最近最久未使用的页面予以淘汰。利用页表中的访问字段,记录页面自上次被访问以来所经历的时间t,需要淘汰页面时,选择在内存页面中t值最大的,即最近最久未使用的页面予以淘汰。

先进先出算法FIFO的代码实现:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void sort(int a[3],int t)
  4. //输入t(即将进入内存的进程)顶替内存的第一个页面
  5. {
  6. a[0]=a[1];
  7. a[1]=a[2];
  8. a[2]=t;//全部前移 即a[0]页面被置换
  9. }
  10. int IN(int a[3],int t) //找出即将进来的进程是否在内存的三个页面中
  11. {
  12. int i;
  13. int flag=0;//初始值表示不存在内存中
  14. for(i=0; i<3; i++) //进行循环
  15. {
  16. if(a[i]==t)//逐一比较
  17. {
  18. flag=1;//表示比对成功即已经存在内存中
  19. break;//跳出for循环
  20. }
  21. }
  22. return flag;//返回比较结果
  23. }
  24. void print(int a[3],int t)//内存中的数组a[3] 即将进入内存的页面b
  25. {
  26. if(IN(a,t)==0)
  27. {
  28. //调用IN函数判断即将进入内存的进程是否已经存在
  29. sort(a,t);
  30. //flag==0表示不存在则调用sort函数进行排序
  31. }
  32. printf("现在内存中的3个页面为:%d %d %d\n",a[0],a[1],a[2]);
  33. }
  34. int main()
  35. {
  36. int i;
  37. int a[3],b[100],n;
  38. //设有内存中有3个页面a[0],a[1],a[2]
  39. //b是即将进入内存的页面,
  40. //n是即将进入内存页面的数量
  41. for(i=0; i<3; i++)
  42. //现将内存中的三个页面输入
  43. {
  44. printf("请输入第%d个页面:",i+1);
  45. scanf("%d",&a[i]);
  46. }
  47. printf("现在内存中的3个页面为:%d %d %d\n",a[0],a[1],a[2]);
  48. //输出内存中现存页面
  49. printf("请输入即将进入内存的页面数:");
  50. scanf("%d",&n);
  51. for(i=0; i<n; i++)//对要访问的页面进行循环
  52. {
  53. printf("请输入要访问的页面;");
  54. scanf("%d",&b[i]);
  55. print(a,b[i]);//调用print函数
  56. }
  57. }

流程图

e7c146d1ac9949ed9c74e32f4f3ee5f6.png

运行结果图:

e6005338c9e9acc71787317fefe09177.png

最近最久未使用算法(LRU)代码实现:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct P//定义页面结构体
  4. {
  5. int time;//已经待的时间
  6. //页面每被访问一次 其等待时间置0 其他页面等待时间+1
  7. int number;//页面序号
  8. };
  9. int long_max(struct P a[3]) //寻找在内存中时间最长的页面,并对其time进行修改
  10. {
  11. int index=0;
  12. int min_time=a[0].time;//将内存第一个页面的等待时间设为初始值
  13. //既为内存中等待时间的最大值(页面b进入之前)
  14. int i;
  15. for(i=1;i<3;i++) //找出最大的time以及对应的页面
  16. {
  17. if(a[i].time>min_time)//将页面的等待时间分别与初始值进行比较
  18. {
  19. min_time=a[i].time;//确保初始值最大
  20. index=i;//得出等待时间最长的页面序号i
  21. }
  22. }
  23. if(index==0) //第1个页面等待时间最长
  24. {
  25. a[1].time++;//其余页面等待时间+1
  26. a[2].time++;
  27. }
  28. if(index==1) //第2个页面等待时间最长
  29. {
  30. a[0].time++;//其余页面等待时间+1
  31. a[2].time++;
  32. }
  33. if(index==2) //第3个页面等待时间最长
  34. {
  35. a[1].time++;//其余页面等待时间+1
  36. a[0].time++;
  37. }
  38. a[index].time=0;//将被顶替出的页面时间置位0,因为其是刚进来
  39. return index;
  40. }
  41. int IN(struct P a[3],int t) //找出即将进入的页面b是否在内存中
  42. {
  43. int flag=3;//flag为是否存在相同的页面,如果为3说明不在
  44. int i;
  45. for(i=0; i<3; i++)//进行循环对比
  46. {
  47. if(a[i].number==t)//若存在则找出对应页面i
  48. {
  49. flag=i;//内存中存在b页面
  50. break;//跳出循环
  51. }
  52. }
  53. return flag;//返回比较结果
  54. }
  55. void print(struct P a[3],int t)//内存中的数组a[3] 即将进入内存的页面b
  56. {
  57. int index,m;
  58. index=IN(a,t);//判断是页面b否在里面 若存在返回对应页面
  59. if(index!=3) //如果内存中存在b页面
  60. {
  61. a[index].time=0;//将该页面的已等待时间置0
  62. if(index==0)//第一个页面被访问
  63. {
  64. a[1].time++;//其余等待时间均+1
  65. a[2].time++;
  66. }
  67. if(index==1)//第二个页面被访问
  68. {
  69. a[0].time++;//其余等待时间均+1
  70. a[2].time++;
  71. }
  72. if(index==2)//第三个页面被访问
  73. {
  74. a[1].time++;//其余等待时间均+1
  75. a[0].time++;
  76. }
  77. }
  78. else //如果b不在,则页面序号需要变化
  79. {
  80. m=long_max(a);//找出需要变化页面的索引
  81. a[m].number=t;//页面a[m]被页面b置换
  82. }
  83. printf("现在内存的三个页面为%d %d %d\n",a[0].number,a[1].number,a[2].number);
  84. }
  85. int main()
  86. {
  87. struct P a[3];//内存中的三个页面结构体
  88. struct P b[100];//即将被调入内存的页面b的结构体
  89. int n,i;
  90. for(i=0; i<3; i++)//进行循环输入内存中的3个页面
  91. {
  92. printf("请输入第%d个页面:",i+1);
  93. scanf("%d",&a[i].number);
  94. a[i].time=3-i;//即前三个时间分别设为3,2,1
  95. }
  96. printf("现在内存的三个页面为%d %d %d\n",a[0].number,a[1].number,a[2].number);
  97. //对现存页面进行输出
  98. printf("请输入即将进入内存的页面数目:");
  99. scanf("%d",&n);
  100. for(i=0; i<n; i++)//对要访问的页面b进行循环
  101. {
  102. printf("请输入要访问的页面序号:");
  103. scanf("%d",&b[i].number);
  104. print(a,b[i].number);//调用print函数
  105. }
  106. }

流程图

f57344029d1146faa6292774e86bcb09.png

运行结果图:

43ee2562d3cf31d317a6d92bad3059f2.png

 

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

闽ICP备14008679号