实验题目磁盘调度算法

实验学时】:4学时

实验目的

通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。

实验内容

问题描述:

设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。

程序要求如下:

1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。

2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。

3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。

4)输出:四种算法的每次磁头移动寻道长度和平均寻道长度。

核心算法:

FIFO:

SSTF:

SCAN:

C-SCAN

源代码:

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#define maxsize 1000 //定义最大数组域
//先进先出调度算法
void FCFS(int array[], int m)
{int sum = 0, j, i, now;float avg;printf("\n 请输入当前的磁道号: ");scanf("%d", &now);printf("\n FCFS 调度结果: ");printf("%d ", now);for (i = 0; i < m; i++) printf("%d ", array[i]);sum = abs(now - array[0]);for (j = 1; j < m; j++) sum += abs(array[j] - array[j - 1]); //累计总的移动距离avg = (float)sum / m;//计算平均寻道长度printf("\n 移动的总道数: %d \n", sum);printf(" 平均寻道长度: %.1f \n", avg);
}
//最短服务时间优先调度算法
void SSTF(int array[], int m)
{int temp;int k = 1;int now, l, r;int i, j, sum = 0;float avg;for (i = 0; i < m; i++){for (j = i + 1; j < m; j++) //对磁道号进行从小到大排列{if (array[i] > array[j])//两磁道号之间比较{temp = array[i];array[i] = array[j];array[j] = temp;}}}for (i = 0; i < m; i++) //输出排序后的磁道号数组printf("%d ", array[i]);printf("\n 请输入当前的磁道号: ");scanf("%d", &now);printf("\n SSTF 调度结果: ");if (array[m - 1] <= now)//判断整个数组里的数是否都小于当前磁道号{for (i = m - 1; i >= 0; i--) //将数组磁道号从大到小输出printf("%d ", array[i]);sum = now - array[0];//计算移动距离}else if (array[0] >= now)//判断整个数组里的数是否都大于当前磁道号{for (i = 0; i < m; i++) //将磁道号从小到大输出printf("%d ", array[i]);sum = array[m - 1] - now;//计算移动距离}else{while (array[k] < now)//逐一比较以确定 K 值{k++;}l = k - 1;r = k;//确定当前磁道在已排的序列中的位置while ((l >= 0) && (r < m)){if ((now - array[l]) <= (array[r] - now))//判断最短距离{printf("%d ", array[l]);sum += now - array[l];//计算移动距离now = array[l];l = l - 1;}else{printf("%d ", array[r]);sum += array[r] - now;//计算移动距离now = array[r];r = r + 1;}}if (l = -1){for (j = r; j < m; j++){printf("%d ", array[j]);}sum += array[m - 1] - array[0];//计算移动距离}else{for (j = l; j >= 0; j--){printf("%d ", array[j]);}sum += array[m - 1] - array[0];//计算移动距离}}avg = (float)sum / m;printf("\n 移动的总道数: %d \n", sum);printf(" 平均寻道长度: %.1f \n", avg);
}
///扫描算法
void SCAN(int array[], int m)
{int sum = 0;for (int i = 0; i < m; i++){for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列{if (array[i] > array[j])//两磁道号之间比较{int temp = array[i];array[i] = array[j];array[j] = temp;}}}for (int i = 0; i < m; i++){printf("%d ", array[i]);}printf("\n 请输入当前的磁道号: ");int now;scanf("%d", &now);printf("\n SCAN 调度结果:");int pos;     //存放开始磁道在要访问磁道序列中的位置for (int i = 0; i < m; i++){if (array[i] >= now) //找到第一个大于等于开始磁道的磁道位置{pos = i;sum += abs(array[i] - now); //计算当前磁道与开始磁道间的距离break;  //跳出循环}}for (int i = pos; i < m; i++)//从pos向后移动访问,并计算距离{if (i != pos)sum += abs(array[i] - array[i - 1]); printf("%d ", array[i]);  //输出向后移动访问序列}if (pos >= 1)sum += abs(array[m - 1] - array[pos - 1]); //从最后回到pos-1,并计算距离for (int i = pos - 1; i >= 0; i--) //从pos-1向前移动访问,并计算距离{if (i)sum += abs(array[i] - array[i - 1]);printf("%d ", array[i]);}printf("\n 移动的总道数:%d\n 平均寻道长度:%.1f\n", sum, 1.0 * sum / m);
}
///循环扫描算法
void CSCAN(int array[], int m)
{int sum = 0;for (int i = 0; i < m; i++){for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列{if (array[i] > array[j])//两磁道号之间比较{int temp = array[i];array[i] = array[j];array[j] = temp;}}}for (int i = 0; i < m; i++){printf("%d ", array[i]);}printf("\n 请输入当前的磁道号: ");int now;scanf("%d", &now);printf("\n C-SCAN 调度结果:");int pos;      //存放输入的开始磁道在要访问磁道序列中的位置for (int i = 0; i < m; i++){if (array[i] >= now)//找到第一个大于等于开始磁道的磁道位置{pos = i;sum += abs(array[i] - now);//计算当前磁道与开始磁道间的距离break; //跳出循环}}for (int i = pos; i < m; i++)//从pos向后扫描至尾部,并计算距离{if (i != pos)sum += abs(array[i] - array[i - 1]);printf("%d ", array[i]);}if (pos >= 1)sum += abs(array[m - 1] - array[0]);//从序列尾部移动到序列头部,并计算距离for (int i = 0; i < pos; i++)//从序列头部向后扫描至pos,并计算距离{if (i)sum += abs(array[i] - array[i - 1]);printf("%d ", array[i]);}printf("\n 移动的总道数:%d\n 平均寻道长度:%.1f\n", sum, 1.0 * sum / m);
}
// 操作界面
int main()
{int c;int count;//int m=0;int cidao[maxsize];//定义磁道号数组int i = 0;int b;printf("\n --------------------------------------------------\n");printf(" 磁盘调度算法模拟");printf("\n --------------------------------------------------\n");printf("请先输入磁道数量: \n");scanf("%d", &b);printf("请先输入磁道序列: \n");for (i = 0; i < b; i++){scanf("%d", &cidao[i]);}printf("\n 磁道读取结果: \n");for (i = 0; i < b; i++){printf("%d ", cidao[i]);//输出读取的磁道的磁道号}count = b;printf("\n ");while (1){printf("\n 算法选择: \n");printf(" 1、先进先出算法( FCFS) \n");printf(" 2、最短服务时间优先算法( SSTF) \n");printf(" 3、扫描算法( SCAN) \n");printf(" 4、循环扫描算法( C-SCAN) \n");printf(" 5. 退出\n");printf("\n");printf("请选择: ");scanf("%d", &c);if (c > 5)break;switch (c)//算法选择{case 1:FCFS(cidao, count);//先进先出算法printf("\n");break;case 2:SSTF(cidao, count);//最短服务时间优先算法printf("\n");break;case 3:SCAN(cidao, count);//扫描算法printf("\n");break;case 4:CSCAN(cidao, count);//循环扫描算法printf("\n");break;case 5:exit(0);}}return 0;
}

 

《操作系统》实验六:磁盘调度算法相关推荐

  1. 操作系统实验七 磁盘调度算法的模拟与实现(C语言)

    实验七 磁盘调度算法的模拟与实现 1 .实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握常用磁盘调度算法及其相关特性. 2 .实验基本知识及 ...

  2. 操作系统课程设计---实验七 磁盘调度算法的模拟与实现

    实验七 磁盘调度算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握 ...

  3. 操作系统实验4—磁盘调度

    操作系统实验4-磁盘调度 文章目录 操作系统实验4-磁盘调度 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度. 实验目的: 本实 ...

  4. 操作系统实验六--设备管理

    文章目录 操作系统实验六--设备管理 一.实验目的 二.实验内容 三.设计原理及相关算法 四.结果分析 五.源代码 操作系统实验六–设备管理 一.实验目的 1.通过实验,进一步了解设备独立性的概念: ...

  5. linux实验六磁盘综合管理

    linux实验六磁盘综合管理 ##具体的实验步骤解释在底部!!! 实验名称:磁盘综合管理 实验时间:2022 年 4 月 19 日 实验地点:电子阅览室一 实验目的: 1. 掌握fdisk.mount ...

  6. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

  7. 操作系统实验六 设备管理

    实验六 设备管理 一.实验目的 1. 理解设备管理的概念和任务. 2. 掌握独占设备的分配.回收等主要算法的原理并编程实现. 二.实验内容与基本要求 1. 在Windows系统中,编写程序实现对独占设 ...

  8. 操作系统实验六、系统内存使用统计

    实验六:系统内存使用统计 一.实验目的 1.了解windows内存管理机制,理解页式存储管理技术. 2.熟悉Windows内存管理基本数据结构. 3.掌握WIndows内存管理基本API的使用. 二. ...

  9. 操作系统实验六:Linux下的C语言编程

    实验六 Linux下的C语言编程 一.实验要求 (1)熟悉Linux环境下C语言应用程序开发的基本过程: (2)熟悉基本库函数的使用: (3)具有初步的应用程序设计能力. 二.实验内容 (1)有三个程 ...

  10. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

最新文章

  1. linux+npm+v+报错_linux – npm install会导致像npm ERR这样的错误...
  2. nginx日志配置指令详解
  3. golang json判断类型
  4. “寓教于乐”,DeepMind新研究让机器人从0开始学习复杂精细动作
  5. jquery多字段筛选,极简方法
  6. jsp js弹出网页对话框
  7. html中怎么设置背景图片固定,css如何实现固定的背景图像
  8. 不存在一笔画完一个正方体
  9. 【STM32H7的DSP教程】第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子
  10. 荣耀手机如何批量删除日历日程?日历日程提醒便签
  11. lvm 多个硬盘合成一个_linux使用LVM合并硬盘
  12. 2021年化工自动化控制仪表考试资料及化工自动化控制仪表免费试题
  13. 【6.28校内test】T2 【音乐会】二重变革
  14. 更加安全便捷的印章管理——区块链电子印章
  15. 决策树与随机森林(从入门到精通)
  16. Python简单操作爬取微博热搜榜(表格.xls模式存储)
  17. 用C语言算两个数的商和
  18. el-date-picker element时间选择器 先选择年 再选择月 年月日依次选择
  19. TCP与UDP 的区别
  20. 全栈必备的技术栈设想

热门文章

  1. e生保等待期什么意思_e生保几个月生效 平安e生保大病等待期
  2. AutoGPT使用教程
  3. 工作积累最常用的shell脚本编程基础,一文扫盲流程控制语句
  4. MySQL自增主键详解
  5. VUE项目 Iview UI 文件夹上传
  6. 三本计算机留学韩国能申什么学校,三本院校毕业工作后留学韩国?有梦想没有什么不可以!...
  7. 老鱼看会:2017甲骨文云大会都说了些什么?
  8. 武林外传经典对话大全(转)
  9. 用户运营的目标是什么?
  10. 【C语言入门】SDUT《程序设计基础I 》实验1-顺序结构程序设计题解 c语言入门语法讲解