当前位置:   article > 正文

C语言版操作系统实验:FIFO与LRU页面置换算法_本实验要求用c程序模拟某页面转换算法(如fifo算法或lru算法)。

本实验要求用c程序模拟某页面转换算法(如fifo算法或lru算法)。

实验要求:

计算并输出下述各种算法在内存容量为3块、4块下的缺页率。

1.先进先出的算法(FIFO);

要求用数组或链表方法实现

2.最近最少使用算法(LRU)。

   要求用计数器或堆栈方法实现

 

代码及注释如下:

(FIFO用的是数组,LRU用堆栈)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define PN 20//页面访问列长度
  4. #define FN 3//分配给进程的内存块数
  5. #define FN1 4//分配给进程的内存块数
  6. int *pageSeq;//页面访问序列
  7. int *frames;//内存块数组
  8. int fault,exchange;//缺页次数和置换次数
  9. float ratio;//缺页率
  10. void init();//初始化页面访问向量
  11. void clear();//初始化内存块
  12. void print();//输出最后结果
  13. void print1(int);//输出每一步结果
  14. void FIFO(int*,int,int*,int);//FIFO算法
  15. void LRU(int*,int,int*,int);//LRU算法
  16. int search(int,int*,int,int);//搜索页面在序列某段中的位置,找到返回下标,否则返回-1
  17. int main()
  18. {
  19. int num;
  20. printf("【页面置换算法】\n");
  21. printf("序列长度:%d\n",PN);
  22. printf("内存块数:%d或%d\n",FN,FN1);
  23. printf("========================\n\n\n");
  24. init();//初始化页面访问向量
  25. printf("操作说明:\n");
  26. printf(" num=0 程序结束\n");
  27. printf(" num=1 FIFO算法(页面数为3)\n");
  28. printf(" num=2 LRU算法(页面数为3)\n");
  29. printf(" num=3 FIFO算法(页面数为4)\n");
  30. printf(" num=4 LRU算法(页面数为4)\n");
  31. printf("==============================\n");
  32. printf("\n");
  33. printf("输入操作序号num:");
  34. scanf("%d",&num);
  35. while(1)
  36. {
  37. switch(num)
  38. {
  39. case 0:printf("\n=====程序结束!=====\n");return 0;
  40. case 1:printf("\n【FIFO算法】页面为3页\n");FIFO(pageSeq,PN,frames,FN);break;
  41. case 2:printf("\n【LRU算法】页面为3页\n");LRU(pageSeq,PN,frames,FN);break;
  42. case 3:printf("\n【FIFO算法】页面为4页\n");FIFO(pageSeq,PN,frames,FN1);break;
  43. case 4:printf("\n【LRU算法】页面为4页\n");LRU(pageSeq,PN,frames,FN1);break;
  44. default:printf("\n=====无效选项!请重新输入=====\n");goto L1;
  45. }
  46. print();
  47. L1: printf("\n");
  48. printf("输入操作序号num:");
  49. scanf("%d",&num);
  50. }
  51. }
  52. void init()//输入访问序列
  53. {
  54. int i;
  55. pageSeq=(int*)(malloc(PN*sizeof(int)));//动态分配内存
  56. frames=(int*)(malloc(FN*sizeof(int)));//动态分配内存
  57. printf("向pageSeq输入页面访问序列:");
  58. for(i=0;i<PN;i++)
  59. scanf("%d",&pageSeq[i]);
  60. printf("\n");
  61. printf("页面访问序列:\n\n");//输出页面访问序列
  62. for(i=0;i<PN;i++)
  63. printf("%3d",pageSeq[i]);
  64. printf("\n\n");
  65. printf("===============================================================\n");
  66. }
  67. void clear()//重新初始化内存块frames,因为有0号页面,所以置-1
  68. {
  69. int i;
  70. fault=0;//缺页次数
  71. exchange=0;//置换次数
  72. for(i=0;i<FN;i++)//内存块置-1
  73. frames[i]=-1;
  74. }
  75. void print1(int flag)//flag为缺页标志,输出每一步结果
  76. {
  77. int t;
  78. for(t=0;t<FN;t++)//每访问一个页面,都输出一次内存块(页面)
  79. printf("% d",frames[t]);
  80. if(flag) printf(" fault");//在缺页位置标记“fault”
  81. printf("\n");
  82. }
  83. void print()//输出最后结果
  84. {
  85. exchange=fault-FN;
  86. ratio=(float)fault/PN*100;
  87. printf("------------------------------\n");
  88. printf("缺页次数:%d\n",fault);
  89. printf("置换次数:%d\n",exchange);
  90. printf("缺 页 率:%4.1f%%\n",ratio);
  91. printf("==============================\n");
  92. }
  93. int search(int p,int* ar,int start,int end)//参数说明:(页号,页面访问序列或者内存块数组,起点,终点)
  94. {//检测页面p是否存在数组ar中(起点start,终点end),存在则返回其在ar中的位置(下标),否则返回-1
  95. int i,f;
  96. if(start>end)f=-1;//f作为方向标志,f=1时,循环变量递增;f=-1时,循环变量递减
  97. else f=1;
  98. i=start;//从strat位置开始搜索
  99. while(i!=end+f)//i超过end时结束循环
  100. {
  101. if(p==ar[i])return i;//首次搜索到p即返回下标
  102. i=i+f;
  103. }
  104. return -1;//未搜索到页面p,即p在未来不再被访问
  105. }
  106. void FIFO(int* arp,int p,int* arf,int f)
  107. {//参数说明:(页面访问序列数组,数组长度,内存块数组,数组长度)
  108. int i,j=0,flag;
  109. clear();//内存块数据清零
  110. printf("页面访问过程:\n");
  111. printf("------------------------------\n");
  112. for(i=0;i<p;i++)
  113. {
  114. flag=0;//缺页标志
  115. if(search(arp[i],arf,0,f-1)==-1)//如果当前页面arp[i]不在内存
  116. {
  117. fault++;//缺页+1
  118. flag=1;
  119. arf[j]=arp[i];//页面调入内存
  120. j=(j+1)%f;//j+1,循环
  121. }
  122. print1(flag);//输出一次内存页面情况
  123. }
  124. }
  125. void LRU(int* arp, int p, int* arf, int f) {
  126. int i, j;
  127. int kf = 0; // kf>=f时,内存块满,此时缺页产生置换
  128. int* pageStack = (int*)malloc(p * sizeof(int)); // 用于保存页面访问顺序的堆栈
  129. int* pageMap = (int*)malloc(f* sizeof(int)); // 用于保存页面在堆栈中的位置
  130. clear();
  131. for (i = 0; i < p; i++) {
  132. int flag = 0;
  133. if (search(arp[i], arf, 0, f - 1) == -1) { // 页面不在内存
  134. flag = 1;
  135. fault++; // 缺页
  136. if (kf < f) { // 有空闲块,无置换
  137. arf[kf] = arp[i];
  138. pageStack[kf] = arp[i];
  139. pageMap[arp[i]] = kf;
  140. kf++;
  141. }
  142. else { // 无空闲块,产生置换
  143. int pmini = p; // pmini值初值(最大值或者当前值i)
  144. int pminj = -1;
  145. for (j = 0; j < f; j++) {
  146. int posi = search(arf[j], arp, i - 1, 0); // 不会出现页面不存在的情况
  147. if (posi < pmini) {
  148. pmini = posi;
  149. pminj = j;
  150. }
  151. }
  152. if (pminj != -1) {
  153. for (j = pminj; j < f - 1; j++) {
  154. arf[j] = arf[j + 1]; // 置换
  155. }
  156. arf[f - 1] = arp[i];
  157. pageStack[f - 1] = arp[i];
  158. pageMap[arp[i]] = f - 1;
  159. }
  160. }
  161. }
  162. print1(flag); // 输出一次内存页面情况
  163. }
  164. free(pageStack);
  165. free(pageMap);
  166. }

 

 

 

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

闽ICP备14008679号