常见的磁盘调度算法

先来先服务算法
FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。该算法的优点是具有公平性。如果只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;但如果有大量进程竞争使用磁盘,那么这种算法在性能上往往接近于随机调度。所以,实际磁盘调度中考虑一些更为复杂的调度算法。[1] 
1、算法思想:按访问请求到达的先后次序服务。
2、优点:简单,公平。
3、缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。
4、例子:
假设磁盘访问序列:98,183,37,122,14,124,65,67。读写头起始位置:53。求:磁头服务序列和磁头移动总距离(道数)。
由题意和先来先服务算法的思想,得到下图所示的磁头移动轨迹。由此:
磁头服务序列为:98,183,37,122,14,124,65,67
磁头移动总距离=(98-53)+(183-98)+|37-183|+(122-37)+|14-122|+(124-14)+|65-124|+(67-65)=640(磁道)
FCFSFCFS


最短寻找时间优先算法
[1]  SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。
1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。
2、优点:改善了磁盘平均服务时间。
3、缺点:造成某些访问请求长期等待得不到服务。
4、例子:对上例的磁盘访问序列,可得磁头移动的轨迹如下图。


扫描算法(又称电梯算法)
SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。由于磁头移动规律与电梯运行相似,故又称为电梯调度算法。SCAN算法对最近扫描过的区域不公平,因此,它在访问局部性方面不如FCFS算法和SSTF算法好。[1] 
算法思想:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移[2]  动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。如下图所示:
扫描算法(电梯算法)的磁头移动轨迹
2、优点:克服了最短寻道优先的缺点,既考虑了距离,同时又考虑了方向。
以下是常见磁盘调度算法的源代码示例: 1. 先来先服务 (FCFS) ```c #include<stdio.h> #include<conio.h> void main() { int n,a[10],i,d=0; printf("Enter the number of requests:"); scanf("%d",&n); printf("Enter the requests:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("Seek Sequence is:"); for(i=0;i<n;i++) { printf("%d ",a[i]); d+=abs(a[i]-a[i-1]); } printf("\nTotal Seek Time is %d",d); getch(); } ``` 2. 最短寻道时间优先 (SSTF) ```c #include<stdio.h> #include<conio.h> void main() { int n,a[10],i,j,min,d=0,k=0,b[10],c[10],flag[10]={0}; printf("Enter the number of requests:"); scanf("%d",&n); printf("Enter the requests:"); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { min=1000; for(j=0;j<n;j++) { if(flag[j]==0) { if(min>abs(a[j]-k)) { min=abs(a[j]-k); b[i]=a[j]; c[i]=j; } } } flag[c[i]]=1; k=b[i]; d+=min; } printf("Seek Sequence is:"); for(i=0;i<n;i++) printf("%d ",b[i]); printf("\nTotal Seek Time is %d",d); getch(); } ``` 3. 扫描算法 (SCAN) ```c #include<stdio.h> #include<conio.h> void main() { int n,a[10],i,j,temp,d=0,k,pos; printf("Enter the number of requests:"); scanf("%d",&n); printf("Enter the requests:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("Enter the initial position:"); scanf("%d",&k); for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++) { if(a[i]>k) { pos=i; break; } } printf("Seek Sequence is:"); if(k<=50) { for(i=pos;i<n;i++) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(199-k); k=199; for(i=pos-1;i>=0;i--) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } } else { for(i=pos-1;i>=0;i--) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(0-k); k=0; for(i=pos;i<n;i++) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } } printf("\nTotal Seek Time is %d",d); getch(); } ``` 4. 循环扫描算法 (C-SCAN) ```c #include<stdio.h> #include<conio.h> void main() { int n,a[10],i,j,temp,d=0,k,pos; printf("Enter the number of requests:"); scanf("%d",&n); printf("Enter the requests:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("Enter the initial position:"); scanf("%d",&k); for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++) { if(a[i]>k) { pos=i; break; } } printf("Seek Sequence is:"); if(k<=50) { for(i=pos;i<n;i++) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(199-k); k=199; for(i=0;i<pos;i++) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(199-k); } else { for(i=pos-1;i>=0;i--) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(0-k); k=0; for(i=n-1;i>=pos;i--) { printf("%d ",a[i]); d+=abs(a[i]-k); k=a[i]; } d+=abs(0-k); } printf("\nTotal Seek Time is %d",d); getch(); } ``` 5. 最高响应比优先 (HRRN) ```c #include<stdio.h> #include<conio.h> void main() { int n,bt[10],wt[10],tat[10],i,j,sum=0,max,p[10]; float avg_wt,avg_tat; printf("Enter the number of processes:"); scanf("%d",&n); printf("Enter the burst time of processes:"); for(i=0;i<n;i++) { scanf("%d",&bt[i]); p[i]=i+1; } wt[0]=0; for(i=1;i<n;i++) { wt[i]=0; for(j=0;j<i;j++) wt[i]+=bt[j]; sum+=wt[i]; } avg_wt=(float)sum/n; sum=0; printf("\nProcess\tBurst Time\tWaiting Time\tTurnaround Time"); for(i=0;i<n;i++) { tat[i]=bt[i]+wt[i]; sum+=tat[i]; printf("\nP%d\t%d\t\t%d\t\t%d",p[i],bt[i],wt[i],tat[i]); } avg_tat=(float)sum/n; printf("\nAverage Waiting Time:%f",avg_wt); printf("\nAverage Turnaround Time:%f",avg_tat); max=0; for(i=0;i<n;i++) { if(max<((float)(bt[i]+wt[i])/bt[i])) { max=(float)(bt[i]+wt[i])/bt[i]; j=i; } } printf("\nProcess with highest response ratio:P%d",p[j]); getch(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值