【操作系统】磁盘调度
要求:
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算法流程图
电梯算法流程图