当前位置:   article > 正文

操作系统实验代码-虚拟内存页面置换算法-C++实现_页面置换算法模拟实验c

页面置换算法模拟实验c

文章来源:神风の九_操作系统实验-CSDN博客,原创内容,转载请注明!

一、实验内容

问题描述:

设计程序模拟先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。

程序要求:

1)利用先进先出FIFO、最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。

2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。

3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,Pn,算法选择1-FIFO,2-OPI,3-LRU。

4)输出:每种算法的缺页次数和缺页率。

二、程序主要构成说明

1.判断页面是否存在内存中,遍历内存队列,如果命中,返回true,未命中返回false

2.初始化内存空间和就绪队列,设置测试集

3.FIFO算法,根据队列顺序,判断下一个页面是否命中

4.LRU算法,每次命中时,需要将内存中命中的页面移动到内存队列的尾部。

5.OPT算法,每当下一个页面到来时,都要遍历之后的页面,根据内存中已存在的页面,判断需要替换的是内存中的哪一个页面

三、完整代码

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. using namespace std;
  5. int input[20] = {4, 3, 2, 1, 4, 3, 5, 4, 3, 2, 1, 5, 6, 2, 3, 7, 1, 2, 6, 1};
  6. queue<int>fifo;
  7. queue<int>lru;
  8. int curOpt[3] = {-1, -1, -1};
  9. bool isopt[3] = {false, false, false};
  10. int OPTRes[20];
  11. int optCount = 0;
  12. bool isExist(int index) {
  13. int len = fifo.size();
  14. bool flag = false;
  15. for(int i = 0; i < len; i++) {
  16. if(input[index] == fifo.front()) {
  17. flag = true;
  18. }
  19. fifo.push(fifo.front());
  20. fifo.pop();
  21. }
  22. return flag;
  23. }
  24. void printQueue() {
  25. int len = fifo.size();
  26. for(int i = 0; i < len; i++) {
  27. cout<<fifo.front()<<" ";
  28. fifo.push(fifo.front());
  29. fifo.pop();
  30. }
  31. cout<<endl;
  32. }
  33. bool isLRUExist(int index) {
  34. int len = lru.size();
  35. bool flag = false;
  36. int temp = 0;
  37. for(int i = 0; i < len; i++) {
  38. if(input[index] == lru.front()) {
  39. //从当前位置移动到队列尾
  40. temp = input[index];
  41. flag = true;
  42. lru.pop();
  43. continue;
  44. }
  45. lru.push(lru.front());
  46. lru.pop();
  47. }
  48. if(flag) {
  49. lru.push(temp);
  50. }
  51. return flag;
  52. }
  53. void printLRUQueue() {
  54. int len = lru.size();
  55. for(int i = 0; i < len; i++) { //myqueue_size 必须是固定值
  56. cout<<lru.front()<<" ";
  57. lru.push(lru.front());
  58. lru.pop();
  59. }
  60. cout<<endl;
  61. }
  62. bool isInOptQueue(int num) {
  63. int len = 3;
  64. bool flag = false;
  65. for(int i = 0; i < len; i++) {
  66. if(curOpt[i] == num) {
  67. return true;
  68. }
  69. }
  70. return flag;
  71. }
  72. void printCurOptQueue() {
  73. for(int i = 0; i < 3; i++) {
  74. cout<<curOpt[i]<<" ";
  75. }
  76. cout<<endl;
  77. }
  78. void changeOpt(int num, int index) {
  79. int count = 0;
  80. int temp[3];
  81. // if(index == 18) cout<<"!!";
  82. for(int i = index; i < 20; i++) {
  83. for(int j = 0; j < 3; j++) {
  84. if(count == 2) {
  85. if(temp[0] != curOpt[0] && temp[1] != curOpt[0]) {
  86. // cout<<"sss"<<curOpt[0]<<" "<<temp[0]<<endl;
  87. curOpt[0] = num;
  88. OPTRes[optCount++] = num;
  89. return;
  90. }
  91. if(temp[0] != curOpt[1] && temp[1] != curOpt[1]) {
  92. curOpt[1] = num;
  93. OPTRes[optCount++] = num;
  94. return;
  95. }
  96. if(temp[0] != curOpt[2] && temp[1] != curOpt[2]) {
  97. curOpt[2] = num;
  98. OPTRes[optCount++] = num;
  99. return;
  100. }
  101. return;
  102. }
  103. if(input[i] == curOpt[j]) {
  104. temp[count] = input[i];
  105. count++;
  106. }
  107. }
  108. }
  109. curOpt[0] = num;
  110. OPTRes[optCount++] = num;
  111. }
  112. int main() {
  113. //FIFO算法
  114. int len = 20;
  115. int fifoRes[20];
  116. int count = 0;
  117. cout<<"FIFO算法"<<endl;
  118. cout<<"内存中存在的页面"<<endl;
  119. for(int i = 0; i < len; i++) {
  120. printQueue();
  121. if(isExist(i)) {
  122. continue;
  123. }
  124. if(fifo.size() == 3) {
  125. fifo.pop();
  126. }
  127. fifo.push(input[i]);
  128. fifoRes[count++] = input[i];
  129. }
  130. cout<<"调入队列为:";
  131. for(int i = 0; i < count; i++) {
  132. cout<<fifoRes[i]<<" ";
  133. }
  134. cout<<endl<<"缺页率为:"<<count * 1.0 / len;
  135. //LRU算法
  136. int LRURes[20];
  137. count = 0;
  138. cout<<endl<<endl<<"LRU算法"<<endl;
  139. cout<<"内存中存在的页面"<<endl;
  140. for(int i = 0; i < len; i++) {
  141. printLRUQueue();
  142. if(isLRUExist(i)) {
  143. continue;
  144. }
  145. if(lru.size() == 3) {
  146. lru.pop();
  147. }
  148. lru.push(input[i]);
  149. LRURes[count++] = input[i];
  150. }
  151. cout<<"调入队列为:";
  152. for(int i = 0; i < count; i++) {
  153. cout<<LRURes[i]<<" ";
  154. }
  155. cout<<endl<<"缺页率为:"<<count * 1.0 / len;
  156. //OPT算法
  157. cout<<endl<<endl<<"OPT算法"<<endl;
  158. for(int i = 0; i < 3; i++) {
  159. curOpt[i] = input[i];
  160. OPTRes[optCount++] = input[i];
  161. printCurOptQueue();
  162. }
  163. for(int i = 3; i < len; i++) {
  164. if(i != 3) {
  165. printCurOptQueue();
  166. }
  167. if(isInOptQueue(input[i])) {
  168. continue;
  169. }
  170. changeOpt(input[i], i);
  171. }
  172. printCurOptQueue();
  173. cout<<"调入队列为:";
  174. for(int i = 0; i < optCount; i++) {
  175. cout<<OPTRes[i]<<" ";
  176. }
  177. cout<<endl<<"缺页率为:"<<optCount * 1.0 / len<<endl;
  178. system("pause");
  179. return 0;
  180. }

四、运行结果

测试数据集

1、FIFO算法

2.LRU算法

3.OPT算法

五、总结

1.FIFO算法

循环遍历页面,根据输入的队列,循环走一遍,直到都遍历完,先判断页面是否在内存中(也就是是否命中),如果命中了,则跳过,如果没有命中,则寻找内存中最早进入的页面,进行替换。

2.LRU算法

LRU和FIFO的不同点在于,LRU需要把根据命中的页面,对原先队列中的页面位置进行改变。大致流程如下,循环遍历页面走向列表,直到都遍历完,先判断页面是否在内存中(是否命中),如果在,则把内存中该页面的进入时间清0,其他页面时间增加1,如果不在,则寻找内存中最早进入的页面,进行替换,其他页面时间增加1。

3.OPT算法

由于在实际中,不能预知下一个到来的是哪一个页面,因此OPT算法不能用于实际开发,OPT算法虽然不能在实际中应用,但是可以模拟页面命中的性能。效率循环遍历页面走向列表,直到都遍历完,先判断页面是否在内存中(是否命中),如果在,则命中跳过,如果不在,则寻找内存中在后面序列中最晚使用的页面,然后进行替换。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号