当前位置:   article > 正文

磁盘调度-循环扫描(CSCAN)_cscan算法

cscan算法

SCAN算法既能获得较好的寻道性能,又能防止饥饿现象。但是存在这样的问题:当磁头刚从里向外移动而超越了某一磁道时,恰好又有一进程请求访问此磁道,这时该进程必须等待。将磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该请求的请求被大大的推迟。

为此,CSCAN算法规定磁头单向移动,如果只是从里向外移动,当磁头移到最外的磁道并访问时,磁头立即返回到最里的欲访问磁道,即将最小磁道号紧接着最大磁道号循环,进行循环扫描。

输入:起始磁道以及要访问的磁道数目,要访问的磁道号,isadd。

输出:被访问的下一个磁道号和移动距离, 最后是平均寻道长度。

运行结果:

数据结构:

  1. //num为进程请求访问的磁道号
  2. int num[maxn];

辅助函数:

  1. //将当前磁头所在的位置s移动到磁道num[i]上
  2. //更新sum,s的值。
  3. void Move(int *num, int i, int &s, double &sum)
  4. {
  5. printf("%d %d\n", num[i], abs(s-num[i]));
  6. sum += abs(s-num[i]);
  7. s = num[i];
  8. }

源代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 100 + 5; //要求访问的进程最大数目。
  6. //磁盘调度算法
  7. //将当前磁头所在的位置s移动到磁道num[i]上
  8. //更新sum,s的值。
  9. void Move(int *num, int i, int &s, double &sum)
  10. {
  11. printf("%d %d\n", num[i], abs(s-num[i]));
  12. sum += abs(s-num[i]);
  13. s = num[i];
  14. }
  15. /*
  16. 循环扫描。
  17. 磁头单向移动,例如从里向外移动,当磁头移到最外的磁道并访问时,磁头立即返回
  18. 到最里的欲访问磁道,将最小磁道号紧接着最大磁道号循环,进行循环扫描
  19. */
  20. void CSCAN(int *num, int n, int s, double &sum, int isadd)
  21. {
  22. int i, j;
  23. sort(num, num+n);
  24. j = lower_bound(num, num+n, s) - num;
  25. if(isadd)
  26. {
  27. for(i = j; i < n; i++)
  28. Move(num, i, s, sum);
  29. for(i = 0; i < j; i++)
  30. Move(num, i, s, sum);
  31. }
  32. else
  33. {
  34. if(num[j] == s)
  35. j++;
  36. for(i = j-1; i >= 0; i--)
  37. Move(num, i, s, sum);
  38. for(i = n-1; i >= j; i--)
  39. Move(num, i, s, sum);
  40. }
  41. }
  42. int main()
  43. {
  44. int i, s, n, num[maxn], isadd;
  45. double sum;
  46. while(scanf("%d %d", &s, &n) == 2)
  47. {
  48. sum = 0;
  49. for(i = 0; i < n; i++)
  50. scanf("%d", &num[i]);
  51. scanf("%d", &isadd);
  52. //FCFS(num, n, s, sum);
  53. //SSTF(num, n, s, sum);
  54. //SCAN(num, n, s, sum, isadd);
  55. CSCAN(num, n, s, sum, isadd);
  56. printf("%lf\n", sum / n);
  57. }
  58. return 0;
  59. }
  60. /*
  61. 100 9
  62. 55 58 39 18 90 160 150 38 184
  63. 1
  64. 53 8
  65. 98 183 37 122 14 124 65 67
  66. 300 9
  67. 55 58 39 18 90 160 150 38 184
  68. 184 9
  69. 55 58 39 18 90 160 150 38 184
  70. 150 9
  71. 55 58 39 18 90 160 150 38 184
  72. 0 9
  73. 55 58 39 18 90 160 150 38 184
  74. 18 9
  75. 55 58 39 18 90 160 150 38 184
  76. */

 

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

闽ICP备14008679号