操作系统:磁盘调度算法

目的:陆续整理近一年的学习收获

                                                         磁盘调度算法

一:概念   

  • 常见的磁盘调度算法有:

1.FCFS:先来先服务算法;

2.SSTF:最短寻道时间算法;

3.SCAN:扫描算法(也叫电梯调度算法);

4.CSCAN:循环扫描算法

 

  •  算法的详细介绍:

FCFS:算法思想非常简单,就是不论初始磁头在什么位置,都是按照服务队列的先后顺序依次处理进程,可以类比队列的先进先出。优点是进程处理起来非常简单,但缺点显而易见,就是平均寻道长度会很长。

SSTF:最短寻道时间算法,算法本质是贪心,已知磁头的初始位置,则最先被处理就是距离磁头位置最近的进程,处理完成后再处理距离当前磁道最近的进程,直到所有的进程被处理。该算法的优点是平均寻道长度会大大减少,缺点是距离初始磁头较远的服务长期得不到处理,产生“饥饿”现象。具体的思路是:通过循环寻找与初始磁头最近的进程,将进程处理,然后将该进程标记,将初始磁头移动到该进程所在的磁道。然后依次类推,已经标记的进程不再参与,直到所有的进程都被标记,磁盘调度完成。

SCAN:磁头仅沿一个方向进行扫描,在扫描途中完成所有没有完成的请求,直到磁头到达磁盘在这个方向上的最后一个磁道或者这个方向上最后一个请求所在的磁道。利用数组存储进程和磁道编号,依据给定的初始磁头,先找到初始磁头在哪两个进程之间,然后向内扫描。当磁头扫描到磁盘最内层即磁道0且进程还没有全部被处理,磁头开始向外扫描,直到所有的进程都完成。

CSCAN:在磁盘扫描算法的基础上改变磁头的扫描路径:扫描到最内层之后从最外层向内继续扫描,即扫描方向一致。该算法的思路与扫描算法基本一致,也使用二维数组进行进程编号和进程所在磁道号的存储,算法的不同之处在于当磁头扫描到磁盘的最内层时,磁头跳转到磁盘最外层重新向内扫描,这样就可以有效的避免将已经扫描过的磁道重新扫描一次,降低了平均寻到距离。 

二:测试举例 

假设磁盘访问序列:98,183,37,122,14,124,65,67。读写头起始位置:53

  • 先来先服务算法(FCFS)

             

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

             ​​​​​​​

  • 扫描算法(电梯算法)(SCAN)(向着减少方向)

            ​​​​​​​

  • CSCAN:循环扫描算法(向着增加方向)

           ​​​​​​​

三:程序设计

  • 变量及函数
#define MaxNumber 100
int TrackNum;//磁道数
int StartTrack;//开始磁道
int TrackOrder[MaxNumber];//初始磁道序列
int VisitOrder[MaxNumber];//访问磁道序列
bool Visited[MaxNumber];//标记是否被访问过
int MoveDistance[MaxNumber];//磁头移动距离(磁道数)
int Sum_Distance;//磁头移动的总距离
double AverageDistance;//磁头平均移动距离
bool direction;//选择磁头向内或向外方向
int choose;
void Enter(); //输入起始磁道号、磁道顺序
void initial();
void display();
void FCFS();//先来先服务,先进先出
void SSTF();//最短寻道时间优先
void SCAN();//扫描,从开始磁道沿选择方向扫描,直到没有要访问的磁道在沿反方向扫描
void CSCAN();//循环扫描,自开始磁道始终沿一个方向扫描,直到没有要访问的磁道再从最里圈或最外圈扫描
void choose_Algorithm();
  • 四个核心算法
//先来先服务,先进先出
void FCFS(){
    cout<<endl;
    cout<<"FCFS"<<endl;
    initial();

    //按照输入顺序依次访问磁道
    MoveDistance[0] = abs(TrackOrder[0]-StartTrack);
    Sum_Distance = MoveDistance[0];
    VisitOrder[0] = TrackOrder[0];

    for (int i=1;i<TrackNum;i++){
        MoveDistance[i] = abs(TrackOrder[i]-TrackOrder[i-1]);
        Sum_Distance += MoveDistance[i];
        VisitOrder[i] = TrackOrder[i];
    }

    Aver
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值