02327 / 02326 操作系统实践考试总结(模拟磁盘调度算
文 | 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
![](https://img.haomeiwen.com/i6095354/3fe1c4f7f37c4c5c.png)
以下是其他算法运行结果图:
![](https://img.haomeiwen.com/i6095354/d2d6c0f2c565efd7.png)
![](https://img.haomeiwen.com/i6095354/3a83d5d58daf643a.png)
![](https://img.haomeiwen.com/i6095354/437bdb2f3cf302e1.png)
![](https://img.haomeiwen.com/i6095354/27b1dc984b06e5ff.png)
![](https://img.haomeiwen.com/i6095354/84ce265adcebd2ba.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
版权声明:本文为博主原创文章,转载请点赞此文并注明出处,谢谢!