磁盘调度

一、实验目的、功能与要求

实验目的:

(1)掌握操作系统主要功能的实现原理;

(2)上机实验模拟实现操作系统的管理策略,加深对相关技术原理的理解;

(3)提高编程能力。

实验功能与要求:

  1. 任选一种计算机高级语言编程实现
  2. 选择2~3种磁盘调度算法(先来先服务、最短寻道时间优先、电梯算法)模拟实现磁盘调度
  3. 能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等
  4. 能够显示磁盘调度结果(磁头依次访问的磁道号顺序),并计算磁头移动的总磁道数等

二、源代码及运行结果

  disk_manager.h

#pragma once
#include<vector>
#include<string>
#include<algorithm>
#include<iostream>
#include <sstream> 
#include <numeric>
using namespace std;

// 磁头位置
int headPosition;
// 磁头移动方向
int direction;
// 磁道访问请求序列
vector<int> requestSequence;
// 磁道访问序列
vector<int> visitedSequence;

// 通用函数声明
void showMenu(string algorithmType);
void init();
void printInfo();
void FCFS();
void SSTF();
void SCAN();
void calculateSum();
void clearAll();

  disk_manager.cpp

#include"disk_manager.h"


int main() {
    int option;

        do {
            cout << "================== 主菜单 ==================\n";
            cout << "1. 初始化 \n2. 先来先服务算法 \n3. 最短寻道时间优先算法\n4. 电梯算法\n5. 退出\n";
            cout << "请输入你的选择: ";
            cin >> option;
            cout << "==============================================" << endl;
            switch (option) {
            case 1: {
                init();
                break;
            }
            case 2: {
                FCFS();
                break;
            }
            case 3: {
                SSTF();
                break;
            }
            case 4:
                SCAN();
                break;
            case 5:
                cout << "程序退出!" << endl;
                return 0;
                break;
            default:
                cout << "无效输入,请重新输入!" << endl;
                break;
            }

        } while (option != 5);

      return 0;
}

// 初始化磁头位置,磁道访问序列,磁头移动方向
void init() {
    cout << "\n=================== 初始化 ===================\n";
    cout << "请输入请求数量:";
    int count;
    cin >> count;
    cout << "请输入磁道访问请求序列:";
    int sequence;
    for (size_t i = 0; i < count; i++)
    {
        cin >> sequence;
        requestSequence.push_back(sequence);
    }
    cout << endl;
}
// 打印内存使用情况以及空闲区表
void printInfo() {
    int count = 0;
    cout << "磁头依次访问的顺序:";
    for (int sequence:visitedSequence)
    {
        count++;
        if (count <= visitedSequence.size()-1)
            cout << sequence << " -> ";
        else
            cout << sequence;
    }
    cout << endl;
}

void FCFS() {
    cout << "\n=================== 先来先服务算法 ===================\n";
    cout << "请输入磁头位置:";
    cin >> headPosition;
    visitedSequence.push_back(headPosition);
    // 把请求访问的序列拷贝到结果序列
    for (int i : requestSequence) {
        visitedSequence.push_back(i);
    }
    printInfo();
    calculateSum();
    clearAll();
}


void SSTF() {
    cout << "\n=================== 最短寻道时间优先算法 ===================\n";
    cout << "请输入磁头位置:";
    cin >> headPosition;
    visitedSequence.push_back(headPosition);
    // 按最短寻道时间将请求访问序列拷贝到结果序列
    vector<pair<int, int>> differences; 
    vector<int> temp;
    temp.assign(requestSequence.begin(), requestSequence.end());

    while (!temp.empty())
    {
        int last = visitedSequence.back();
        // 清空旧的差值
        differences.clear();
        for (int value : temp) {
            int diff = abs(value - last);
            differences.push_back(make_pair(diff, value));
        }

        // 根据差的大小排序
        sort(differences.begin(), differences.end());

        visitedSequence.push_back(differences[0].second);
        // 从requestSequence中移除这个元素
        temp.erase(find(temp.begin(), temp.end(), visitedSequence.back()));
       
    }
    printInfo();
    calculateSum();
    clearAll();
}


void SCAN() {
    cout << "\n=================== 电梯算法 ===================\n";
    cout << "请输入磁头位置:";
    cin >> headPosition;
    visitedSequence.push_back(headPosition);
    cout << "请输入磁头移动方向(0:左    else:右):";
    cin >> direction;
    // 按先方向后距离的原则将请求访问序列拷贝到结果序列
    vector<int> temp;
    temp.assign(requestSequence.begin(), requestSequence.end());
    temp.push_back(headPosition);
    sort(temp.begin(), temp.end());

    // 切分左右两部分
    vector<int> left;
    vector<int> right;
    for  (int var : temp)
    {
        // 左边的部分
        if (var < headPosition)
            left.push_back(var);
        else if(var > headPosition)
            right.push_back(var);
    }
    // 左边部分倒置
    reverse(left.begin(), left.end());
    if (direction == 0) {
        for (int var:left)
            visitedSequence.push_back(var);
        for (int var : right)
            visitedSequence.push_back(var);
    }
    else
    {
        for (int var : right)
            visitedSequence.push_back(var);
        for (int var : left)
            visitedSequence.push_back(var);
    }

    printInfo();
    calculateSum();
    clearAll();
}

// 计算总磁道数
void calculateSum() {
    int sum = 0;

    for (size_t i = 0; i < visitedSequence.size() - 1; ++i) {
        int diff = abs(visitedSequence[i + 1] - visitedSequence[i]);
        sum += diff;
    }
    cout << "磁头移动的总磁道数:" << sum << endl << endl;
}

void clearAll() {
    direction = 0;
    headPosition = 0;
    visitedSequence.clear();
}

 运行结果演示视频:

操作系统-磁盘调度

三、课内实验完整资料(包括另一次的实验及实验报告)

链接: https://pan.baidu.com/s/1lKvBKBEZjQKzgwO--V0_5A?pwd=5yup 提取码: 5yup 复制这段内容后打开百度网盘手机App,操作更方便哦 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值