操作系统实验报告

实验4 磁盘调度



一、实验内容

模拟电梯调度算法,实现对磁盘的调度。


二、实验目的

磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫磁盘调度,使用的算法称磁盘调度算法。磁盘调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个磁盘调度程序,观察磁盘调度程序的动态运行过程。


三、实验原理

磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫磁盘调度,使用的算法称磁盘调度算法。磁盘调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个磁盘调度程序,观察磁盘调度程序的动态运行过程。


四、算法流程图

流程图


五、源程序及注释

#include <bits/stdc++.h>
using namespace std;
#define MaxNumber 200

int StartTrack;//开始磁道
int TrackOrder[MaxNumber];//初始磁道序列
int VisitOrder[MaxNumber];//访问磁道序列
bool Visited[MaxNumber];//标记是否被访问过
int MoveDistance[MaxNumber];//磁头移动磁道数
int Sum_Distance;//磁头移动的总距离
double AverageDistance;//磁头平均移动距离
bool direction;//选择磁头向内或向外方向

//计算与当前所在磁道距离的绝对值
int Absolute(int a, int b){
    if (a - b > 0)
        return (a - b);
    else
        return (b - a);
}

void initial(){//全部数据初始化 
	   
    for (int i = 0; i < 15; i++){
        MoveDistance[i] = 0;
        VisitOrder[i] = TrackOrder[i];
        Visited[i] = false;
    }
    Sum_Distance = 0;
    AverageDistance = 0;
}

void display(){//打印 

    cout << "Start: " << StartTrack << endl;
    cout << "Next\tDistance\t" << endl;
    for(int i = 0; i < 15; i++)
        cout << VisitOrder[i] << "\t" << MoveDistance[i] << "\t" << endl;  
    cout << "AverageDistance: " << setprecision(4) << AverageDistance << endl;
}


//开始磁道沿选择方向扫描,直到没有要访问的磁道后沿反方向扫描
void SCAN(){
    cout << endl << "SCAN" << endl;
    cout << "Choose direction,0-add,1-reduce: " << endl;
    cin >> direction;
    initial();

    int SortTrackOrder[MaxNumber];
    for (int i = 0; i < 15; i++)
        SortTrackOrder[i] = TrackOrder[i];
        
    sort(SortTrackOrder, SortTrackOrder + 15);

    //找到距离最近的磁道号
    int point = 0;
    while(StartTrack >= SortTrackOrder[point++])	;

    int count = 0;
    int currentTrack = StartTrack;

    if (direction == 0){  //向磁道增加的方向访问
        cout << "add" << endl;
        for (int i = point; i < 15; i++){
            VisitOrder[count] = SortTrackOrder[i];
            MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
            currentTrack = VisitOrder[count];
            count++;
        }

        for (int i = point - 1; i >= 0; i--){
            VisitOrder[count] = SortTrackOrder[i];
            MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
            currentTrack = VisitOrder[count];
            count++;
        }
    }
    else if (direction == 1){  //向磁道减少的方向访问
        cout << "reduce" << endl;
        for (int i = point - 1; i >= 0; i--){
            VisitOrder[count] = SortTrackOrder[i];
            MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
            currentTrack = VisitOrder[count];
            count++;
        }

        for (int i = point; i < 15; i++){
            VisitOrder[count] = SortTrackOrder[i];
            MoveDistance[count] = Absolute(VisitOrder[count],currentTrack);
            currentTrack = VisitOrder[count];
            count++;
        }
    }
	//求和计算平均寻址距离
    for (int i = 0; i < 15; i++)
        Sum_Distance += MoveDistance[i];
    AverageDistance = (Sum_Distance * 1.0) / 15;
    display();
}

int main(){
	srand((unsigned int)time(0));//用伪随机数初始化磁道序列 
 	for(int i = 0; i < 15; i++){
		TrackOrder[i] = rand() % 200 + 1;
    	cout<< TrackOrder[i] << " ";
	}
	cout << endl;
    cout << "Enter StartTrack: ";
    cin >> StartTrack;  //输入开始磁道号
    cout << endl;
    SCAN();
    return 0;
}


六、打印的程序运行时初值和运行结果

运行结果


七、实验小结

通过本次实验初步实现了电梯调度算法对磁盘调度的模拟。使我加深了对电梯调度算法的理解,加强了用代码模拟实现的能力。同时在写程序前先做好流程图,写出大概步骤与将操作模块化都对代码的实现与完成起了很大帮助,体会到提前做准备的帮助和好处。此次实验代码量小于前几次实验,实现难度较之前小一些,所以花费的时间主要在debug和完善上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值