实验七 磁盘调度算法的模拟与实现

1、实验目的

(1) 了解磁盘结构以及磁盘上数据的组织方式。
(2) 掌握磁盘访问时间的计算方式。
(3) 掌握常用磁盘调度算法及其相关特性。

2、实验基本知识及原理

(1)磁盘数据的组织
磁盘上每一条物理记录都有唯一的地址,该地址包括三个部分:磁头号(盘面号)、柱面号(磁
道号)和扇区号。给定这三个量就可以唯一地确定一个地址。
(2)磁盘访问时间的计算方式
磁盘在工作时以恒定的速率旋转。为保证读或写,磁头必须移动到所要求的磁道上,当所要求
的扇区的开始位置旋转到磁头下时,开始读或写数据。对磁盘的访问时间包括:寻道时间、旋转延
迟时间和传输时间。
(3)磁盘调度算法
磁盘调度的目的是要尽可能降低磁盘的寻道时间,以提高磁盘 I/O 系统的性能。
先进先出算法:按访问请求到达的先后次序进行调度。
最短服务时间优先算法:优先选择使磁头臂从当前位置开始移动最少的磁盘 I/O 请求进行调度。
SCAN(电梯算法):要求磁头臂先沿一个方向移动,并在途中满足所有未完成的请求,直到它
到达这个方向上的最后一个磁道,或者在这个方向上没有别的请求为止,后一种改进有时候称作
LOOK 策略。然后倒转服务方向,沿相反方向扫描,同样按顺序完成所有请求。
C-SCAN(循环扫描)算法:在磁盘调度时,把扫描限定在一个方向,当沿某个方向访问到最
后一个磁道时,磁头臂返回到磁盘的另一端,并再次开始扫描。

3、实验内容

本实验通过编程模拟实现几种常见的磁盘调度算法。

c++实现:

#include 
#include
using namespace std;
/*
2021-12-16 @浩茫
磁道模拟算法
*/
void  FIFO(vector<int> v, int  currentLocation)
{
    int x,sum=0;
    float len = v.size();
    cout<<"\nFIFO算法:\n"<<"访问磁道顺序:";
    for(int i=0; i<len; i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<"\n横跨的磁道数:";
    for(int i=0; i<len; i++ )
    {
        x=abs(currentLocation-v[i]);
        cout<<x<<" ";
        sum+= x;
        currentLocation=v[i];
    }
    cout<<"\n平均寻道长度:"<<(sum/len)<<endl;
    return ;
}

void  SSTF(vector<int> v, int  currentLocation)
{
    int x,j=0,sum=0;
    int a[1000] = {0}; //记录横跨的磁道数
    bool arr[100]= {false} ; //标志数组,记录磁道是否完成寻道,初始值全为false
    int m=0;//已经完成寻道的个数
    int index ;  //记录角标位置

    float len = v.size();
    cout<<"\nSSTF算法:\n"<<"访问磁道顺序:";
    while(m<len)
    {
        int min_length=INT_MAX;//在每一轮循环前重置最小磁道距离
        for(int i=0; i<len; i++)
        {
            if(arr[i]==true)continue;
            else
            {
                x=abs(currentLocation-v[i]);
                if(x<min_length)
                {
                    min_length=x;
                    index = i;
                }
            }

        }
        a[j]=abs(currentLocation-v[index]);
        sum+=a[j] ;
        j++;
        arr[index]=true;
        currentLocation=v[index];
        cout<<v[index]<<" ";
        m++;
    }
    cout<<"\n横跨的磁道数:";
    for(int j=0; j<len; j++)
    {
        cout<<a[j]<<" ";
    }
    cout<<"\n平均寻道长度:"<<(sum/len)<<endl;
    return ;
}

void SCAN(vector<int> v, int  currentLocation)
{
    int x,j=0,sum=0;
    float len = v.size();
    int index=0 ;  //记录角标位置
    int a[1000]={0}; //记录横跨的磁道数

    sort(v.begin(),v.end());
    for(int i=0; i<len ; i++)
    {
        if(v[i]<currentLocation)index++;
        else break;
    }
    v.insert(v.begin()+index,currentLocation);
    vector<int>::iterator iter;
    cout<<"\nSCAN算法:\n";
    cout<<"请输入访问的初始方向:1代表递增,0代表递减:";
    cin>>x;
    cout<<"访问磁道顺序:";
    if(x==1)
    {
        for(iter=v.begin()+index+1; iter!=v.end(); iter++)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
        for(iter=v.begin()+index-1; iter!=v.begin()-1; iter--)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
    }
    else if(x==0)
    {
        for(iter=v.begin()+index-1; iter!=v.begin()-1; iter--)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
        for(iter=v.begin()+index+1; iter!=v.end(); iter++)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
    }
    cout<<"\n横跨磁道数:";
    for(int i =0; i<len;i++){
        cout<<a[i]<<" ";
    }
    cout<<"\n平均寻道长度:"<<(sum/len)<<endl;
}
void  C_SCAN(vector<int> v, int  currentLocation)
{
    int x,j=0,sum=0;
    int a[1000]={0};
    float len = v.size();
    int index=0 ;  //记录角标位置

    sort(v.begin(),v.end());
    for(int i=0; i<len ; i++)
    {
        if(v[i]<currentLocation)index++;
        else break;
    }
    v.insert(v.begin()+index,currentLocation);
    vector<int>::iterator iter;
    cout<<"\nC_SCAN算法:\n";
    cout<<"请输入访问的初始方向:1代表递增,0代表递减:";
    cin>>x;
    cout<<"访问磁道顺序:";
    if(x==1)
    {
        for(iter=v.begin()+index+1; iter!=v.end(); iter++)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
        for(iter=v.begin(); iter!=v.begin()+index; iter++)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
    }
    else if(x==0)
    {
        for(iter=v.begin()+index-1; iter!=v.begin()-1; iter--)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
        for(iter=v.end(); iter!=v.begin()+index; iter--)
        {
            cout<<*iter<<" ";
            a[j]=abs(*iter-currentLocation);
            sum+=a[j] ; j++;
            currentLocation=*iter;
        }
    }
    cout<<"\n横跨磁道数:";
    for(int i =0; i<len;i++){
        cout<<a[i]<<" ";
    }
    cout<<"\n平均寻道长度:"<<(sum/len)<<endl;
}

vector<int >  v;
int main()
{
    float n;
    int diskNum = 0;//磁道总数
    int firstLocation;//磁头初始位置

    cout << "磁盘调度算法" << endl;
    cout<<"输入磁道总数:";
    cin>>diskNum;
    cout<<"输入磁头初始位置:";
    cin>>firstLocation;
    cout<<"输入寻找的磁道个数:";
    cin>>n;
    cout<<"输入要寻找的磁道序列:";
    int x;
    int i = 0 ;
    int m=n;
    while(m--)
    {
        cin>>x;
        v.push_back(x);
        i++;
    }
    FIFO(v,firstLocation);
    SSTF(v,firstLocation);
    SCAN(v,firstLocation);
    C_SCAN(v,firstLocation);
    return 0;
}


实验七 磁盘调度算法的模拟与实现_第1张图片

你可能感兴趣的:(算法,操作系统,c++)