磁盘调度算法

川长思鸟来 2022-02-03 02:49 390阅读 0赞

需求分析

分别实现先到先服务调度(FCFS)磁盘调度算法、最短寻道时间优先算法(SSTF)、“电梯”调度算法(SCAN算法)、C-SCAN算法、LOOK调度算法和C-LOOK调度算法

概要设计

1.先到先服务调度(FCFS)磁盘调度算法

按照磁道的访问顺序依次访问每个磁道。

2.最短寻道时间优先算法(SSTF)

从指定磁道,依次访问距离本磁道最近的磁道。

3.“电梯”调度算法(SCAN算法)

从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问到最终磁道后,转向访问初始磁道另一侧的每个磁道,规则和以上相同。

4.C-SCAN算法

从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问到磁盘最大(最小)容量后,转向访问初始磁道另一侧的每个磁道,到磁盘容量最小(最大),规则和以上相同。

5.LOOK调度算法

从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问完最终磁道后,转向访问据本磁道最远的磁道,按如上规则依次访问至初始磁道。

6.C-LOOK调度算法

从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问至磁盘最大(最小)容量后,转向访问磁盘的最小(最大)容量磁道,按如上规则依次访问至初始磁道。

代码实现

1.先到先服务调度(FCFS)

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. const int maxn=1010;
  5. void run(int track[],int index,int n)
  6. {
  7. int sum=0;
  8. for(int i=1;i<=n;i++)
  9. {
  10. sum+=abs(index-track[i]);
  11. index=track[i];
  12. }
  13. cout<<"访问磁道顺序为"<<endl;
  14. for(int i=1;i<=n;i++)
  15. cout<<track[i]<<" ";
  16. cout<<endl;
  17. cout<<"寻道总距离为:"<<sum<<endl;
  18. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  19. }
  20. void input(int track[],int n)
  21. {
  22. cout<<"请依次输入需要访问的磁道号"<<endl;
  23. for(int i=1;i<=n;i++)
  24. cin>>track[i];
  25. }
  26. void FCFS_PRO()
  27. {
  28. cout<<"请输入当前磁道号"<<endl;
  29. int index;
  30. cin>>index;
  31. cout<<"请输入需要访问的磁道数目"<<endl;
  32. int n;
  33. cin>>n;
  34. int track[maxn];
  35. input(track,n);
  36. run(track,index,n);
  37. }
  38. int main()
  39. {
  40. FCFS_PRO();
  41. return 0;
  42. }

2.最短寻道时间优先算法(SSTF)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1010;
  4. int track[maxn];
  5. priority_queue<int>l;
  6. priority_queue<int, vector<int>, greater<int>>r;
  7. void run(int index,int n)
  8. {
  9. int sum=0;
  10. int order[maxn];
  11. int cur=1;
  12. while(!l.empty()&&!r.empty())
  13. {
  14. if(abs(l.top()-index)<=abs(r.top()-index))
  15. {
  16. sum+=abs(l.top()-index);
  17. index=l.top();
  18. l.pop();
  19. order[cur++]=index;
  20. }
  21. else
  22. {
  23. sum+=abs(r.top()-index);
  24. index=l.top();
  25. l.pop();
  26. order[cur++]=index;
  27. }
  28. }
  29. while(!l.empty())
  30. {
  31. sum+=abs(l.top()-index);
  32. index=l.top();
  33. l.pop();
  34. order[cur++]=index;
  35. }
  36. while(!r.empty())
  37. {
  38. sum+=abs(r.top()-index);
  39. index=r.top();
  40. r.pop();
  41. order[cur++]=index;
  42. }
  43. cout<<"访问磁道顺序为"<<endl;
  44. for(int i=1;i<=n;i++)
  45. cout<<order[i]<<" ";
  46. cout<<endl;
  47. cout<<"寻道总距离为:"<<sum<<endl;
  48. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  49. }
  50. void input(int index,int n)
  51. {
  52. cout<<"请依次输入需要访问的磁道号"<<endl;
  53. for(int i=1;i<=n;i++)
  54. {
  55. cin>>track[i];
  56. if(track[i]>=index)
  57. r.push(track[i]);
  58. else
  59. l.push(track[i]);
  60. }
  61. }
  62. void SSTF_PRO()
  63. {
  64. cout<<"请输入当前磁道号"<<endl;
  65. int index;
  66. cin>>index;
  67. cout<<"请输入需要访问的磁道数目"<<endl;
  68. int n;
  69. cin>>n;
  70. input(index,n);
  71. run(index,n);
  72. }
  73. int main()
  74. {
  75. SSTF_PRO();
  76. return 0;
  77. }

3.“电梯”调度算法(SCAN算法)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1010;
  4. int track[maxn];
  5. int maxindex=0;
  6. int minindex=0;
  7. priority_queue<int>l;
  8. priority_queue<int, vector<int>, greater<int>>r;
  9. void run(int index,int n,int capacity)
  10. {
  11. int sum=0;
  12. int order[maxn];
  13. int cur=1;
  14. while(!r.empty())
  15. {
  16. sum+=abs(r.top()-index);
  17. index=r.top();
  18. r.pop();
  19. if(index!=capacity||(index==capacity&&maxindex==1))
  20. {order[cur++]=index;
  21. }
  22. }
  23. while(!l.empty())
  24. {
  25. sum+=abs(l.top()-index);
  26. index=l.top();
  27. l.pop();
  28. if(index!=0||(index==0&&minindex==1))
  29. order[cur++]=index;
  30. }
  31. cout<<"访问磁道顺序为"<<endl;
  32. for(int i=1; i<=n; i++)
  33. cout<<order[i]<<" ";
  34. cout<<endl;
  35. cout<<"寻道总距离为:"<<sum<<endl;
  36. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  37. }
  38. void input(int index,int n,int capacity)
  39. {
  40. cout<<"请依次输入需要访问的磁道号"<<endl;
  41. for(int i=1; i<=n; i++)
  42. {
  43. cin>>track[i];
  44. if(track[i]>=index)
  45. {
  46. if(track[i]==capacity)
  47. maxindex=1;
  48. r.push(track[i]);
  49. }
  50. else
  51. {
  52. if(track[i]==0)
  53. minindex=1;
  54. l.push(track[i]);
  55. }
  56. }
  57. if(!maxindex)
  58. r.push(capacity);
  59. if(!minindex)
  60. l.push(0);
  61. }
  62. void SCAN_PRO()
  63. {
  64. cout<<"请输入当前磁道号"<<endl;
  65. int index;
  66. cin>>index;
  67. cout<<"请输入磁盘容量"<<endl;
  68. int capacity;
  69. cin>>capacity;
  70. cout<<"请输入需要访问的磁道数目"<<endl;
  71. int n;
  72. cin>>n;
  73. input(index,n,capacity);
  74. run(index,n,capacity);
  75. }
  76. int main()
  77. {
  78. SCAN_PRO();
  79. return 0;
  80. }

4.C-SCAN算法

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1010;
  4. int track[maxn];
  5. int maxindex=0;
  6. int minindex=0;
  7. priority_queue<int, vector<int>, greater<int>>l;
  8. priority_queue<int, vector<int>, greater<int>>r;
  9. void run(int index,int n,int capacity)
  10. {
  11. int sum=0;
  12. int order[maxn];
  13. int cur=1;
  14. while(!r.empty())
  15. {
  16. sum+=abs(r.top()-index);
  17. index=r.top();
  18. r.pop();
  19. if(index!=capacity||(index==capacity&&maxindex==1))
  20. {order[cur++]=index;
  21. }
  22. }
  23. while(!l.empty())
  24. {
  25. sum+=abs(l.top()-index);
  26. index=l.top();
  27. l.pop();
  28. if(index!=0||(index==0&&minindex==1))
  29. order[cur++]=index;
  30. }
  31. cout<<"访问磁道顺序为"<<endl;
  32. for(int i=1; i<=n; i++)
  33. cout<<order[i]<<" ";
  34. cout<<endl;
  35. cout<<"寻道总距离为:"<<sum<<endl;
  36. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  37. }
  38. void input(int index,int n,int capacity)
  39. {
  40. cout<<"请依次输入需要访问的磁道号"<<endl;
  41. for(int i=1; i<=n; i++)
  42. {
  43. cin>>track[i];
  44. if(track[i]>=index)
  45. {
  46. if(track[i]==capacity)
  47. maxindex=1;
  48. r.push(track[i]);
  49. }
  50. else
  51. {
  52. if(track[i]==0)
  53. minindex=1;
  54. l.push(track[i]);
  55. }
  56. }
  57. if(!maxindex)
  58. r.push(capacity);
  59. if(!minindex)
  60. l.push(0);
  61. }
  62. void SCAN_PRO()
  63. {
  64. cout<<"请输入当前磁道号"<<endl;
  65. int index;
  66. cin>>index;
  67. cout<<"请输入磁盘容量"<<endl;
  68. int capacity;
  69. cin>>capacity;
  70. cout<<"请输入需要访问的磁道数目"<<endl;
  71. int n;
  72. cin>>n;
  73. input(index,n,capacity);
  74. run(index,n,capacity);
  75. }
  76. int main()
  77. {
  78. SCAN_PRO();
  79. return 0;
  80. }

5.LOOK调度算法

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1010;
  4. int track[maxn];
  5. priority_queue<int>l;
  6. priority_queue<int, vector<int>, greater<int>>r;
  7. void run(int index,int n)
  8. {
  9. int sum=0;
  10. int order[maxn];
  11. int cur=1;
  12. while(!r.empty())
  13. {
  14. sum+=abs(r.top()-index);
  15. index=r.top();
  16. r.pop();
  17. order[cur++]=index;
  18. }
  19. while(!l.empty())
  20. {
  21. sum+=abs(l.top()-index);
  22. index=l.top();
  23. l.pop();
  24. order[cur++]=index;
  25. }
  26. cout<<"访问磁道顺序为"<<endl;
  27. for(int i=1;i<=n;i++)
  28. cout<<order[i]<<" ";
  29. cout<<endl;
  30. cout<<"寻道总距离为:"<<sum<<endl;
  31. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  32. }
  33. void input(int index,int n)
  34. {
  35. cout<<"请依次输入需要访问的磁道号"<<endl;
  36. for(int i=1;i<=n;i++)
  37. {
  38. cin>>track[i];
  39. if(track[i]>=index)
  40. r.push(track[i]);
  41. else
  42. l.push(track[i]);
  43. }
  44. }
  45. void LOOK_PRO()
  46. {
  47. cout<<"请输入当前磁道号"<<endl;
  48. int index;
  49. cin>>index;
  50. cout<<"请输入需要访问的磁道数目"<<endl;
  51. int n;
  52. cin>>n;
  53. input(index,n);
  54. run(index,n);
  55. }
  56. int main()
  57. {
  58. LOOK_PRO();
  59. return 0;
  60. }

6.C-LOOK调度算法

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1010;
  4. int track[maxn];
  5. priority_queue<int, vector<int>, greater<int>>l;
  6. priority_queue<int, vector<int>, greater<int>>r;
  7. void run(int index,int n)
  8. {
  9. int sum=0;
  10. int order[maxn];
  11. int cur=1;
  12. while(!r.empty())
  13. {
  14. sum+=abs(r.top()-index);
  15. index=r.top();
  16. r.pop();
  17. order[cur++]=index;
  18. }
  19. while(!l.empty())
  20. {
  21. sum+=abs(l.top()-index);
  22. index=l.top();
  23. l.pop();
  24. order[cur++]=index;
  25. }
  26. cout<<"访问磁道顺序为"<<endl;
  27. for(int i=1;i<=n;i++)
  28. cout<<order[i]<<" ";
  29. cout<<endl;
  30. cout<<"寻道总距离为:"<<sum<<endl;
  31. cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
  32. }
  33. void input(int index,int n)
  34. {
  35. cout<<"请依次输入需要访问的磁道号"<<endl;
  36. for(int i=1;i<=n;i++)
  37. {
  38. cin>>track[i];
  39. if(track[i]>=index)
  40. r.push(track[i]);
  41. else
  42. l.push(track[i]);
  43. }
  44. }
  45. void CLOOK_PRO()
  46. {
  47. cout<<"请输入当前磁道号"<<endl;
  48. int index;
  49. cin>>index;
  50. cout<<"请输入需要访问的磁道数目"<<endl;
  51. int n;
  52. cin>>n;
  53. input(index,n);
  54. run(index,n);
  55. }
  56. int main()
  57. {
  58. CLOOK_PRO();
  59. return 0;
  60. }
  61. 55 58 39 18 90 160 150 38 184

运行实例

1.先到先服务调度(FCFS)磁盘调度算法

20190508171252704.png

2.最短寻道时间优先算法(SSTF)

20190508171255543.png

3.“电梯”调度算法(SCAN算法)

20190508171304596.png

4.SCAN算法

201905081713093.png

5.LOOK调度算法

2019050817131715.png

6.CLOOK调度算法

20190508171319187.png

发表评论

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

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

相关阅读

    相关 磁盘调度算法

    磁盘调度算法是计算机操作系统中用于管理磁盘上的数据访问的重要组成部分。这些算法有助于优化数据的读写操作,以减少磁盘访问时间,提高系统性能。以下是一些常见的磁盘调度算法: 先来

    相关 磁盘调度算法

    磁盘调度算法 为了减少对文件的访问时间,应采用一种最佳的磁盘调度算法,以使各进程对磁盘的平均访问时间最少。由于在访问磁盘时主要是寻道时间。因此,磁盘调度的目标是使磁盘的平

    相关 磁盘调度算法

    磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备

    相关 磁盘调度算法

    需求分析 分别实现先到先服务调度(FCFS)磁盘调度算法、最短寻道时间优先算法(SSTF)、“电梯”调度算法(SCAN算法)、C-SCAN算法、LOOK调度算法和C-LO

    相关 磁盘寻道调度算法

    磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读 / 写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘