磁盘调度算法

需求分析

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

概要设计

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

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

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

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

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

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

4.C-SCAN算法

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

5.LOOK调度算法

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

6.C-LOOK调度算法

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

代码实现

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

#include <iostream>
#include <cmath>
using namespace std;
const int maxn=1010;

void run(int track[],int index,int n)
{
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=abs(index-track[i]);
        index=track[i];
    }
    cout<<"访问磁道顺序为"<<endl;
    for(int i=1;i<=n;i++)
        cout<<track[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int track[],int n)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1;i<=n;i++)
        cin>>track[i];

}
void FCFS_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    int track[maxn];
    input(track,n);
    run(track,index,n);
}

int main()
{
    FCFS_PRO();
    return 0;
}

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


#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
   int sum=0;
   int order[maxn];
   int cur=1;
   while(!l.empty()&&!r.empty())
   {
       if(abs(l.top()-index)<=abs(r.top()-index))
       {
           sum+=abs(l.top()-index);
           index=l.top();
           l.pop();
           order[cur++]=index;
       }
       else
       {
           sum+=abs(r.top()-index);
           index=l.top();
           l.pop();
           order[cur++]=index;
       }
   }
   while(!l.empty())
   {
       sum+=abs(l.top()-index);
           index=l.top();
           l.pop();
           order[cur++]=index;
   }
    while(!r.empty())
   {
       sum+=abs(r.top()-index);
           index=r.top();
           r.pop();
           order[cur++]=index;
   }
   cout<<"访问磁道顺序为"<<endl;
    for(int i=1;i<=n;i++)
        cout<<order[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1;i<=n;i++)
      {
            cin>>track[i];
            if(track[i]>=index)
                r.push(track[i]);
            else
                l.push(track[i]);
      }

}
void SSTF_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    input(index,n);
    run(index,n);
}

int main()
{
    SSTF_PRO();
    return 0;
}

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


#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
int maxindex=0;
int minindex=0;
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n,int capacity)
{
    int sum=0;
    int order[maxn];
    int cur=1;
    while(!r.empty())
    {
        sum+=abs(r.top()-index);
        index=r.top();
        r.pop();
        if(index!=capacity||(index==capacity&&maxindex==1))
            {order[cur++]=index;
            }
    }

    while(!l.empty())
    {
        sum+=abs(l.top()-index);
        index=l.top();
        l.pop();
        if(index!=0||(index==0&&minindex==1))
            order[cur++]=index;

    }
    cout<<"访问磁道顺序为"<<endl;
    for(int i=1; i<=n; i++)
        cout<<order[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n,int capacity)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1; i<=n; i++)
    {
        cin>>track[i];
        if(track[i]>=index)
        {
            if(track[i]==capacity)
                maxindex=1;
            r.push(track[i]);
        }
        else
        {
            if(track[i]==0)
                minindex=1;
            l.push(track[i]);
        }
    }
    if(!maxindex)
    r.push(capacity);
    if(!minindex)
    l.push(0);

}
void SCAN_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入磁盘容量"<<endl;
    int capacity;
    cin>>capacity;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    input(index,n,capacity);
    run(index,n,capacity);
}

int main()
{
    SCAN_PRO();
    return 0;
}

4.C-SCAN算法


#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
int maxindex=0;
int minindex=0;
priority_queue<int, vector<int>, greater<int>>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n,int capacity)
{
    int sum=0;
    int order[maxn];
    int cur=1;
    while(!r.empty())
    {
        sum+=abs(r.top()-index);
        index=r.top();
        r.pop();
        if(index!=capacity||(index==capacity&&maxindex==1))
            {order[cur++]=index;
            }
    }

    while(!l.empty())
    {
        sum+=abs(l.top()-index);
        index=l.top();
        l.pop();
        if(index!=0||(index==0&&minindex==1))
            order[cur++]=index;

    }
    cout<<"访问磁道顺序为"<<endl;
    for(int i=1; i<=n; i++)
        cout<<order[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n,int capacity)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1; i<=n; i++)
    {
        cin>>track[i];
        if(track[i]>=index)
        {
            if(track[i]==capacity)
                maxindex=1;
            r.push(track[i]);
        }
        else
        {
            if(track[i]==0)
                minindex=1;
            l.push(track[i]);
        }
    }
    if(!maxindex)
    r.push(capacity);
    if(!minindex)
    l.push(0);

}
void SCAN_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入磁盘容量"<<endl;
    int capacity;
    cin>>capacity;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    input(index,n,capacity);
    run(index,n,capacity);
}

int main()
{
    SCAN_PRO();
    return 0;
}

5.LOOK调度算法


#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
   int sum=0;
   int order[maxn];
   int cur=1;
    while(!r.empty())
   {
       sum+=abs(r.top()-index);
           index=r.top();
           r.pop();
           order[cur++]=index;
   }

   while(!l.empty())
   {
       sum+=abs(l.top()-index);
           index=l.top();
           l.pop();
           order[cur++]=index;
   }
   cout<<"访问磁道顺序为"<<endl;
    for(int i=1;i<=n;i++)
        cout<<order[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1;i<=n;i++)
      {
            cin>>track[i];
            if(track[i]>=index)
                r.push(track[i]);
            else
                l.push(track[i]);
      }

}
void LOOK_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    input(index,n);
    run(index,n);
}

int main()
{
    LOOK_PRO();
    return 0;
}

6.C-LOOK调度算法


#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int, vector<int>, greater<int>>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
   int sum=0;
   int order[maxn];
   int cur=1;
    while(!r.empty())
   {
       sum+=abs(r.top()-index);
           index=r.top();
           r.pop();
           order[cur++]=index;
   }

   while(!l.empty())
   {
       sum+=abs(l.top()-index);
           index=l.top();
           l.pop();
           order[cur++]=index;
   }
   cout<<"访问磁道顺序为"<<endl;
    for(int i=1;i<=n;i++)
        cout<<order[i]<<" ";
    cout<<endl;
    cout<<"寻道总距离为:"<<sum<<endl;
    cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
    cout<<"请依次输入需要访问的磁道号"<<endl;
    for(int i=1;i<=n;i++)
      {
            cin>>track[i];
            if(track[i]>=index)
                r.push(track[i]);
            else
                l.push(track[i]);
      }

}
void CLOOK_PRO()
{
    cout<<"请输入当前磁道号"<<endl;
    int index;
    cin>>index;
    cout<<"请输入需要访问的磁道数目"<<endl;
    int n;
    cin>>n;
    input(index,n);
    run(index,n);
}

int main()
{
    CLOOK_PRO();
    return 0;
}
55 58 39 18 90 160 150 38 184

运行实例

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

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

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

 

4.SCAN算法

5.LOOK调度算法

 

6.CLOOK调度算法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值