当前位置: 首页 > news >正文

【操作系统】磁盘调度

要求:

1、对于如下给定的一组磁盘访问进行调度:

3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。

4、假定当前读写头在90号,向磁道号增加的方向移动。

代码实现:

package package02;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Main {private static final int UPPER_BOUND = 200;//最大值private static final int BUFFER_SIZE = 100;//存储长度private static int currentPosition = 0;//当前位置private static int requestCount = 0;//长度private static int[] requestQueue = new int[BUFFER_SIZE];//存储信息private static int[] processedQueue = new int[BUFFER_SIZE];//生成的数据public static void main(String[] args) {collectInputData();executeFirstComeFirstServed();executeShortestSeekTimeFirst();executeElevatorAlgorithm();}private static void displayResults(String algorithm) {int totalSeekLength = 0;System.out.println("\n=== " + algorithm + " ===");System.out.println("----------------------------------------");System.out.print("访问顺序: ");for (int i = 0; i <= requestCount; i++) {System.out.print(processedQueue[i] + " ");}System.out.print("\n移动距离: ");for (int i = 0, tempPos = currentPosition; i <= requestCount; i++) {int distance = Math.abs(processedQueue[i] - tempPos);System.out.print(distance + " ");totalSeekLength += distance;tempPos = processedQueue[i];}System.out.println("\n总寻道长度: " + totalSeekLength);System.out.printf("平均寻道长度: %.3f\n", (double) totalSeekLength / requestCount);System.out.println("----------------------------------------");}private static void executeFirstComeFirstServed() {		//先来先服务算法processedQueue[0] = currentPosition;System.arraycopy(requestQueue, 0, processedQueue, 1, requestCount);displayResults("FCFS先来先服务算法");}private static void executeShortestSeekTimeFirst() {	//最短寻道时间优先算法boolean[] isProcessed = new boolean[BUFFER_SIZE];processedQueue[0] = currentPosition;for (int i = 1; i <= requestCount; i++) {int selectedIndex = 0;int minDistance = UPPER_BOUND;for (int j = 0; j < requestCount; j++) {int currentDistance = Math.abs(requestQueue[j] - processedQueue[i - 1]);if (currentDistance <= minDistance && !isProcessed[j]) {selectedIndex = j;minDistance = currentDistance;}}processedQueue[i] = requestQueue[selectedIndex];isProcessed[selectedIndex] = true;}displayResults("SSTF最短寻道时间优先算法");}private static void executeElevatorAlgorithm() {		//电梯调度算法int[] sortedRequests = Arrays.copyOf(requestQueue, requestCount);Arrays.sort(sortedRequests);List<Integer> accessSequence = new ArrayList<>();accessSequence.add(currentPosition);for (int req : sortedRequests) {        // 处理高区请求(向磁道号增加方向)if (req >= currentPosition) {accessSequence.add(req);}}for (int i = sortedRequests.length - 1; i >= 0; i--) {        // 处理低区请求(向磁道号减少方向)if (sortedRequests[i] < currentPosition) {accessSequence.add(sortedRequests[i]);}}System.out.println("SCAN电梯调度算法");System.out.println("----------------------------------------");System.out.print("访问顺序: ");accessSequence.forEach(pos -> System.out.print(pos + " "));System.out.print("\n移动距离: 0 ");int totalMovement = 0;for (int i = 1; i < accessSequence.size(); i++) {int distance = Math.abs(accessSequence.get(i) - accessSequence.get(i-1));System.out.print(distance + " ");totalMovement += distance;}System.out.println("\n总寻道长度: " + totalMovement);System.out.printf("平均寻道长度: %.3f\n", (double)totalMovement/requestCount);System.out.println("----------------------------------------");}private static void collectInputData() {Scanner inputScanner = new Scanner(System.in);        System.out.print("请输入请求数量: ");requestCount = inputScanner.nextInt();System.out.print("请输入磁道请求序列(空格分隔): ");for (int i = 0; i < requestCount; i++) {requestQueue[i] = inputScanner.nextInt();}System.out.print("请输入当前磁头位置: ");currentPosition = inputScanner.nextInt();System.out.println();}
}

核心代码流程图:

FCFS算法流程图:

SSTF算法流程图                               

  

电梯算法流程图             

运行结果:

http://www.dtcms.com/a/269804.html

相关文章:

  • hmall学习
  • 2025年模型与机器学习国际会议 (ICMML 2025)
  • BM9 删除链表的倒数第n个节点
  • 计算机网络4层架构怎么理解,分别把协议和对应的层用一些生活的例子形象说明一下
  • MyBatis完全学习指南
  • 算法题练习3-判定链表是否是回文串
  • 【踩坑随笔】PlatformIO导入Arduino项目出现的问题
  • STM32第十八天 ESP8266-01S和电脑实现串口通信
  • HTTP/3.x协议详解:基于QUIC的下一代Web传输协议
  • 小红书APP品牌升级,启用新品牌口号“你的生活兴趣社区”
  • 2025年社会学与安全科学国际会议 (ICSSS 2025)
  • 【AI News | 20250707】每日AI进展
  • C++ dijkstra 最短路径算法
  • c语言学习_函数递归
  • 数学建模:非线性规划:凸规划问题
  • 【AI智能体】智能音视频-基于乐鑫 ESP32 实现音视频通话
  • ICML 2025 | TimeBridge : 巧妙化解非平稳性难题,精准预测长短结合!
  • Redis:高性能内存数据库与缓存利器
  • 验证KANO问题时合适的行为指标(如点击率、转化率等)来匹配问卷目标的一些尝试
  • 【论文翻译】用于大感受野的小波卷积 Wavelet Convolutions for Large Receptive Fields
  • 一天一道Sql题(day01)
  • Java武林:虚拟机之道 第二章:心法传承 - 类加载机制
  • three案例 Three.js波纹效果演示
  • “Jmeter中 xxx.jtl:1:1: Fatal Error! 前言中不允许有内容”的解决办法
  • 开源 SIP 协议栈介绍
  • INNER JOIN, LEFT JOIN, RIGHT JOIN 的区别
  • 字节面试被问到“手机号存储选 Int 还是 String”!
  • 区块链技术促进算力生态发展的具体案例
  • Python 机器学习核心入门与实战进阶 Day 6 - 模型保存与加载(joblib / pickle)
  • 2025年Linux安装MySQL详细教程