• 磁盘调度管理


    磁盘调度管理

    一、设计目的:

    加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。

    二、设计内容:

    通过编程实现不同磁盘调度算法。

    设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

    常用的磁盘调度算法简介如下,请在最短寻道优先算法SSTF、扫描算法SCAN、循环扫描算法CSCAN中任意选择两种实现,并对算法性能进行分析对比。

    三、开发环境

    windows环境,VC6.0平台。

    四、分析设计

    <一>实验原理

    1. 最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
    2. 扫描算法SCAN:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。

    <二>程序结构

    输入磁道个数,选择寻道算法

    0:退出

    1:SSTF最短寻道优先算法

    2:SCAN扫描算法

    附录、源程序清单

    #include<iostream>

    #include<ctime>

    using namespace std;

    void SSTF(int a[],int n);

    void SCAN(int a[],int n);

    int main()

    {

    int n;    //磁道个数

    int s;     //功能号

    cout<<"请输入当前磁道个数,按Enter显示生成的随机磁道号:"<<endl;

    cin>>n;

    int *a=new int[n];

    cout<<"生成磁道号为";

    srand((unsigned)time(NULL));        //给srand提供一个种子,它是unsigned int类型,取值范围0-65565

        for(int i=0;i<n;i++){

    a[i]=(rand()%200)+1;          //rand根据srand种子值返回一个随机数

    cout<<a[i]<<" ";

    }

    cout<<endl;

    while(1){

    cout<<"请选择算法"<<endl;

    cout<<"0:退出  1:SSTF  2:SCAN"<<endl;

    cin>>s;

    if(s>4){

    cout<<"输入有误,请重新输入"<<endl;

    }

    else{

    switch(s){

    case 0:exit(0);

    case 1:SSTF(a,n);break;

    case 2:SCAN(a,n);break;

    }

    }

    }

    return 0;

    }

     

    //最短寻道时间算法(SSTF)

    void SSTF(int a[],int n) {  

    int temp;

    int k=1;

    int now,l,r;

    int i,j,sum=0;  //将磁道号按递增排序,冒泡排序

    for(i=0;i<n;i++)

    for(j=i+1;j<n;j++) {    

    if(a[i]>a[j])   {    

    temp=a[i];   

    a[i]=a[j];   

    a[j]=temp;   

    }

    }  

    cout<<"按递增顺序排好的磁道显示为:"<<endl;

    for( i=0;i<n;i++) {  

    cout<<a[i]<<" ";         //输出排好的磁道顺序

    }

    cout<<endl;  

    now=rand()%200;

    cout<<"当前磁道为"<<now<<endl;

    cout<<"磁盘调度顺序为:"<<endl;  

    if(a[n-1]<=now){         //当前磁头位置大于最外围欲访问磁道     

    for(i=n-1;i>=0;i--)   

    cout<<a[i]<<" ";   

    sum=now-a[0];

    }

    else    if(a[0]>=now){           //当前磁头位置小于最里欲访问磁道    

    for(i=0;i<n;i++)   

    cout<<a[i]<<" ";

    sum=a[n-1]-now;   

    }   

    else   {      

    while(a[k]<now){          //当前磁道在已排的序列中的位置

     k++;  

    }       

    l=k-1;            //在磁头位置的前一个欲访问磁道

    r=k;                 //磁头欲访问磁道       

    while((l>=0)&&(r<n))  {       

    if((now-a[l])<=(a[r]-now)){//选择离磁头近的磁道         

    cout<<a[l]<<" ";       

    sum+=now-a[l];       

    now=a[l];       

    l=l-1;  

    }     

    else     {      

    cout<<a[r]<<" ";     

    sum+=a[r]-now;     

    now=a[r];     

    r=r+1;  

    }   

    }

    if(l==-1){//磁头位置里侧的磁道已访问完      

    for(j=r;j<n;j++){//访问磁头位置外侧的磁道       

    cout<<a[j]<<" ";   

    }    

    sum+=a[n-1]-a[0];   

    }  

    if(r==n){//磁头位置外侧的磁道已访问完   

    for(j=k-1;j>-1;j--){ //访问磁头位置里侧的磁道                            

    cout<<a[j]<<" ";            

    }             

    sum+=a[n-1]-a[0];

    }   

    }    

    cout<<endl;    

    cout<<"移动的总道数为:"<<sum<<endl; 

  • 相关阅读:
    使用BIOS进行键盘输入和磁盘读写03 零基础入门学习汇编语言77(完)
    Android通过JNI调用驱动程序(完全解析实例)
    Android的七巧板Activity之二 Activity的加载模式
    JAVA Integer进制的转换
    转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据
    WindowManager实现悬浮窗口&可自由移动的悬浮窗口
    Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
    Android功能总结:仿照Launcher的Workspace实现左右滑动切换
    Android WebView缓存
    现在接受参加国际创业节 DOer Express的 申请
  • 原文地址:https://www.cnblogs.com/Anei/p/7858224.html
Copyright © 2020-2023  润新知