zoukankan      html  css  js  c++  java
  • 磁盘调度管理

    磁盘调度管理

    一、设计目的:

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

    二、设计内容:

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

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

    常用的磁盘调度算法简介如下,请在最短寻道优先算法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; 

  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/Anei/p/7858224.html
Copyright © 2011-2022 走看看