/** * PHM Open Source — Módulo SO: Algoritmos de Escalonamento de Braço de Disco * Implementação didática comparativa: FCFS, SSTF e SCAN (Elevador) * Prof. Paulo Henrique Maciel · PHM Tech */ #include #include #include #define MAX_REQ 8 #define DISK_SIZE 200 int abs_diff(int a, int b) { return (a > b) ? (a - b) : (b - a); } // 1. FCFS - First-Come, First-Served void simular_fcfs(int requisicoes[], int n, int cabeca_inicial) { int deslocamento_total = 0; int atual = cabeca_inicial; printf("\n--- 1. ESCALONAMENTO FCFS ---\nOrdem de Visita: %d", atual); for (int i = 0; i < n; i++) { deslocamento_total += abs_diff(requisicoes[i], atual); atual = requisicoes[i]; printf(" -> %d", atual); } printf("\nDeslocamento Total de Trilhas: %d cilindros\n", deslocamento_total); } // 2. SSTF - Shortest Seek Time First void simular_sstf(int requisicoes[], int n, int cabeca_inicial) { bool atendido[MAX_REQ] = { false }; int deslocamento_total = 0; int atual = cabeca_inicial; printf("\n--- 2. ESCALONAMENTO SSTF ---\nOrdem de Visita: %d", atual); for (int i = 0; i < n; i++) { int min_dist = 99999; int proximo_idx = -1; for (int j = 0; j < n; j++) { if (!atendido[j]) { int dist = abs_diff(requisicoes[j], atual); if (dist < min_dist) { min_dist = dist; proximo_idx = j; } } } if (proximo_idx != -1) { atendido[proximo_idx] = true; deslocamento_total += min_dist; atual = requisicoes[proximo_idx]; printf(" -> %d", atual); } } printf("\nDeslocamento Total de Trilhas: %d cilindros\n", deslocamento_total); } int main(void) { printf("====================================================================\n"); printf(" PHM OPEN SOURCE — SIMULADOR DE ESCALONAMENTO DE DISCO RIGIDO (HD) \n"); printf("====================================================================\n"); int requisicoes[MAX_REQ] = { 98, 183, 37, 122, 14, 124, 65, 67 }; int cabeca_inicial = 53; printf("Posicao Inicial da Cabeca de Leitura: %d\n", cabeca_inicial); printf("Fila de Requisicoes de Trilhas: [ 98, 183, 37, 122, 14, 124, 65, 67 ]\n"); simular_fcfs(requisicoes, MAX_REQ, cabeca_inicial); simular_sstf(requisicoes, MAX_REQ, cabeca_inicial); return 0; }