磁盘管理实验

1、采用模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法三种磁盘调度算法,对一组请求访问磁道序列输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
2、文本录入数据

//C++语言,Linux下运行
//在相同目录下创建page1.txt文档,输入数据保存
本人文档保存的数据

代码如下:

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <list>
#include <fstream>
#define MAX 1111
#define INF 0x3f3f3f3f

using namespace std;
typedef struct Disk_Scheduling
{     
        double Trackhao;
        double Trackshu;        
}DKSG;

DKSG ds[MAX];
double track[MAX];
int mark[MAX];
int input(int &n, double &now)
{
        int im;
        int Min = INF;
        fstream infile1("page1.txt");
        if (!infile1)
                cerr<< "文档打开失败"<<endl;
        else {
                int data;
                infile1>>data;
                now =data;
                infile1>>data;
                n =data;
                for (int i =0;i<n; i++){
                        infile1>>data;
                        track[i]=data;
                        double temp=fabs(track[i] - now);
                        if(temp<Min){
                                Min=temp;
                                im=i;
                        }
                }
        }

        return im;
}
void output(int n)//打印
{
        double zong=0;
        printf("%s","访问路径:");
        for (int i=0; i<n; i++){
                printf("%4.2f %s", ds[i].Trackhao,"-> ");
        }
        printf("\n总横跨磁道数:");
        for (int i=0; i<n; i++){
                zong=zong+ds[i].Trackshu;
        }
        printf("%4.2f\n",zong);
}

void FCFS()//先来先服务
{
        int n;
        double now;
        input(n, now);
        for (int i = 0;i<n; i++) {
                ds[i].Trackhao = track[i];
                ds[i].Trackshu = fabs(track[i] - now);
                now = track[i];
        }
        printf("\n先来先服务法:\n");
        output(n);
}
void SSTF()//最短寻道时间优先
{
        memset(mark, 0, sizeof(mark));
        int n;
        double now;
        int im = input(n, now);
        int cnt1, cnt2;
        double t1, t2;
        for (int i = 0;i<n; i++) {
                int Min = INF;
                ds[i].Trackhao = track[im];
                ds[i].Trackshu = fabs(track[im] - now);
                now = track[im];
                mark[im] = 1;
                for (int j = 0; j<n; j++) {
                        if (!mark[j]) {
                                double temp = fabs(track[j] - now);
                                if (temp < Min) {
                                        Min = temp;
                                        im = j;
                                }
                        }
                }
        }
        printf("\n最短寻道时间优先法:\n");
        output(n);
}

void SCAN()//电梯法
{
        double retrack[MAX];
        int n;
        double now;
        input(n, now);
        sort(track, track + n);
        int locate = upper_bound(track, track + n, now) - track;
        int t = locate;
        int k, r;
        for (k = 0;k<n - locate; k++) {
                retrack[k] = track[k + locate];
        }
        for (r = k; r<n;r++) {
                retrack[r] = track[--t];
        }
        for (int i = 0;i<n; i++) {
                ds[i].Trackhao = retrack[i];
                ds[i].Trackshu = fabs(retrack[i] - now);
                now = retrack[i];
        }
        printf("\n电梯法:\n");
        output(n);
}
int main()
{
        int ca = 0;
        do {
                printf("\n请选择磁盘调度算法:\n");
                printf("1、先来先服务\n2、最短寻道时间优先\n3、电梯法\n0、退出程序\n");
                scanf("%d", &ca);
                if (ca == 1)FCFS();//先来先服务法
                if (ca == 2)SSTF();//最短寻道时间优先法
                if (ca == 3)SCAN();//电梯调度算法
                printf("\n");
        } while (ca);
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
//部分代码学习于:https://blog.csdn.net/qq_35685675/article/details/80744467

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值