操作系统实验之磁盘调度算法模拟(最短寻道时间优先SSTF 和 扫描算法SCAN)

淩亂°似流年 2022-06-14 00:27 299阅读 0赞

操作系统实验之磁盘调度算法模拟(最短寻道时间优先SSTF 和 扫描算法SCAN)


  • 最短寻道时间优先SSTF
  1. * 要求每次访问的磁道与当前磁头所在的磁道距离最近、
  2. * 也就是每次访问距离磁头最近的磁道
  • 扫描算法SCAN
  1. * 由里向外地访问,直到再无更外的磁道需要访问时,才将磁臂转向为自外向里移动
  • 磁盘调度算法 详细介绍

模拟代码:

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. using namespace std;
  5. //定义磁盘号的范围(0 <= 磁盘号 < MAX_DISK_NUMBER)
  6. const int MAX_DISK = 200;
  7. //定义一个数组存储要访问的磁盘的序列号
  8. int Disk[MAX_DISK + 1];
  9. //DISK_NUMBER要访问的磁道的数量,
  10. int DISK_NUMBER = 0;
  11. //保存磁道的访问方向 DIRECTION 为 1 时从小到大, 为 0 时 从大到小;
  12. int DIRECTION = 1;
  13. //定义当前磁道号
  14. int CURRENT_DISK;
  15. //比较大小的方法,用于对 Disk[] 的排序
  16. int compare(int a,int b){
  17. return a > b;
  18. }
  19. //最短寻道时间优先(SSTF)
  20. //将当前的磁道号放入要访问的磁道号 Disk[] 中,排序后便可轻易找到其左右的要访问的磁道号
  21. void SSTF(){
  22. //定义三个变量,left标记 当前磁道 左边第一个微调度的磁道号在数组中的序号
  23. //right 标记 当前磁道 右边第一个未调度的磁道号在数组中的序号
  24. //now 当前磁道;
  25. int left,right,now;
  26. //定义寻道长度和平均寻道长度
  27. double length = 0,avg_length = 0;
  28. //根据磁道移动的方向不同对磁道号进行排序
  29. if(DIRECTION == 1)
  30. sort(Disk,Disk + DISK_NUMBER + 1);
  31. else
  32. sort(Disk,Disk + DISK_NUMBER + 1,compare);
  33. // //输出排序后的Disk[]
  34. // for(int i = 0; i < DISK_NUMBER; i++)
  35. // printf("%d ",Disk[i]);
  36. for(int i = 0; i <= DISK_NUMBER; i++)
  37. {
  38. //找到当前磁道 左右边第一个未调度的磁道号在数组中的序号
  39. if(Disk[i] == CURRENT_DISK)
  40. {
  41. now = i;
  42. left = i -1;
  43. right = i + 1;
  44. }
  45. }
  46. //不断寻找距离 now 进的并输出,相应改变 now left right
  47. while(!(left == -1 && right == DISK_NUMBER + 1))
  48. {
  49. //如果左侧到了 Disk[] 外则把右边的顺序输出
  50. if(left <= -1)
  51. {
  52. length += fabs(Disk[right] - Disk[now]);
  53. for(int i = right; i <= DISK_NUMBER; i++)
  54. {
  55. if(i > right)
  56. length += fabs(Disk[i] - Disk[i - 1]);
  57. printf("%d ",Disk[i]);
  58. }
  59. break;
  60. }
  61. //如果右侧到了 Disk[] 外则把左边的顺序输出
  62. if(right == DISK_NUMBER + 1)
  63. {
  64. length += fabs(Disk[now] - Disk[left]);
  65. for(int i = left; i >=0; i--)
  66. {
  67. if(i < left)
  68. length += fabs(Disk[i] - Disk[i + 1]);
  69. printf("%d ",Disk[i]);
  70. }
  71. break;
  72. }
  73. //right 距离 <= left 向右走(不管方向为什么,都是往右走,因为方向不同时的排序方法不同,
  74. //根据方向区分左右距离相等时向左还是向右的话,效果与排序叠加,恰好得到了错误的序列)
  75. if(fabs(Disk[right] - Disk[now]) <= fabs(Disk[now] - Disk[left]))
  76. {
  77. length += fabs(Disk[right] - Disk[now]);
  78. printf("%d ",Disk[right]);
  79. now = right;
  80. right++;
  81. }
  82. else if(fabs(Disk[right] - Disk[now]) > fabs(Disk[now] - Disk[left]))
  83. {
  84. length += fabs(Disk[now] - Disk[left]);
  85. printf("%d ",Disk[left]);
  86. now = left;
  87. left--;
  88. }
  89. }
  90. //计算平均寻道时间
  91. avg_length = length / DISK_NUMBER;
  92. printf("平均寻道时间为:%lf",avg_length);
  93. }
  94. //扫描算法(SCAN)
  95. void SCAN()
  96. {
  97. //定义三个变量,left标记 当前磁道 左边第一个微调度的磁道号在数组中的序号
  98. //right 标记 当前磁道 右边第一个未调度的磁道号在数组中的序号
  99. //now 当前磁道;
  100. int left,right,now;
  101. //定义寻道长度和平均寻道长度
  102. double length = 0,avg_length = 0;
  103. //根据磁道移动的方向不同对磁道号进行排序
  104. if(DIRECTION == 1)
  105. sort(Disk,Disk + DISK_NUMBER + 1);
  106. else
  107. sort(Disk,Disk + DISK_NUMBER + 1,compare);
  108. // //输出排序后的Disk[]
  109. // for(int i = 0; i <= DISK_NUMBER; i++)
  110. // printf("%d ",Disk[i]);
  111. for(int i = 0; i <= DISK_NUMBER; i++)
  112. {
  113. //找到当前磁道 左右边第一个未调度的磁道号在数组中的序号
  114. if(Disk[i] == CURRENT_DISK)
  115. {
  116. now = i;
  117. left = i -1;
  118. right = i + 1;
  119. }
  120. }
  121. length += fabs(Disk[now] - Disk[right]);
  122. //从now向DIRECTION方向移动
  123. for(int i = right; i <= DISK_NUMBER; i++)
  124. {
  125. if(i > right)
  126. length += fabs(Disk[i] - Disk[i -1]);
  127. printf("%d ",Disk[i]);
  128. }
  129. length += fabs(Disk[DISK_NUMBER] - Disk[left]);
  130. //走到DIRECTION方向尽头,返回扫描
  131. for(int i = left; i>=0; i--)
  132. {
  133. if(i < left)
  134. length += fabs(Disk[i] - Disk[i + 1]);
  135. printf("%d ",Disk[i]);
  136. }
  137. //计算平均寻道时间
  138. avg_length = length / DISK_NUMBER;
  139. printf("平均寻道时间为:%lf",avg_length);
  140. }
  141. int main()
  142. {
  143. printf("input the number of the disk\n");
  144. scanf("%d",&DISK_NUMBER);
  145. printf("input the Disk[]\n");
  146. for(int i = 0; i < DISK_NUMBER; i++)
  147. scanf("%d",&Disk[i]);
  148. printf("input the direction of the disk , right = 1 and left = 0\n");
  149. scanf("%d",&DIRECTION);
  150. printf("input the current disk\n");
  151. scanf("%d",&CURRENT_DISK);
  152. //把CURRENT_DISK加入Disk[]
  153. Disk[DISK_NUMBER] = CURRENT_DISK;
  154. printf("the answer of the SSTF is:\n");
  155. SSTF();
  156. printf("\nthe answer of the SCAN is:\n");
  157. SCAN();
  158. return 0;
  159. }

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读