用C++模拟磁盘调度算法

1、首先假设磁盘磁道数为1500,磁头初始位置可任意设置。 2、用随机数生成函数产生“磁道号”序列(即磁盘请求的位置),共产生400个。其中50%位 于0~499,25%分布在500~999,25%分布在1000~1499。具体的产生方法可参考“题目一 页面 置换算法的模拟实现及命中率对比”。 3、计算及比较每种磁盘调度算法下的磁头移动道数。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

// 磁盘调度算法枚举
enum DiskSchedulingAlgorithm {
    FCFS,
    SSTF,
    SCAN,
    CSCAN
};

// 定义磁盘请求结构体
struct DiskRequest {
    int trackNumber; // 磁道号
    bool visited;    // 是否被访问过

    DiskRequest(int track) : trackNumber(track), visited(false) {}
};

// 计算磁道间的距离
int distance(int track1, int track2) {
    return abs(track1 - track2);
}

// 先来先服务 (FCFS) 算法
int FCFSf(const vector<DiskRequest>& requests, int initialPosition) {
    int totalMovement = 0;
    int currentTrack = initialPosition;
    if(requests[0].trackNumber!=currentTrack){
        cout << currentTrack << "->";
    }

    for (const auto& request : requests) {
        cout << request.trackNumber << "->";
        totalMovement += distance(currentTrack, request.trackNumber);
        currentTrack = request.trackNumber;
    }
    cout << "end" << endl;
    cout << endl;
    cout << endl;
    cout << endl;
    return totalMovement;
}

// 最短寻道时间优先 (SSTF) 算法
int SSTFf(vector<DiskRequest> requests, int initialPosition) {
    int totalMovement = 0;
    int currentTrack = initialPosition;
    int sum=0;
    vector<DiskRequest> sortedRequests;
    while(sum<400){
        int min=1500;
        int ps=0;
        for(int i=0 ; i<400 ;++i){
            if(min>abs(requests[i].trackNumber-initialPosition)&&requests[i].visited==0){
                min=abs(requests[i].trackNumber-initialPosition);
                ps=i;
            }
        }
        ++sum;
        requests[ps].visited=1;
        initialPosition = requests[ps].trackNumber;
        sortedRequests.push_back(requests[ps]);
    }
    if(sortedRequests[0].trackNumber!=currentTrack){
        cout << currentTrack << "->";
    }
    for (const auto& request : sortedRequests) {
        cout << request.trackNumber << "->";
        totalMovement += distance(currentTrack, request.trackNumber);
        currentTrack = request.trackNumber;
    }
    cout << "end" << endl;
    cout << endl;
    cout << endl;
    cout << endl;
    return totalMovement;
}

// 扫描 (SCAN) 算法
int SCANf(const vector<DiskRequest>& requests, int initialPosition, int maxTrack) {
    int totalMovement = 0;
    int currentTrack = initialPosition;
    int ps=0;

    vector<DiskRequest> requestsCopy = requests;
    sort(requestsCopy.begin(), requestsCopy.end(), [](const DiskRequest& a, const DiskRequest& b) {
        return a.trackNumber < b.trackNumber;
    });

    for(int i=0; i<400 ;++i){
        if(requestsCopy[i].trackNumber>=initialPosition){
            ps=i;
            break;
        }
    }

    if(requestsCopy[0].trackNumber!=currentTrack){
        cout << currentTrack << "->";
    }
    for (int i=ps ; i<400 ;++i) {
        totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
        cout << requestsCopy[i].trackNumber << "->";
        currentTrack = requestsCopy[i].trackNumber;
    }
    for (int i=ps-1 ; i>0 ;--i) {
        totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
        cout << requestsCopy[i].trackNumber << "->";
        currentTrack = requestsCopy[i].trackNumber;
    }
    cout << "end" << endl;
    cout << endl;
    cout << endl;
    cout << endl;
    return totalMovement;
}

// 循环扫描 (C-SCAN) 算法
int CSCANf(const vector<DiskRequest>& requests, int initialPosition, int maxTrack) {
    int totalMovement = 0;
    int currentTrack = initialPosition;
    int ps=0;

    vector<DiskRequest> requestsCopy = requests;
    sort(requestsCopy.begin(), requestsCopy.end(), [](const DiskRequest& a, const DiskRequest& b) {
        return a.trackNumber < b.trackNumber;
    });

    for(int i=0; i<400 ;++i){
        if(requestsCopy[i].trackNumber>=initialPosition){
            ps=i;
            break;
        }
    }

    if(requestsCopy[0].trackNumber!=currentTrack){
        cout << currentTrack << "->";
    }
    for (int i=ps ; i<400 ;++i) {
        totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
        cout << requestsCopy[i].trackNumber << "->";
        currentTrack = requestsCopy[i].trackNumber;
    }

    totalMovement += distance(currentTrack, 0);
    cout << currentTrack << "->0->";
    currentTrack = 0;
    for (int i=0 ; i<ps ;++i) {
        totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
        cout << requestsCopy[i].trackNumber << "->";
        currentTrack = requestsCopy[i].trackNumber;
    }
    cout << "end" << endl;
    cout << endl;
    cout << endl;
    cout << endl;
    return totalMovement;
}

// 执行磁盘调度算法并返回总移动距离
int executeDiskSchedulingAlgorithm(const vector<DiskRequest>& requests, int initialPosition, DiskSchedulingAlgorithm algorithm, int maxTrack) {
    switch (algorithm) {
        case FCFS:
            return FCFSf(requests, initialPosition);
        case SSTF:
            return SSTFf(requests, initialPosition);
        case SCAN:
            return SCANf(requests, initialPosition, maxTrack);
        case CSCAN:
            return CSCANf(requests, initialPosition, maxTrack);
        default:
            cerr << "Unknown disk scheduling algorithm!" << endl;
            return -1;
    }
}

//随机生成磁道请求
void getrandomDiskrequest(vector<DiskRequest> &requests){
    srand(time(nullptr));//设置随机数种子为当前时间
    int num = 400;
    cout << " 随机生成400个磁道请求,其中50%位于0~499,25%分布在500~999,25%分布在1000~1499。 磁道请求序列为:" << endl;

    for( int i = 0; i < num/2; ++i){
        int diskrequest = rand()%500;
        cout << diskrequest << " ";
        requests.push_back(diskrequest);
    }
    for(int i= 0; i < num/4; ++i){
        int diskrequest = rand()%500+500;
        cout << diskrequest << " ";
        requests.push_back(diskrequest);
    }
    for(int i= 0; i < num/4; ++i){
        int diskrequest = rand()%1000+500;
        cout << diskrequest << " ";
        requests.push_back(diskrequest);
    }
    cout << endl;
    cout << endl;
}

int main() {
    vector<DiskRequest> requests;
    getrandomDiskrequest(requests);

    int initialPosition = 500;
    int maxTrack = 1500;
    cout << "FCFS:" << endl;
    int fcfs=executeDiskSchedulingAlgorithm(requests, initialPosition, FCFS, maxTrack);
    cout << "SSTF:" << endl;
    int sstf=executeDiskSchedulingAlgorithm(requests, initialPosition, SSTF, maxTrack);
    cout << "SCAN:" << endl;
    int scan=executeDiskSchedulingAlgorithm(requests, initialPosition, SCAN, maxTrack);
    cout << "CSCAN:" << endl;
    int cscan=executeDiskSchedulingAlgorithm(requests, initialPosition, CSCAN, maxTrack);

    cout << "FCFS 算法磁头移动道数: " << fcfs << "   平均磁头移动道数: " << (double)fcfs/400 <<endl;
    cout << "SSTF 算法磁头移动道数: " << sstf << "   平均磁头移动道数: " << (double)sstf/400 <<endl;
    cout << "SCAN 算法磁头移动道数: " << scan << "   平均磁头移动道数: " << (double)scan/400 <<endl;
    cout << "C-SCAN 算法磁头移动道数: " << cscan << "    平均磁头移动道数: " << (double)cscan/400 <<endl;

    system("pause");

    return 0;
}

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,磁盘扫描算法已经在上一个回答里介绍过了,这里我来介绍一下另外一个常见的磁盘调度算法——SSTF(Shortest Seek Time First)算法,并给出相应的 C++ 代码。 SSTF 算法的主要思想是每次选择距离当前磁头最近的请求进行服务。具体实现过程如下: 1. 从当前磁头位置开始,找到距离磁头最近的未处理请求; 2. 将该请求加入到处理序列中,并更新磁头的位置为该请求的位置; 3. 重复执行步骤 1 和步骤 2,直到所有请求都被处理。 根据 SSTF 算法的实现思想,我们可以写出以下 C++ 代码: ```c++ #include <iostream> #include <algorithm> #include <cmath> using namespace std; int main() { int n, m; int pos = 0, total = 0; cout << "请输入磁盘请求的数量和磁头的初始位置:"; cin >> n >> pos; int req[n]; cout << "请输入磁盘请求的磁道号:"; for (int i = 0; i < n; i++) { cin >> req[i]; } sort(req, req + n); cout << "请输入磁盘的最大磁道号:"; cin >> m; while (true) { int min_dist = m + 1, min_idx = -1; for (int i = 0; i < n; i++) { if (req[i] != -1 && abs(req[i] - pos) < min_dist) { min_dist = abs(req[i] - pos); min_idx = i; } } if (min_idx == -1) { break; } total += min_dist; pos = req[min_idx]; req[min_idx] = -1; } cout << "平均寻道时间为:" << (double) total / n << endl; return 0; } ``` 在这段代码中,我们首先输入了磁盘请求的数量和磁头的初始位置,然后输入每个请求的磁道号,再输入磁盘的最大磁道号。接着,我们将请求按照磁道号从小到大排序,然后按照 SSTF 算法的思想依次选择距离当前磁头最近的请求,并计算总的寻道时间。最后,输出平均寻道时间。 希望这个代码能够帮到你,如果有任何问题,可以继续问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mika的瑞士卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值