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

  • 实验目的

 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前最成用的磁盘调度算法有先来先服务(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…

【Kotlin】

Lambda 就是一小段可以作为参数传递的代码。 因为正常情况下&#xff0c;我们向某个函数传参时只能传入变量&#xff0c;而借助Lambda 却允许传入一小段代码。 Lambda 表达式的语法结构&#xff1a; {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}首先&#xff0c;最外…

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(…

WebDriver核心方法和属性:掌握自动化测试的利器

在自动化测试中&#xff0c;Selenium WebDriver是一个非常重要的工具。它提供了一种方式来模拟用户与浏览器的交互&#xff0c;从而进行各种操作&#xff0c;如点击按钮、输入文本等。本文将介绍WebDriver的核心方法和属性&#xff0c;以及如何使用它们。 1. 启动和关闭浏览器…

使用es256算法生成jwt

1、使用hutool来做 1、先去jwt解密/加密 - bejson在线工具弄个公私钥 2、导入hutool maven <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency><depe…

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

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

Pytorch中的resize和reshape

torch.reshape() 官方文档的大致意思是&#xff1a; 返回与输入具有相同数据和元素数量的张量&#xff0c;但是具有指定形状。如果可能&#xff0c;返回的张量将是输入的视图&#xff0c;也就是说原本的tensor并没有被改变&#xff0c;如果想要改变那么就将改变的tensor赋值给…

情深不必纠缠

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

ejs —— 三目运算符的用法

EJS&#xff08;Embedded JavaScript&#xff09;是一种简单的模板语言&#xff0c;它允许将JavaScript代码嵌入到HTML中。在EJS中&#xff0c;<%、<%和<%-是用于将JavaScript代码嵌入到模板中的语法。 <%&#xff1a;这是EJS的输出表达式&#xff0c;用于将变量的…

阿里云安装docker

文章目录 一、 yum 进行安装&#xff08;os版本 CentOS 7&#xff09; 推荐二、 apt-get 进行安装(os版本 Ubuntu 14.04/16.04&#xff09;三、测试四、阿里云docker加速 一、 yum 进行安装&#xff08;os版本 CentOS 7&#xff09; 推荐 # step 1: 安装必要的一些系统工具 su…

<HarmonyOS第一课>应用服务上架【课后考核】

【习题】HarmonyOS应用/元服务上架 判断题 元服务发布的国家与地区仅限于“中国大陆” 正确(True) 编译打包的软件包存放在项目目录build > outputs > default下 正确(True) 单选题 创建应用时&#xff0c;应用包名需要和app.json5或者config.json文件中哪个字段保持…

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

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

基于Java旅游信息管理系统

基于Java旅游信息管理系统 功能需求 1、旅游目的地管理&#xff1a;系统需要能够记录和管理各个旅游目的地的详细信息&#xff0c;包括景点介绍、交通方式、住宿推荐等。管理员可以添加、编辑和删除目的地信息。 2、旅游线路规划&#xff1a;系统需要提供旅游线路规划功能&a…

C++类名后面跟大括号和跟小括号的区别

在 C 中&#xff0c;类名后面跟着大括号 {} 和小括号 () 有不同的含义和作用。 大括号 {}&#xff1a; 初始化对象&#xff1a;当在声明类对象时使用大括号 {} 时&#xff0c;这表示对对象进行初始化。这种方式也称为列表初始化或者统一初始化。示例&#xff1a;MyClass obj{};…

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

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

AlexNet

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