磁盘调度算法 C++实现

116 篇文章 2 订阅
4 篇文章 0 订阅

常见的磁盘调度算法大致分为以下5类:

FCFS、SSTF、SCAN、CSCAN、FSCAN

程序实现了上述5类调度算法。

其中,当前磁道和要求服务的磁道均由系统随机产生。

程序入口是main主函数,在程序一开始由request()函数产生随机的要求服务的磁盘序列。然后由用户选择算法FCFS、SSTF、SCAN、CSCAN、FSCAN其中之一。

分别执行相应的算法。

1)FCFS算法实现思路:将vector内随机产生的数依次读出,相当于对于队列数据结构中的出队操作。

2)SSTF算法实现思路:在时间复杂度和空间复杂度上的综合考虑,我首先将vector内的数据进行排序,然后确定当前磁道号在有序数据中的位置,然后在该位置的左右找到离它最近的数,并将当前位置进行刷新。

3)SCAN算法实现思路:首先将vector内的数据进行排序,然后同样地确定当前磁道号在有序数据中的位置,然后在向内的方向上依次访问,访问完了之后,再输出初始位置向外的服务序列。

4)CSCAN算法实现思路:开始和前面的算法一样,也是先进行排序,定位,然后在向内的方向上依次访问,访问完了之后,再从最外层向内扫。

5)FSCAN算法实现思路:将初始的序列放在一个队列中,将在扫描过程中新出现的服务序列放在另一个序列中,然后对两个队列中的数据依次进行SCAN算法的实现。

程序流程图:


实验结果:



源程序:

#include <iostream>
#include <time.h>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <cstring>
#include <windows.h>
#include <fstream>
using namespace std;

int position = 0;      //当前磁道位置
int dis = 0;
double average_distance = 0;

void request(vector<int>&m_vec,ofstream &outfile){
    cout<<"随机生成磁盘序列:"<<endl;
    int n = 0;
    srand(time(NULL));     //添加随机数种子
    n = rand() % 20 + 1;
    int temp = 0;
    for(int i=0;i<n;i++){
        temp = rand() % 100;
        m_vec.push_back(temp);
        cout<<temp<<" ";
        outfile<<temp<<endl;
    }
    cout<<endl;
    position = rand() % 100;
    cout<<"当前磁道:"<<position<<endl;
}

void compute_dis(vector<int>m_vec,int &dis,double &average_distance){
    average_distance = (double)dis / (double)m_vec.size();
}

void FIFO(vector<int>m_vec,int position){     //先来先服务算法
    dis = 0;
    average_distance = 0;
    for(vector<int>::iterator it=m_vec.begin();it!=m_vec.end();it++){
        dis += abs(position-*it);
        Sleep(500);
        cout<<"->"<<*it;
        position = *it;
    }
    compute_dis(m_vec,dis,average_distance);
}

void SSTF(vector<int>m_vec,int position){   //最短寻道时间算法
    dis = 0;
    average_distance = 0;
    sort(m_vec.begin(),m_vec.end());    //从小到大排序
    int i = 0;
    for(vector<int>::iterator it=m_vec.begin();it!=m_vec.end();it++){
        if(position >= *it)
            i++;
    }
    int count = 0;
    int left = i-1;
    int right = i;
    while(count<m_vec.size()){
        if((left >=0 && abs(m_vec[right]-position) > abs(m_vec[left]-position)) || right>=m_vec.size()){
            dis += abs(m_vec[left]-position);
            Sleep(500);
            cout<<"->"<<m_vec[left];
            position = m_vec[left];
            left--;
        }
        else{
            dis += abs(m_vec[right]-position);
            Sleep(500);
            cout<<"->"<<m_vec[right];
            position = m_vec[right];
            right++;
        }
        count++;
    }
    compute_dis(m_vec,dis,average_distance);
}

void SCAN(vector<int>m_vec,int position){   //电梯调度算法
    dis = 0;
    average_distance = 0;
    sort(m_vec.begin(),m_vec.end());    //从小到大排序
    int i = 0;
    for(vector<int>::iterator it=m_vec.begin();it!=m_vec.end();it++){
        if(position >= *it)
            i++;      //找到position所在的磁道
    }
    int left = i - 1;   //先从外到内扫描
    int right = i;
    while(left >= 0){
        dis += abs(position - m_vec[left]);
        Sleep(500);
        cout<<"->"<<m_vec[left];
        position = m_vec[left];
        left --;
    }
    while(right < m_vec.size()){
        dis += abs(position - m_vec[right]);
        Sleep(500);
        cout<<"->"<<m_vec[right];
        position = m_vec[right];
        right ++;
    }
    compute_dis(m_vec,dis,average_distance);
}

void CSCAN(vector<int>m_vec,int position){   //循环扫描算法
    dis = 0;
    average_distance = 0;
    sort(m_vec.begin(),m_vec.end());    //从小到大排序
    int i = 0;
    for(vector<int>::iterator it=m_vec.begin();it!=m_vec.end();it++){
        if(position >= *it)
            i++;      //找到position所在的磁道
    }
    int left = i - 1;   //先从外到内扫描
    int right = i;
    while(left >= 0){
        dis += abs(position - m_vec[left]);
        Sleep(500);
        cout<<"->"<<m_vec[left];
        position = m_vec[left];
        left --;
    }
    position = 100;     //立即到最外侧的磁道
    int len = m_vec.size()-1;
    while(len >= right){
        dis += abs(position - m_vec[len]);
        Sleep(500);
        cout<<"->"<<m_vec[len];
        position = m_vec[len];
        len --;
    }
    compute_dis(m_vec,dis,average_distance);
}

void FSCAN(vector<int>m_vec,int position){   //分步电梯调度算法,。分两个队列
    dis = 0;
    average_distance = 0;
    //SCAN(m_vec,position);
    sort(m_vec.begin(),m_vec.end());    //从小到大排序
    int i = 0;
    for(vector<int>::iterator it=m_vec.begin();it!=m_vec.end();it++){
        if(position >= *it)
            i++;      //找到position所在的磁道
    }
    int left = i - 1;   //先从外到内扫描
    int right = i;
    while(left >= 0){
        dis += abs(position - m_vec[left]);
        Sleep(500);
        cout<<"->"<<m_vec[left];
        position = m_vec[left];
        left --;
    }
    while(right < m_vec.size()){
        dis += abs(position - m_vec[right]);
        Sleep(500);
        cout<<"->"<<m_vec[right];
        position = m_vec[right];
        right ++;
    }
    cout<<endl;
    cout<<"在扫描的过程中新产生的服务序列:"<<endl;
    vector<int>ve;
    while(!ve.empty())
        ve.pop_back();
    int n = 0;
    n = rand() % 20 + 1;
    int temp = 0;
    for(i=0;i<n;i++){
        temp = rand() % 100;
        cout<<temp<<" ";
        ve.push_back(temp);
    }
    cout<<endl;
    cout<<position;
    SCAN(ve,position);
    average_distance = (double)dis / (double)(m_vec.size()+ve.size());
}

void print(){
    cout<<endl<<endl;
    cout<<"经计算,磁头移动的总距离为:"<<dis<<endl;
    cout<<"磁头平均移动距离:"<<average_distance<<endl;
    cout<<endl<<endl;
}

int choose_algorithm(vector<int>m_vec){
    cout<<endl<<endl;
    cout<<"本实验可用的调度算法有以下5种:"<<endl;
    cout<<"1.FIFO  2.SSTF  3.SCAN  4.CSCAN  5.FSCAN  6.结束本序列的调度  7.结束程序"<<endl;
    int choice = 0;
    cout<<"选择:"<<endl;
    cin>>choice;
    cout<<endl;
    while(choice!=6 && choice!=7){
        cout<<"磁盘请求的服务状况:"<<endl;
        cout<<position;
        switch(choice){
            case 1:
                FIFO(m_vec,position);break;
            case 2:
                SSTF(m_vec,position);break;
            case 3:
                SCAN(m_vec,position);break;
            case 4:
                CSCAN(m_vec,position);break;
            case 5:
                FSCAN(m_vec,position);break;
            default:
                cout<<"******非法输入!******"<<endl<<endl;break; 
        } 
        if(choice<=7 && choice>=1) 
            print();
        cout<<"选择:"<<endl;
        cin>>choice;
    }
    if(choice == 7)
        return 0;
    else
        cout<<endl<<endl;
    return 1;
}

int main(){
    cout<<"---------------磁盘调度算法模拟实验-----------------"<<endl;
    ofstream outfile;
    outfile.open("data.txt");
    while(1){
        vector<int> vec;
        while(!vec.empty())
            vec.pop_back();
        request(vec,outfile);         //请求服务序列 
        int flag = choose_algorithm(vec);
        if(flag == 0)
            break;
    } 
    outfile.close();
    return 0;
}



  • 27
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值