操作系统———磁盘调度算法模拟

  • 实验目的

 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前最成用的磁盘调度算法有先来先服务(FCFS),最短寻道时间优先(SSTF),以及扫描算法(SCAN)。通过本实验可以加深理解有关磁盘调度的目标,并体会和了解最短寻道时间优先算法和扫描算法的具体实施办法。

  • 实验内容

1 100#磁道开始,被访问的磁道号分别为:555839189016015038184

2 要求用最短寻道时间优先算法的和扫描算法实现磁盘调度。

3 记录下每访问一个磁道磁头移动的磁道数,并计算平均寻道长度(平均移动磁道数)。,,

  • 实验要求

分别用两种算法实现磁盘调度。在实验结果分析中,将比较结果以列表的形式表现出来。用数组(或链表)TR[ ]存储待访问磁道号,将每次磁头移动磁道数用数组AR[ ] 存储。输出结果应如下例:(注意空格)

150

50

160

10

184

24

18,,

166

38

20

39

1

55

16

58

3

90

32

平均寻道长度:35.8

  • 编程工具:

C++语言平台(DevC++开发工具)

五、

(1)问题概述

  1. 磁盘调度算法的目的是优化磁盘I/O操作,减少磁头移动距离,从而提高磁盘I/O效率。
  2. 常见的磁盘调度算法包括:先来先服务(FCFS)算法、最短寻道时间优先(SSTF)算法、轮转优先(SCAN)算法、最少最近使用(LRU)算法等。
  3. FCFS算法按请求到达顺序依次处理请求,简单但效率低下。SSTF算法选择离当前磁头位置最近的请求处理,可以减少磁头移动但难以实现。
  4. SCAN算法将磁盘划分为多个区,依次扫描每个区处理请求,减少磁头移动但响应时间长。LRU算法优先处理最近最久未使用的磁盘块,需要记录使用信息增加开销。

(2)整体功能及设计

通过构建最短寻道时间优先算法函数、构建扫描算法函数,然后将创作主函数循环调用,并能够输出调度过程以及平均寻道长度。

(3)编程实现(附代码和截图)

#include<stdio.h> 
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
//55 58 39 18 90 160 150 38 184
void SSTF(int a[], int n) {//最短寻道时间优先调度int site = 1;//确定开始磁道中间位置int m, Left, Right;int i, j, sum = 0;double Average=0;int Temp; sort(a, a + n);//对磁道号进行从小到大排列printf("排序后磁道数组如下:\n");for (i = 0; i < n; i++) //输出排序后的磁道号数组printf("%d ", a[i]);printf("\n请输入开始的磁道号: ");scanf("%d", &m);printf("\nSSTF(最短寻道优先)调度过程如下: \n");printf("\n被访问的下一个磁道号             移动距离(磁道数)\n"); int mark = m;//用来计算差值或移动距离if (a[n - 1] <= m)//整个数组里的数都小于开始磁道号的情况{for (i = n - 1; i >= 0; i--) { //将数组磁道号就逆序输出printf("%10d ---------------------- %-3d\n", a[i], mark - a[i]);mark = a[i];}sum = m - a[0];}else if (a[0] >= m)//整个数组里的数都大于开始磁道号的情况{for (i = 0; i < n; i++) { //将磁道号从小到大顺序输出printf("%10d ---------------------- %-3d\n", a[i], a[i] - mark);mark = a[i];}sum = a[n - 1] - m;}else{while (a[site] < m)//找位置{site++;}Left = site - 1;Right = site;//确定开始磁道在已排的序列中的位置while ((Left >= 0) && (Right < n)){if ((m - a[Left]) <= (a[Right] - m))//找最短距离是在左侧还是右侧{printf("%10d ---------------------- %-3d\n", a[Left], mark - a[Left]);mark = a[Left];sum += m - a[Left];m = a[Left];Left = Left - 1;}else//在右侧{printf("%10d ---------------------- %-3d\n", a[Right], a[Right] - mark);mark = a[Right];sum += a[Right] - m;m = a[Right];Right = Right + 1;}}if (Left = -1){for (j = Right; j < n; j++)//顺序输出 {printf("%10d ---------------------- %-3d\n", a[j], a[j] - mark);mark = a[j];}sum += a[n - 1] - a[0];}else{for (j = Left; j >= 0; j--)//逆序输出 {printf("%10d ---------------------- %-3d\n", a[j], mark - a[j]);mark = a[j];}sum += a[n - 1] - a[0];}}printf("\n");Average = (double)sum / n;printf(" 可见平均寻道的长度为: %.2f \n", Average);
}void SCAN(int a[], int n) {///扫描算法或电梯调度算法int i, j, sum = 0;double Average;for (i = 0; i < n; i++){sort(a, a + n);//升序排序}printf("排序后的磁道数组如下:\n");for (i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n请输入开始的磁道号: ");int m;scanf("%d", &m);printf("\nSCAN(扫描或电梯)调度过程如下:\n");printf("\n被访问的下一个磁道号             移动距离(磁道数)\n"); int pointer;int mark = m;for (i = 0; i < n; i++){if (a[i] >= m)//找到比开始磁道号大的数 {pointer = i;sum += abs(a[i] - m);break;}}for (i = pointer; i < n; i++){if (i != pointer)//顺着磁头方向顺序输出 sum += abs(a[i] - a[i - 1]);printf("%10d ---------------------- %-3d\n", a[i], a[i] - mark);mark = a[i];}if (pointer >= 1)sum += abs(a[n - 1] - a[pointer - 1]);for (i = pointer - 1; i >= 0; i--)//逆着磁头方向顺序输出 {if (i)sum += abs(a[i] - a[i - 1]);printf("%10d ---------------------- %-3d\n", a[i], mark - a[i]);mark = a[i];}Average = (double)sum / n;printf("\n 平均寻道的长度为:%.2f\n", Average);
}
int main() {int track[100];//定义磁道号数组int select;int i = 0;int n;printf("请先输入磁道数量: \n");scanf("%d", &n);printf("请先输入磁道序列: \n");for (i = 0; i < n; i++){scanf("%d", &track[i]);}printf("\n");while (1){printf("1.最短寻道时间优先算法(SSTF) \n");printf("2.扫描算法(SCAN)\n");printf("3.退出\n");printf("\n");printf("请选择要使用的调度算法: ");scanf("%d", &select);switch (select)//算法选择{case 1:SSTF(track, n);//最短服务时间优先算法printf("\n");break;case 2:SCAN(track, n);//扫描算法printf("\n");break;case 3:exit(0);}}return 0;
}

(4)使用说明

输入磁道数量、输入磁道序列、然后回车根据菜单选择相应的调度算法。

(5)结果分析

1. 最短寻道时间优先算法(Shortest Seek Time First, SSTF)

- 优点:能有效减少磁头移动距离,从而减少平均I/O等待时间。

- 缺点:可能导致 starvation,后来请求的I/O等待时间可能很长。

2. 扫描算法(SCAN)

- 优点:能较好避免 starvation 问题,后来请求不会等待过长时间。

- 缺点:磁头移动距离可能较大,平均I/O等待时间较长。

3. 对比分析:

- SSTF算法在减少磁头移动距离上优于SCAN算法,平均I/O等待时间可能较短。

- 但SSTF可能出现一个请求等待时间特别长的情况,不如SCAN在公平性上。

- SSTF更依赖请求分布,如果请求分布不均匀,性能下降明显。

- SCAN算法性能更稳定,不易受请求分布影响。但移动距离较大,平均等待时间较长。

4. 综上,在I/O等待时间优先的场景下,SSTF算法效果较好;在公平性和稳定性要求较高的场景,SCAN算法更适用。

5. 实际使用中,也可以根据负载动态调整两种算法,兼顾等待时间和公平性的优点。

所以两种算法各有优劣,需要根据实际场景具体选择或结合使用,以达到最佳磁盘调度效果。

(6)设计体会

操作系统磁盘调度算法设计和实现给我带来以下几点体会:

1. 磁盘调度算法直接影响系统I/O性能,是操作系统优化的重要一环。不同算法在不同场景下会有很大差异。

2. 算法设计需要考虑公平性、等待时间、移动距离等多方面因素,难度较大。一个好的算法需要兼顾各项指标。

3. 实际系统I/O请求模式复杂,简单的算法在实际中效果可能不如预期。需要结合负载动态调整策略。

4. 算法实现需要考虑多磁盘和多请求并发场景,数据结构和同步机制的设计很重要。

5. 不同算法在不同系统和应用场景下性能也会有差异。需要通过实验对比分析不同参数和场景下的优劣。

7. 算法是一个需要不断优化和更新的模块。需要提供良好的扩展接口支持后期升级。

8. 理解主流算法原理和思路,对设计和优化自己的算法很有帮助。

9. 磁盘调度涉及操作系统、算法和性能优化多个知识点。整个设计过程让我对系统有了更深入的认识。

总体来说,磁盘调度算法设计是一个系统性和实践性很强的学习过程,给我带来很多收获。它也反映了操作系统研发需要考虑的各个方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot的配置文件

配置文件的作用 整个项目中所有重要的数据都是在配置文件中配置&#xff0c;如数据库的连接信息&#xff0c;项目的启动端口&#xff0c;用于发现和定位问题的普通日志和异常日志等等。配置文件可以分为两类 系统使用的配置文件&#xff08;系统配置文件&#xff09;&#xf…

JS基础源码之手写模拟new

JS基础源码之手写模拟new 手写模拟new初步实现最终实现 手写模拟new new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一。 我们先看看new实现了哪些功能&#xff1a; function Person (name,age){this.name name;this.age age;this.habit Games;…

开发猿的平平淡淡周末---2023/12/9

上周回顾 完成了遗留的开发任务&#xff0c;基本全部完成进一步了解了系统当时设计的原理熟悉了代码的重构 2023.12.9 天气晴 温度适宜 前言 小伙伴们大家好&#xff0c;时间很快&#xff0c;又来到了周末&#xff0c;也是一个平平淡淡的周末。上周只更了一篇博客...原…

渗透测试 | 渗透测试之信息收集

渗透测试&#xff08;penetration test&#xff0c;pentest&#xff09;是实施安全评估&#xff08;即审计&#xff09;的具体手段。 渗透测试可能是单独进行的一项工作&#xff0c;也可能是常规研发生命周期&#xff08;例如&#xff0c;Microsoft SDLC&#xff09;里 IT 安全…

Unicode编码解码

一、Unicode概述 Unicode是一种字符编码标准&#xff0c;旨在解决不同字符集之间的兼容性问题。它为全球所有语言提供了一种统一的编码方式&#xff0c;使得各种字符能够在计算机系统中正确显示和处理。Unicode字符集包含了世界上几乎所有的字符&#xff0c;包括中文字符、英文…

算法Day23 简单吃饭(0-1背包)

简单吃饭&#xff08;0-1背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int total scanner.nextInt(…

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(中,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一&#xff0c;进度问题在项目生命周期内引起的冲突最多。 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一…

情深不必纠缠

那一年&#xff0c;男孩女孩在万千人中相遇了。多年后女人的一封邮件&#xff0c;让男人与女人的灵魂相遇了。他们无缘夫妻&#xff0c;却发现彼此是灵魂的陪伴。不能携手相守&#xff0c;却懂得彼此的心灵。 有一天&#xff0c;女人告诉男人要回家了&#xff0c;问男人心里会不…

VMware安装Ubuntu20.04并使用Xshell连接虚拟机

文章目录 虚拟机环境准备重置虚拟网络适配器属性&#xff08;可选&#xff09;配置NAT模式的静态IP创建虚拟机虚拟机安装配置 Xshell连接虚拟机 虚拟机环境准备 VMware WorkStation Pro 17.5&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGr…

网上下载的pdf文件,为什么不能复制文字?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很可能是…

AlexNet

概念 过拟合:根本原因是特征维度过多&#xff0c;模型假设过于复杂&#xff0c;参数过多&#xff0c;训练数据过少&#xff0c;噪声过多&#xff0c;导致拟合的函数完美的预测训练集&#xff0c;但对新数据的测试集预测结果差。 过度的拟合了训练数据&#xff0c;而没有考虑到…

29、卷积 - 参数 padding 的作用

在卷积过程中,Padding(填充)是一个关键的概念,它对于保留输入信息和有效地处理边缘信息至关重要。 1、Padding是什么? Padding 指的是在输入图像的周围添加额外的像素值,用来以扩大输入图像的尺寸,这些额外填充的像素值通常设置为零,卷积操作在这个填充后的输入图像上…

ThinkPHP生活用品商城系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP生活用品商城系统 一 介绍 此生活用品商城系统基于ThinkPHP框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统分为用户和管理员。(附带配套设计文档) 技术栈&#xff1a;ThinkPHPmysqlbootstrapphpstudyvscode 二 …

MYSQL主从复制配置指引

MYSQL主从复制配置指引 1.前期准备 部署完主备数据库&#xff0c;初始化主备库表结构和数据。 2. 主库配置修改 修改主库配置文件etc/my.cnf&#xff0c;新增以下配置&#xff1a; #服务器 id&#xff0c;需唯一 server-id 1 #二进制文件存放路径 log-bin mysql-bin …

深入理解JavaScript的箭头函数

深入理解JavaScript的箭头函数 在ES6中&#xff0c;JavaScript引入了箭头函数的概念&#xff0c;它提供了一种更简洁的语法来定义匿名函数。虽然箭头函数看起来很简单&#xff0c;但它们在实际应用中有一些独特的特性和行为。让我们深入理解箭头函数并学习如何正确地使用它们。…

记账中心二开

系统预设了 这几种 FSubSystem 为子系统 T_VC_SubSystem 卡片显示的表 字段 FNeedRalteAccount 设置为1的话 &#xff0c;需要与总账连用系统将去查找 系统状态控制表。 如果系统状态 没有配置这个子系统 将无法显示数据 select sysStaCtr.fid from T_BD_SystemStatusCt…

Java LeetCode篇-深入了解二叉树的经典解法(多种方式实现:构造二叉树)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 从前序与中序遍历序列来构造二叉树 1.1 实现从前序与中序遍历序列来构造二叉树思路 1.2 代码实现从前序与中序遍历序列来构造二叉树 2.0 从中序与后序遍历序…

计算目标检测和语义分割的PR

需求描述 实际工作中&#xff0c;相比于mAP项目更加关心的是特定阈值下的precision和recall结果&#xff1b;由于本次的GT中除了目标框之外还存在多边形标注&#xff0c;为此&#xff0c;计算IoU的方式从框与框之间变成了mask之间&#xff1b; 本文的代码适用于MMDetection下的…

Java Web 学习之路(2) —— 概念、SpringBoot + MyBatis(controller+service+mapper)开发流程与过程梳理

文章目录 前言1. 常见的一些概念1.1 POJO&#xff08;Plain Ordinary Java Object 简单Java对象&#xff09;1.2 DAO和Mapper 2. Java的三层架构2.1 包的层级结构2.2 交互层 controller&#xff08;用户界面、网页&#xff09;jsp文件2.3 业务处理层 service2.4 Mapper层 3. 注…

2024 年甘肃省职业院校技能大赛信息安全管理与评估赛项规程

2024 年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项规程 一、赛项名称 赛项名称&#xff1a;信息安全管理与评估 赛项类别&#xff1a;团体赛 赛项归属&#xff1a;电子与信息大类 二、竞赛目的 极安云科专注技能竞赛&#xff0c;包含网络建设…