操作系统实验之磁盘调度

磁盘调度算法的C++实现2.0 (FCFS、SSTF、SCAN、CSCAN、NStepSCAN) 磁盘调度算法的C++实现2.0 (FCFS、SSTF、SCAN、CSCAN、NStepSCAN) 前言 以前写的老代码参见这里,因为代码的结构很糟糕,而且有些人私信我能不能重写一下,遂重写了一下,从面向过程到面向对象,希望能对您有所帮助. 代码 #pragma region 提示信息 /* Start by [Han.des].[2019/12/13] 1.该代码是对之前代码的一次重写和复习 2.... 阅读详情

实验要求

  • 选择1~3种磁盘调度算法(先来先服务法、最短寻道时间优先、电梯算法)模拟实现磁盘调度;
  • 能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等;
  • 计算磁头移动的总磁道数;
  • 能够显示磁盘调度结果(磁头依次访问的磁道号顺序等)

我选择了先来先服务法FCFS、最短寻道时间优先SSTF、电梯算法SCAN三种调度算法,代码用Java实现。
源码已上传到本人github上,建议先看源码。

实验原理

代码结构

HardDrive类表示磁盘,其私有成员有tracks表示访问序列数组,trackSet表示磁道访问集合,用HashSet实现Set接口,headAt表示磁头处于磁道位置,direction表示在SCAN调度算法里磁头移动的方向,distance表示磁头移动的总距离,method表示调度方法

代码思路

整体思路

用tracks数组表示访问序列,用于FCFS调度。trackSet用于遍历访问序列,获得每次离磁头最近的磁道。headAt在每次移动磁头后记录位置,distance用来保存每次headAt移动前后距离的绝对值的累加和。
构造一个HardDrive对象,并将参数tracks、headAt、direction、method参数带入,根据调度方法不同输出不同的结果。

FCFS

先来先服务调度比较简单,用数组表示顺序访问序列,遍历数组,输出下一个数组元素i,计算数组该元素i和当前headAt距离并保存到distance中,修改磁头headAt位置。遍历结束后输出distance。

    private void FCFS() {
        System.out.print("寻道顺序为:" + headAt + " ");
        for (int i : tracks) {
            System.out.print(i + " ");
            this.distance += Math.abs(headAt - i);
            headAt = i;
        }
        System.out.println();
        System.out.println("总路程=" + this.distance);
    }

SSTF

最短寻道时间优先调度使用trackSet,遍历trackSet每次选出一个离磁头最近的磁道并输出,把距离累加到distance中,将磁头移到该磁道,将该磁道从trackSet中移除,直到trackSet为空。最后输出总路程。

        System.out.print("寻道顺序为:" + headAt + " ");
        while (!trackSet.isEmpty()) {
            Iterator<Integer> iterator = trackSet.iterator();
            int chosenOne = iterator.next();
            while (iterator.hasNext()) {
                int t = iterator.next();
                if (Math.abs(t - this.headAt) < Math.abs(chosenOne - this.headAt))
                    chosenOne = t;
            }
            System.out.print(chosenOne + " ");
            this.distance += Math.abs(this.headAt - chosenOne);
            this.headAt = chosenOne;
            trackSet.remove(chosenOne);
        }
        System.out.println();
        System.out.println("总路程=" + this.distance);
    }

SCAN

电梯调度算法首先将当前访问序列进行冒泡排序,然后在排序后的数组中找到当前磁头的序号head,根据输入的磁头移动方向分别移动并输出,同时把距离累加到distance中,最后输出总路程。

    private void SCAN() {
        System.out.print("寻道顺序为:" + headAt + " ");
        int[] orderTracks = this.tracks.clone();
        for (int i = 0; i < orderTracks.length; i++) {
            for (int j = i + 1; j < orderTracks.length; j++) {
                if (orderTracks[i] > orderTracks[j]) {
                    int t = orderTracks[i];
                    orderTracks[i] = orderTracks[j];
                    orderTracks[j] = t;
                }
            }
        }
        int head = 0;
        for (int i = 0; i < orderTracks.length&&orderTracks[i]<headAt; i++) {
            head++;
        }
        if (direction) {
            for (int i = head; i < orderTracks.length; i++) {
                System.out.print(orderTracks[i] + " ");
                this.distance += Math.abs(this.headAt - orderTracks[i]);
                this.headAt = orderTracks[i];
            }
            for (int i = head - 1; i >= 0; i--) {
                System.out.print(orderTracks[i] + " ");
                this.distance += Math.abs(this.headAt - orderTracks[i]);
                this.headAt = orderTracks[i];
            }
        } else {
            for (int i = head; i < orderTracks.length; i++) {
                System.out.print(orderTracks[i] + " ");
                this.distance += Math.abs(this.headAt - orderTracks[i]);
                this.headAt = orderTracks[i];
            }
            for (int i = head - 1; i >= 0; i--) {
                System.out.print(orderTracks[i] + " ");
                this.distance += Math.abs(this.headAt - orderTracks[i]);
                this.headAt = orderTracks[i];
            }
        }
        System.out.println();
        System.out.println("总路程=" + this.distance);
    }

实验结果

测试用例

int[] tracks = {98, 183, 37, 122, 14, 124, 65, 67};

FCFS

1.FCFS 2.SSTF 3.SCAN
请输入调度算法:1
请输入磁头起始位置:
53
请输入方向(0.左 1.右):
0
寻道顺序为:53 98 183 37 122 14 124 65 67
总路程=640

Process finished with exit code 0

SSTF

1.FCFS 2.SSTF 3.SCAN
请输入调度算法:2
请输入磁头起始位置:
53
请输入方向(0.左 1.右):
0
寻道顺序为:53 65 67 37 14 98 122 124 183
总路程=236

Process finished with exit code 0

SCAN

1.FCFS 2.SSTF 3.SCAN
请输入调度算法:3
请输入磁头起始位置:
53
请输入方向(0.左 1.右):
0
寻道顺序为:53 37 14 65 67 98 122 124 183
总路程=208

Process finished with exit code 0

马后炮

调试过程

调试基本没有出现很大的问题,主要出现的是一些小细节的地方,比如数组越界等问题,经过调试后便能正常运行。

小结

磁盘调度实验是操作系统三次实验里最简单的一个,主要考察的实际是对调度思想的理解,实际代码的难度并不大,代码上的难点顶多就于数组的遍历。

磁盘调度算法(FIFO、SSTF、SCAN、C-SCAN)模拟与实现 前言 (1)磁盘数据的组织 磁盘上每一条物理记录都有唯一的地址,该地址包括三个部分:磁头号(盘面号)、柱面号(磁道号)和扇区号。给定这三个量就可以唯一地确定一个地址。 (2)磁盘访问时间的计算方式 磁盘在工作时以恒定的速率旋转。为保证读或写,磁头必须移动到所要求的磁道上,当所要求的扇区的开始位置旋转到磁头下时,开始读或写数据。对磁盘的访问时间包括:寻道时间、旋转延迟时间和传输时间。 (3)磁盘调度算法 磁盘调度的目的是要尽可能降低磁盘的寻道时间,以提高磁盘 I/O 系统的性能。 一、算法介绍 本磁盘调度使用 阅读详情

相关推荐

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

操作系统实验4—磁盘调度 文章目录操作系统实验4—磁盘调度实验描述设计思路上机代码测试结果心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度。 实验目的: 本实验要求学生独立设计并实现磁盘调度模拟程序,以加深对磁盘调度特点和各种磁盘调度算法的理解。 实验要求: 可以随机输入磁道请求序列,当前磁头位置和磁头移动方向,支持先来先服务、最短寻道时间优先、扫描、循环扫描调度算法,能够输出磁头移动经过的磁道序列。具体信息见测试用例格式说明。 测试用例格式如下: 输入: 磁盘调度算法 当前磁

qq_42582489的博客 8723

磁盘调度策略

磁盘共400磁道,若磁头的当前位置为100,磁头正向磁道号增加方向移动,现有一磁盘读写请求队列,23,376,205,132,19,61,190,398,29,4,18,40。有访问请求时,向一个方向扫描并处理请求,在移动方向上没有磁盘请求时,立刻返回到最小磁道号,以减少等待时间。它的优点是简单易实现,但可能导致长的寻道等待时间,因为它无法考虑请求的物理位置。​ 没有访问请求时,磁头不动,有访问时磁头来回扫描,每次选择磁头移动方向上最近的访问请求,若移动方向上没有请求了,则改变方向,向反方向扫描。

m0_61386859的博客 405

操作系统实验 - 题目五 磁盘调度算法的实现

5.1 题目的主要研究内容及预期达到的目标 【设计目的】 理解磁盘调度相关理论;掌握多种磁盘调度算法。 【课题描述】 本课题主要针对操作系统中磁盘调度相关理论进行设计。要求实现程序并进行测试,该程序模拟操作系统常用的四种磁盘调度算法,即: (1)先来先服务算法(FCFS) (2)最短寻道时间优先算法(SSTF) (3)扫描算法(SCAN) (4)循环扫描算法(CSCAN) 【课题内容】 (1)设计磁盘调度请求队列(请求数≥10); (2)设定单位寻道时间; (3)可动态修改磁盘请求时间和磁道; (4)分别实

qq_40580037的博客 5274

磁盘调度算法的模拟与实现-2023-代码简单,注释多

(1) 了解磁盘结构以及磁盘上数据的组织方式。(2) 掌握磁盘访问时间的计算方式。(3) 掌握常用磁盘调度算法及其相关特性。

weixin_46337464的博客 744

操作系统磁道号调度算法

可直接使用

Cherry Studio 新手必看:5分钟搞定MCP服务器配置(附常见问题解决)

本文为Cherry Studio新手提供了详细的MCP服务器配置指南。文章从核心概念入手,解释了Cherry Studio作为MCP客户端如何通过MCP协议安全、标准化地扩展AI助手能力。重点讲解了uv和Bun环境的安装与常见网络问题的解决方案,并演示了如何添加首个MCP服务器(如mcp-server-fetch),助你快速构建可扩展的智能工作流。

corn8的博客 596

磁盘调度算法

操作系统的职责之一是有效使用硬件。对于磁盘驱动器,满足这个要求具有较快的访问速度和较宽的磁盘带宽。 访问磁盘时间包括两部分: 寻道时间: 磁臂移动磁头到包含目标扇区的柱面的时间 旋转延迟: 磁盘旋转目标扇区到磁头下的额外时间 磁盘带宽是传输字节的总数除以从服务请求开始到最后传递结束时的总时间。通过管理磁盘 I/O 请求的处理次序,可以改善访问时间和带宽。 每个进程需要进行磁盘I/O操作时,它就向操作系统发出一个系统调用。这个请求需要包含信息: 这个操作是输入还是输出 传输的磁盘地址是什么 传输

平凡 2160

从零到一:RK3588嵌入式开发中的SDK与MPP集成实战解析

本文详细解析了RK3588嵌入式开发中SDK与MPP(Media Process Platform)的集成实战,涵盖开发环境构建、SDK架构解析、MPP集成关键技术点及常见问题诊断。通过Qt5.12.10交叉编译环境配置和硬件加速优化,帮助开发者高效完成嵌入式视觉项目开发,特别适合边缘计算应用场景。

weixin_29189381的博客 511

操作系统实验——磁盘调度算法(FIFS SSTF SCAN)

操作系统实验——磁盘调度算法(FIFS SSTF SCAN) 一、实验目的 1、了解磁盘调度的策略和原理; 2、理解和掌握磁盘调度算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、电梯扫描算法(SCAN)。 二、实验内容 1、模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯扫描算法(SCAN)三种磁盘调度算法; 2、对三种算法进行对比分析。 3、输入为一组请求访问磁道序

bct的博客 1万+

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 458

从图片到3D模型:用Tripo+Unity打造AI建模流水线(避坑指南)

本文详细介绍了如何利用Tripo和Unity构建AI驱动的3D建模流水线,从图片到3D模型的高效转换。通过文生模型和图生模型的双模系统,开发者可以大幅提升建模效率,适用于游戏开发和数字内容创作。文章还提供了环境配置、图片预处理、批量生成等实用技巧,帮助开发者避开常见陷阱。

weixin_27024175的博客 616

操作系统实验——磁盘调度算法

文章目录前言一、实验目的二、实验内容和要求三、实验程序四、运行结果运行结果截图五、思考和分析程序实现(思路):分析几种算法:附 前言 提示:本次实验在Linux(Ubuntu)中运行,程序中读取的文件需放在与c文件同一个文件夹中,或者自行在代码中修改路径。 一、实验目的 掌握几种基本的磁盘调度算法。 先来先服务法 最短寻道时间优先法 电梯法 二、实验内容和要求 采用模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time

qq_45907357的博客 8827

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 628

【操作系统】实验3:文件管理(磁盘调度)

注:本文记录 WHUT-计算机学院-操作系统 课程 实验3:文件管理(磁盘调度) 纸上得来终觉浅,觉知此事需躬行! 1、实验内容: •实验预备:掌握磁盘调度的相关内容,对磁盘结构及调度算法有深入的理解。 •实验内容:模拟实现磁盘调度功能 •具体要求: –任选一种计算机高级语言编程实现 –选择2~3种磁盘调度算法(先来先服务、最短寻道时间优先、电梯算法)模拟实现磁盘调度 ...

拾年之璐 7696

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 612

YOLOv13改进策略【Neck】| CVPR2024 LGAG:大核分组注意力门模块,3×3分组卷积与注意力协同的特征精准融合

本文记录的是利用LGAG 模块改进 YOLOv13 的颈部融合部分。(Large-kernel Grouped Attention Gate)通过3×3分组卷积与注意力机制结合,引导解码器处理特征与跳接特征的精准融合。本文利用模块,通过3×3分组卷积扩大感受野以捕捉更广泛局部空间上下文,同时结合注意力机制生成自适应注意力系数,对YOLOv13中关键目标特征赋予高激活值、抑制冗余背景特征,在特征融合阶段实现全局语义与局部细节的高效结合,减少计算成本的同时提升特征表达能力,增强模型对复杂场景下目标的检测精度与效

Limiiiing的博客 104

操作系统实验六:磁盘调度算法

操作系统实验六:磁盘调度算法 去发现同类优质开源项目:https://gitcode.com/ 本文档包含操作系统实验六的相关资源,主要涉及磁盘调度算法的实现。资源中包含源代码和详细的实验报告,旨在帮助学生更好地理解磁盘调度算法的原理和实现。 实验内容 实现多种磁盘调度算法,如FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描算法)等。 通过模拟程序,观察不同调度算法下磁盘访问...

gitblog_06718的博客 396

微信小程序 - 强力解决播放视频卡顿问题,小程序使用video组件播放视频或第三方视频插件,会出现卡顿或者无法播放的各种奇怪问题(微信小程序苹果ios/安卓播放视频很卡不流畅、视频太长或文件大等情况)

微信小程序视频组件播放卡顿,微信小程序video组件出现无法播放或卡顿,微信小程序video组件播放时会出现卡顿,微信小程序使用video组件播放视频的时候,会出现卡顿或者无法播放的问题,微信小程序安卓视频播放卡顿问题,微信小程序苹果ios手机播放视频不流畅很卡,加cdn还是卡,uniapp播放视频会有明显的卡顿问题,video视频时卡顿不流畅问题,为什么video组件播放视频卡顿?苹果微信小程序通过video组件播放视频时卡顿,怎么解决?微信小程序video组件出现无法播放或卡顿,设置custom-cac

🏆 前端领域优质创作者 1万+

【操作系统原理 实验报告6】磁盘调度算法

本实验通过EOS系统研究了磁盘调度算法,重点验证了FCFS、SSTF、SCAN三种算法。实验发现:FCFS按请求顺序调度,寻道效率低;SSTF选择最近磁道访问,效率提升但会出现线程"饥饿"现象;SCAN算法通过双向扫描解决了"饥饿"问题。实验还改进了SCAN算法为单次遍历实现,并设计了CSCAN循环扫描算法。结果表明,不同调度算法在公平性和效率上各有优劣,SCAN类算法在保证公平性的同时具有较好的寻道效率。实验通过实际代码修改和调试,直观展示了各算法的磁头移动轨迹和调

Victoria551的博客 647

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

操作系统实验四:磁盘调度(仿真各种磁盘调度算法)

操作系统实验四:磁盘调度(仿真各种磁盘调度算法)

fufuyfu的博客 3212

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

操作系统实验磁盘调度

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录一、实验目的二、实验要求三、数据结构四、实验过程五、附录六、代码 一、实验目的 磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按

cynicme的博客 656

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

操作系统实验6 磁盘调度模拟

【实验名称】磁盘调度模拟 【实验目的】 1、掌握FCFS、SSTF、SCAN等磁盘调度算法; 2、使用高级语言实现算法,并比较不同算法的优缺点。 【实验原理】 磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设...

一半西瓜的博客 9727

操作系统文件系统与磁盘调度实验解析

参数降低旋转速率时,相同角度的旋转耗时线性增加。但当涉及跨磁道访问时,较慢的旋转可能意外减少总时间(如避免多转一圈),这解释了为什么电梯算法在特定场景下性能更优。当偏斜量>寻道时间×旋转速度时,可避免等待完整旋转周期,实测将。运行这些实验时,无需配置Python环境即可直接测试不同参数组合。参数调整寻道速率时,会出现三种典型情况:寻道时间被旋转吞并、显著减少绕圈次数、以及寻道时间主导总时长。磁盘磁道间距默认为40单位,寻道速度为每单位时间移动1单位距离。同时修改inode和数据位图。仅修改inode位图。

GoldenleafTiger89的博客 919

[操作系統實驗]進程管理器、磁盤調度、內存分配

一、为啥做这么无聊的东西? 某不知名高校计算机学院,操作系统课程实验最终要求完成 进程管理 内存分配 磁盘调度 三个小实验,并制作UI 界面 二、用啥做的? 工具:Visual Stdio 2017 语言:C\C++、 图形化工具:MFC 于是花了两周自学MFC,完成最终如下的内容。 三、长啥样? 1.登陆界面: 2.进程管理界面: ...

The code way of kinnisoy 309

操作系统实验-磁盘调度算法

它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要 求。当有进程在 访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。模拟电梯调度算法(SCAN)及最短寻道时间优先算法(SSTF),对磁盘进行移臂操作,列出 基于该种算法的磁道访问序列,计算平均寻道长度。3.4“磁盘调度”的功能是扫描“请求 I/O”表并根据用户所选算法重新排序,列出基于该种算法 的磁道访问序列,计算平均寻道长度。相应的,呈现的是先减小后增大的特征。

m0_71334725的博客 2772
上一篇: 操作系统实验之处理机调度
下一篇: idea部署项目到远程tomcat——配置本地idea+远程端
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值