基于C语言的页面置换模拟程序设计

miruos

发布日期: 2019-01-24 16:49:02 浏览量: 440
评分:
star star star star star star star star_border star_border star_border
*转载请注明来自write-bug.com

1. 题目简介

用C语言设计一个程序,模拟一作业的执行过程。设该作业共有320条指令,即它的地址空间为32页,目前它的所有页面都还未调入内存。在模拟过程中,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令。如果所访问的指令尚未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业的虚页面,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

2. 所用数据结构

  1. /*定义内存中物理块的结构*/
  2. struct memoryblock
  3. {
  4. int pagenumber; // 页面号
  5. int access; // 访问位
  6. int time; // 访问时间
  7. int counter; // 访问次数
  8. };
  9. struct memoryblock M[4];

3. 程序代码描述

  1. void init()//初始化内存物理块
  2. void random()//生成随机数
  3. void FIFO()//先进先出置换算法
  4. void CLOCK()//时钟置换算法
  5. void LRU()//最近最久未使用置换算法
  6. void LFU()//最近最少访问置换算法

核心代码:

  1. void random()
  2. {
  3. srand((unsigned)time(NULL));
  4. int cnt = 0;
  5. command[cnt] = rand() % 320;
  6. cnt++;
  7. command[cnt] = command[cnt - 1] + 1;
  8. cnt++;
  9. while (cnt < 320)
  10. {
  11. command[cnt] = rand() % command[cnt - 2];
  12. cnt++;
  13. command[cnt] = command[cnt - 1] + 1;
  14. cnt++;
  15. command[cnt] = rand() % (320 - command[cnt - 1]) + command[cnt - 1];
  16. cnt++;
  17. command[cnt] = command[cnt - 1] + 1;
  18. cnt++;
  19. }
  20. }
  21. void oncefifo(int a)
  22. {
  23. int i;
  24. int p=0;//指向队首的指令
  25. int b = a / 10;
  26. int flag=0;
  27. for (i = 0;i < 4;i++)
  28. {
  29. if (M[i].pagenumber == b)//表示页面在内存中
  30. {
  31. M[i].access = 1;
  32. flag = 1;
  33. break;
  34. }
  35. if (M[i].pagenumber == -1)//表示页面不在内存中,且物理块为空
  36. {
  37. M[i].access = 1;
  38. M[i].pagenumber = b;
  39. p = (p + 1) % 4;
  40. unfindpage++;
  41. flag = 1;
  42. break;
  43. }
  44. }
  45. if (flag == 0)//进行页面置换
  46. {
  47. M[p].pagenumber = b;
  48. M[p].access = 1;
  49. unfindpage++;
  50. }
  51. }
  52. void onceclock(int a)
  53. {
  54. int i;
  55. int p=0;
  56. int b = a / 10;
  57. int flag = 0;
  58. for (i = 0;i < 4;i++)
  59. {
  60. if (M[i].pagenumber == b)//表示页面在内存中
  61. {
  62. M[i].access = 1;
  63. flag = 1;
  64. break;
  65. }
  66. if (M[i].pagenumber == -1)//表示页面不在内存中,且物理块为空
  67. {
  68. M[i].access = 1;
  69. M[i].pagenumber = b;
  70. p = (p + 1) % 4;
  71. unfindpage++;
  72. flag = 1;
  73. break;
  74. }
  75. }
  76. if (flag == 0)
  77. {
  78. while (M[p].access != 0)
  79. {
  80. M[p].access = 0;
  81. p = (p + 1) % 4;
  82. }
  83. M[p].pagenumber = b;
  84. M[p].access = 1;
  85. p = (p + 1) % 4;
  86. unfindpage++;
  87. }
  88. }
  89. void oncelru(int a)
  90. {
  91. int b = a / 10;
  92. int flag = 0;
  93. int i,j;
  94. for (i = 0;i < 4;i++)
  95. {
  96. if (M[i].pagenumber == b)//页面在内存中,更新时间
  97. {
  98. M[i].time = 0;
  99. M[i].access = 1;
  100. flag = 1;
  101. for (j = 0;j < 4;j++)
  102. {
  103. if (j != i&&M[j].pagenumber != -1)//其他未被访问的页面的时间加一
  104. {
  105. M[j].time++;
  106. }
  107. }
  108. break;
  109. }
  110. if (M[i].pagenumber == -1)//页面不在内存中,且物理块为空
  111. {
  112. M[i].time = 0;
  113. M[i].pagenumber = b;
  114. M[i].access = 1;
  115. unfindpage++;
  116. flag = 1;
  117. for (j = 0;j < 4;j++)
  118. {
  119. if (j != i&&M[j].pagenumber != -1)
  120. {
  121. M[j].time++;
  122. }
  123. }
  124. break;
  125. }
  126. }
  127. if (flag == 0)//页面不在内存中,进行置换
  128. {
  129. sort(M, M + 4, cmp1);
  130. M[0].time=0;
  131. M[0].access = 1;
  132. M[0].pagenumber = b;
  133. unfindpage++;
  134. for (j = 1;j < 4;j++)
  135. {
  136. M[j].time++;
  137. }
  138. }
  139. }
  140. void oncelfu(int a)
  141. {
  142. int b = a / 10;
  143. int flag = 1;
  144. int i;
  145. for (i = 0;i < 4;i++)
  146. {
  147. if (M[i].pagenumber == b)//页面在内存中
  148. {
  149. M[i].counter++;
  150. flag = 1;
  151. M[i].access = 1;
  152. break;
  153. }
  154. if (M[i].pagenumber = -1)
  155. {
  156. M[i].counter++;
  157. M[i].pagenumber = b;
  158. M[i].access = 1;
  159. flag = 1;
  160. unfindpage++;
  161. break;
  162. }
  163. }
  164. if (flag == 0)
  165. {
  166. sort(M, M + 4, cmp2);
  167. M[0].pagenumber = b;
  168. M[0].counter=1;
  169. M[i].access = 1;
  170. unfindpage++;
  171. }
  172. }

4. 运行结果

主菜单:

选取算法计算缺页率:

显示当前内存分配情况:

上传的附件 cloud_download 页面置换模拟程序设计.zip ( 230.27kb, 1次下载 )
error_outline 下载需要4点积分

发送私信

14
文章数
7
评论数
最近文章
eject