当前位置:   article > 正文

操作系统 磁盘调度---循环扫描(CSCAN)算法(C++实现 操作系统实验)_循环扫描调度算法

循环扫描调度算法

思路:

自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描

代码如下:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<cmath>
  6. using namespace std;
  7. int n;
  8. int start;
  9. int xb;
  10. typedef pair<int, int> p;
  11. vector<p> v;
  12. vector<int> seq;
  13. const int INF = 0x3f3f3f3f;
  14. double avgfind;
  15. int main() {
  16. cout << "请输入磁道个数:" << "\n";
  17. cin >> n;
  18. int temp = n;
  19. cout << "请输入开始磁道号:" << "\n";
  20. cin >> start;
  21. int x;
  22. cout << "请依次输入" << n << "个磁道号" << "\n";
  23. for(int i = 1; i <= n; i ++) {
  24. cin >> x;
  25. seq.push_back(x);
  26. }
  27. sort(seq.begin(), seq.end());
  28. if(seq[0] > start) {
  29. v.push_back({seq[0], abs(seq[0] - start)});
  30. avgfind += abs(seq[0] - start);
  31. start = seq[0];
  32. xb = 1;
  33. for(int i = xb; i < seq.size(); i ++) {
  34. v.push_back({seq[i], abs(seq[i] - start)});
  35. avgfind += abs(seq[i] - start);
  36. start = seq[i];
  37. }
  38. }
  39. else if(seq[n - 1] < start) {
  40. v.push_back({seq[n - 1], abs(start - seq[n - 1])});
  41. avgfind += abs(start - seq[n - 1]);
  42. xb = n - 2;
  43. start = seq[n - 1];
  44. for(int i = xb; i >= 0; i --) {
  45. v.push_back({seq[i], abs(seq[i] - start)});
  46. avgfind += abs(seq[i] - start);
  47. start = seq[i];
  48. }
  49. } else {
  50. for(int i = 0; i < seq.size() - 1; i ++) {
  51. if(seq[i + 1] > start && seq[i] < start) {
  52. v.push_back({seq[i + 1], abs(seq[i + 1] - start)});
  53. avgfind += abs(seq[i + 1] - start);
  54. start = seq[i + 1];
  55. xb = (i + 2 > seq.size()) ? seq.size() : (i + 2);
  56. break;
  57. }
  58. }
  59. for(int i = xb; i < seq.size(); i ++) {
  60. v.push_back({seq[i], abs(seq[i] - start)});
  61. avgfind += abs(seq[i] - start);
  62. start = seq[i];
  63. }
  64. for(int i = 0; i <= xb - 2; i ++) {
  65. v.push_back({seq[i], abs(seq[i] - start)});
  66. avgfind += abs(seq[i] - start);
  67. start = seq[i];
  68. }
  69. }
  70. cout << "\n";
  71. cout << "磁道号\t移动距离" << "\n";
  72. for(int i = 0; i < v.size(); i ++) {
  73. cout << v[i].first << "\t" << v[i].second << "\n";
  74. }
  75. cout << "平均寻道长度:" << "\t";
  76. printf("%.2lf", avgfind / temp);
  77. return 0;
  78. }

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

闽ICP备14008679号