当前位置:   article > 正文

操作系统实验(四)——页面置换算法(附C语言代码)_操作系统页面置换算法代码

操作系统页面置换算法代码

实验4 页面置换算法

一、实验目的

理解页面置换算法,实现先进先出(FIFO)置换算法和最久未使用(LRU)置换算法,给出任意的输入流,计算置换次数

二、实验要求

给出任意的输入流,计算置换次数。物理块大小可定制,0~9数字任意排序的数字流。

三、实验代码-页面置换算法.cpp

1.初始化队列

  1. #include <stdio.h>
  2. void initial(int list[],int number){//初始化队列
  3. for(int i=0;i<number;i++){
  4. list[i]=-1;
  5. }
  6. }

2.FIFO算法

  1. void FIFO(int memorylist[],int phynum,int strlist[],int pagenum){
  2. int replacecount=0;
  3. int earliest=0;//记录当前最早进入内存的下标
  4. int isvisited=0;//记录当前页面访问情况
  5. for(int i=0;i<pagenum;i++){
  6. isvisited=0;
  7. //判断是否需要置换(内存已满且需要访问的页面不在内存中)
  8. for(int j=0;j<phynum;j++){
  9. if(memorylist[j]==strlist[i]){
  10. //页面已经再内存中
  11. isvisited=1;//修改访问情况
  12. break;
  13. }
  14. if(memorylist[j]==-1){
  15. //页面不在内存中且内存未满(直接存入)
  16. memorylist[j]=strlist[i];
  17. isvisited=1;//修改访问情况
  18. break;
  19. }
  20. }
  21. if(!isvisited){
  22. //当前页面未被访问(进行页面置换)
  23. memorylist[earliest]=strlist[i];
  24. //下标指向下一个
  25. earliest++;
  26. //若到了最后一个,下标归零
  27. if(earliest>phynum-1){
  28. earliest=0;
  29. }
  30. replacecount++;
  31. }
  32. }
  33. printf("置换次数:%d\n",replacecount);
  34. }

3.LRU算法

  1. void LRU(int memorylist[],int phynum,int strlist[],int pagenum){
  2. int replacecount=0;//置换次数
  3. //记录内存中最近一次访问至今的时间
  4. int timerecord[phynum];
  5. initial(timerecord,phynum);
  6. //记录当前页面的访问情况
  7. int isvisited=0;
  8. //记录已经在内存中的页面数量
  9. int pagecount=0;
  10. for(int i=0;i<pagenum;i++){
  11. isvisited=0;
  12. //将已经在内存的页面时间加1
  13. for(int p=0;p<pagecount;p++){
  14. if(memorylist[p]!=-1){
  15. timerecord[p]++;
  16. }
  17. }
  18. //是否需要置换
  19. for(int j=0;j<phynum;j++){
  20. if(memorylist[j]!=-1){
  21. timerecord[j]++;
  22. }
  23. if(memorylist[j]==strlist[i]){
  24. //该页面已经在内存中,修改访问情况
  25. isvisited=1;
  26. //重置访问时间
  27. timerecord[j]=-1;
  28. break;
  29. }
  30. if(memorylist[j]==-1){
  31. //页面不在内存中且内存未满(直接存入)
  32. memorylist[j]=strlist[i];
  33. pagecount++;
  34. //修改访问情况
  35. isvisited=1;
  36. //修改访问时间
  37. timerecord[j]++;
  38. break;
  39. }
  40. }
  41. if(!isvisited){
  42. //需要置换,寻找最久未访问的页面所在内存下标
  43. int max=0;
  44. //即找数组最大值
  45. for(int k=0;k<phynum;k++){
  46. if(timerecord[max]<timerecord[k]){
  47. max=k;
  48. }
  49. }
  50. //将该位置的页面换出
  51. memorylist[max]=strlist[i];
  52. timerecord[max]=-1;
  53. replacecount++;
  54. }
  55. }
  56. printf("置换次数:%d\n",replacecount);
  57. }

4.主函数

  1. int main(){
  2. //物理块的数量
  3. int phyblocknum;
  4. printf("请输入物理块的数量:\n");
  5. scanf("%d",&phyblocknum);
  6. //内存队列
  7. int memorylist[phyblocknum];
  8. //初始化内存状态
  9. initial(memorylist,phyblocknum);
  10. //页面数量
  11. int pagenum;
  12. printf("请输入要访问的页面数量:\n");
  13. scanf("%d",&pagenum);
  14. int pagenumstrlist[pagenum];
  15. printf("请输入要访问的页面号:\n");
  16. for(int i=0;i<pagenum;i++){
  17. scanf("%d",&pagenumstrlist[i]);
  18. }
  19. int choose;//需要选择的置换算法
  20. while(1){
  21. printf("请选择所需的置换算法:\n");
  22. printf("1:FIFO 2.LRU 3.退出 ");
  23. scanf("%d",&choose);
  24. switch(choose){
  25. case 1:
  26. FIFO(memorylist,phyblocknum,pagenumstrlist,pagenum);
  27. initial(memorylist,phyblocknum);
  28. break;
  29. case 2:
  30. LRU(memorylist,phyblocknum,pagenumstrlist,pagenum);
  31. initial(memorylist,phyblocknum);
  32. break;
  33. default:
  34. return 0;
  35. break;
  36. }
  37. }
  38. return 0;
  39. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号