算法世界

02327 / 02326 操作系统实践考试总结(模拟磁盘调度算

2023-10-28  本文已影响0人  Promise_Sun

文 | Promise Sun


一、实践考试总结:

1.考试方式:线上考试(离线)

2.考试时间:2h

3.考试感想:(仅供参考)

1)考试方式很方便,将答案按要求复制到word中,然后转成PDF格式提交到考试系统即可。
2)需要注意的就是考试时间,必须在官方指定时间内登录、提交答案。一定要注意考试时间,建议自己设个闹钟,千万别错过提交答案时间。
3)题目很简单,一般都是教材上的典型案例。建议大家在考试之前将教材上的代码都敲一遍,保证运行结果正常。如果考试时现做,可能会出现很多问题、手忙脚乱。如果你提前做到了,那么考试时间是足够用的,你也会逢考必过。
4)考试简单,有裸考也能过的,但是选择裸考前,你问问自己“你的考试运气要高到啥程度裸考就能过?”。考试费不低,你觉得无所有这点考试费,那选择裸考也只是你的选择。只能祝福你了。本人还是觉得“一切都是留给有准备的人的!”
5)在考试之前,本人没有在网上找到其他人分享过操作系统实践课的经验和题目,忐忑了很久,焦虑了很久,所以本人决定分享给有需要的你,别像我那般考前焦虑不安,一无所知。
甚至因此,考试之前本人还通宵敲了一晚上代码,做了几个案例题,汗颜啊<>!但还是很有效果的。本人当晚做的练习题中就有考试这类的题。但不建议你也通宵,会影响考试状态的。平时多花点时间做练习题就行了。
6)最后,以上是本人的考试经验总结,仅供参考。祝君逢考必过!加油!

二、2023年10月操作系统(02327 / 02326)实践考试题

上机题(本大题共1小题,每小题100分,共100分)

1.题目:

编写程序模拟磁盘调度的“最短寻道时间优先”算法。

2.作答要求:

1)开发工具可以选用Eclipse或者Visua Studio,或者其他工具。
2)使用C语言实现。程序结构清晰、编码规范、易于阅读。
3)运行结果,截图保存到文档中。
4)将源程序拷贝到运行结果后。

3.答案:(仅供参考)

1)开发工具:Visual Studio Community 2022
2)开发环境:Windows 11
3)说明:
虽然考试只考了一种算法,但做练习的时候,其他算法我也写了,所以也分享出来吧。
4)运行结果:
输入示例:(注:你可以自己设置其他数据试试)
请选择磁盘调度算法: 2
请输入调度磁道数量: 12
请输入磁道调度序列: 35 26 88 90 21 56 33 66 22 88 10 56
请输入当前磁道号: 100

运行结果2.png

以下是其他算法运行结果图:

运行结果1.png 运行结果3-1.png 运行结果3-2.png 运行结果4-1.png 运行结果4-2.png

5)以上4种算法代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define max 300
int num; //磁盘数
int request[100];   //请求磁盘序列
int begin;  //开始磁盘位置
int sum;    //横跨的总数
int k;      //每次横跨的磁盘数
int re[100];    //复制初始序列
int r[100];     //记录每个算法执行后序列
int n, m;
void input();
void FIFO() {   //先进先出
    sum = abs(begin - request[0]);
    printf("\n先进先出算法:\n    FIFO调度:      %3d", begin);
    for (int i = 0; i < num; i++)
        printf(" %3d", request[i]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - request[0]));
    for (int i = 1; i < num; i++) {
        k = abs(request[i - 1] - request[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:    %3d", sum);
    printf("\n    平均寻道长度:      %.2f\n", 1.0 * sum / num);
}

int Smin(int b, int re[]) { //返回离开始磁盘b最近的磁盘下标
    int min = abs(b - re[0]);//初始化横跨磁道数
    int j = 0;
    for (int i = 1; i < num; i++)
        if (abs(b - re[i]) < min) {
            min = abs(b - re[i]);
            j = i;
        }
    return j;
}

void SSTF() {   //最短寻道算法
    int c = 0, b = begin;
    printf("\n最短服务时间优先算法:\n    SSTF调度:      %3d", begin);
    for (int i = 0; i < num; i++) {
        c = Smin(b, re); //返回最近的磁道下标
        b = re[c]; //将最近的磁盘作为开始
        re[c] = 9999999; //将已经访问过的磁盘 设为很大值
        printf(" %3d", b);
        r[i] = b;
    }
    sum = abs(begin - r[0]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - r[0]));//依次输出横跨的磁道数
    for (int i = 1; i < num; i++) {
        k = abs(r[i - 1] - r[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:    %3d", sum);
    printf("\n    平均寻道时间:      %.2f\n", 1.0 * sum / num);

}


void SCAN1() {   //扫描算法
    int c = 0, b = begin;
    for (int i = 0; i < num; i++) //SSTF时re[]已改变
        re[i] = request[i];
    printf("\n扫描算法:\n    SCAN调度:      %3d", begin);
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - i - 1; j++) {
            if (re[j] > re[j + 1]) {
                re[j] = re[j] + re[j + 1];
                re[j + 1] = re[j] - re[j + 1];
                re[j] = re[j] - re[j + 1];
            }
        }
    }
    for (int i = 0; i < num; i++)
        if (re[i] > b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    for (int i = num - 1; i >= 0; i--)
        if (re[i] < b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    sum = abs(begin - r[0]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - r[0]));
    for (int i = 1; i < num; i++) {
        k = abs(r[i - 1] - r[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:    %3d", sum);
    printf("\n    平均寻道时间:      %.2f\n", 1.0 * sum / num);
}


void SCAN2() {   //扫描算法
    int c = 0, b = begin;
    for (int i = 0; i < num; i++) //SSTF时re[]已改变
        re[i] = request[i];
    printf("\n扫描算法:\n    SCAN调度:      %3d", begin);
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - i - 1; j++) {
            if (re[j] < re[j + 1]) {
                re[j] = re[j] + re[j + 1];
                re[j + 1] = re[j] - re[j + 1];
                re[j] = re[j] - re[j + 1];
            }
        }
    }
    for (int i = 0; i < num; i++)
        if (re[i] < b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    for (int i = num - 1; i >= 0; i--)
        if (re[i] > b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    sum = abs(begin - r[0]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - r[0]));
    for (int i = 1; i < num; i++) {
        k = abs(r[i - 1] - r[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:    %3d", sum);
    printf("\n    平均寻道时间:      %.2f\n", 1.0 * sum / num);
}


void C_SCAN1() { //循环扫描
    int c = 0, b = begin;
    printf("\n循环扫描算法:\n    CSCAN调度:     %3d", begin);
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - i - 1; j++) {
            if (re[j] > re[j + 1]) {
                re[j] = re[j] + re[j + 1];
                re[j + 1] = re[j] - re[j + 1];
                re[j] = re[j] - re[j + 1];
            }
        }
    }
    for (int i = 0; i < num; i++)
        if (re[i] > b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    for (int i = 0; i < num; i++)
        if (re[i] < b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    sum = abs(begin - r[0]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - r[0]));
    for (int i = 1; i < num; i++) {
        k = abs(r[i - 1] - r[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:   %3d", sum);
    printf("\n    平均寻道时间:     %.2f\n", 1.0 * sum / num);
}


void C_SCAN2() { //循环扫描
    int c = 0, b = begin;
    printf("\n循环扫描算法:\n    CSCAN调度:    %3d", begin);
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - i - 1; j++) {
            if (re[j] < re[j + 1]) {
                re[j] = re[j] + re[j + 1];
                re[j + 1] = re[j] - re[j + 1];
                re[j] = re[j] - re[j + 1];
            }
        }
    }
    for (int i = 0; i < num; i++)
        if (re[i] < b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    for (int i = 0; i < num; i++)
        if (re[i] > b) {
            printf(" %3d", re[i]);
            r[c++] = re[i];
        }
    sum = abs(begin - r[0]);
    printf("\n    横跨磁道数为:      %3d", abs(begin - r[0]));
    for (int i = 1; i < num; i++) {
        k = abs(r[i - 1] - r[i]);
        printf(" %3d", k);
        sum += k;
    }
    printf("\n    横跨的总磁道数:   %3d", sum);
    printf("\n    平均寻道时间:    %.2f\n", 1.0 * sum / num);
}


void versionInfo()
{
    printf("\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ \n");
    printf("\t┃       模拟磁盘调度算法          ┃ \n");
    printf("\t┠──────────────────────────────────────────────┨ \n");
    printf("\t┃    (c)All Right Reserved Promise Sun    ┃ \n");
    printf("\t┃   https://blog.csdn.net/sun_promise     ┃ \n");
    printf("\t┠──────────────────────────────────────────────┨ \n");
    printf("\t┃    1、先来先服务(FCFS)算法            ┃ \n");
    printf("\t┃    2、最短寻道时间优先(SSTF)算法      ┃ \n");
    printf("\t┃    3、扫描(SCAN)算法                  ┃ \n");
    printf("\t┃    4、循环扫描(C_SCAN)算法            ┃ \n");
    printf("\t┃    0、退出                              ┃ \n");
    printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ \n");
}

void choose_algorithm() {
    versionInfo();

    printf("请选择磁盘调度算法:   ");
    scanf("%d", &n);
    if (n == 1) {
        input();
        FIFO();
        system("pause");
        system("cls");
        choose_algorithm();
    }
    else if (n == 2) {
        input();
        SSTF();
        system("pause");
        system("cls");
        choose_algorithm();
    }
    else if (n == 3) {
        input();
        printf("1、由小到大 \n2、由大到小\n请选择磁头移动的方向:");
        scanf("%d", &m);
        if (m == 1) {
            SCAN1();
            system("pause");
            system("cls");
            choose_algorithm();
        }
        else if (m == 2) {
            SCAN2();
            system("pause");
            system("cls");
            choose_algorithm();
        }
        else {
            printf("输入操作编号错误,请输入有效操作编号!");
            system("pause");
            system("cls");
            choose_algorithm();
        }
    }
    else if (n == 4) {
        input();
        printf("1、由小到大 \n2、由大到小\n请选择磁头移动的方向:");
        scanf("%d", &m);
        if (m == 1) {
            C_SCAN1();
            system("pause");
            system("cls");
            choose_algorithm();
        }
        else if (m == 2) {
            C_SCAN2();
            system("pause");
            system("cls");
            choose_algorithm();
        }
        else {
            printf("输入操作编号错误,请输入有效操作编号!");
            system("pause");
            system("cls");
            choose_algorithm();
        }
    }
    else if (n == 0) {
        exit(0);
    }
    else {
        printf("输入操作编号错误,请输入有效操作编号!");
        system("pause");
        system("cls");
        choose_algorithm();
    }
}
void input() {
    printf("请输入调度磁道数量:    ");
    scanf("%d", &num);
    printf("请输入磁道调度序列:    ");
    for (int i = 0; i < num; i++) {
        scanf("%d", &request[i]);
        re[i] = request[i];
    }
    printf("请输入当前磁道号:     ");
    scanf("%d", &begin);
    return;
}

int main() {
    choose_algorithm();
    return 0;
}

下载本文代码请点击此处:
02327 操作系统-2023年10月线上考试实践题(含答案)02326


版权声明:本文为博主原创文章,转载请点赞此文并注明出处,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读