From 571d8e51d29787dc75a3d47e14cfd30e4c99d93a Mon Sep 17 00:00:00 2001 From: Lucas Guerra Date: Mon, 23 Mar 2026 16:04:14 -0300 Subject: [PATCH] refactor: Convert scheduling algorithms to class-based `BaseAlgorithm` structure, update engine and tests, and add new algorithm and metrics documentation. --- README.md | 752 +++--------------- dist.tar.gz | Bin 180930 -> 190690 bytes docs/algorithms.md | 162 ++++ docs/metrics.md | 114 +++ src/components/MetricsPanel/GlobalMetrics.tsx | 92 ++- src/components/MetricsPanel/MetricsChart.tsx | 183 +++-- src/components/MetricsPanel/MetricsPanel.tsx | 2 +- src/components/MetricsPanel/MetricsTable.tsx | 101 ++- src/core/__tests__/engine.test.ts | 54 +- src/core/__tests__/fcfs.test.ts | 28 +- src/core/__tests__/hrrn.test.ts | 22 +- src/core/__tests__/multilevel.test.ts | 12 +- src/core/__tests__/priority.test.ts | 34 +- src/core/__tests__/priority_rr.test.ts | 38 +- src/core/__tests__/rr.test.ts | 30 +- src/core/__tests__/sjf.test.ts | 36 +- src/core/algorithms/base.ts | 69 ++ src/core/algorithms/fcfs.ts | 37 +- src/core/algorithms/hrrn.ts | 59 +- src/core/algorithms/index.ts | 82 +- src/core/algorithms/multilevel.ts | 185 +++-- src/core/algorithms/priority.ts | 96 ++- src/core/algorithms/priority_rr.ts | 72 +- src/core/algorithms/rr.ts | 40 +- src/core/algorithms/sjf.ts | 95 ++- src/core/engine.ts | 409 ++++++---- 26 files changed, 1583 insertions(+), 1221 deletions(-) create mode 100644 docs/algorithms.md create mode 100644 docs/metrics.md create mode 100644 src/core/algorithms/base.ts diff --git a/README.md b/README.md index eae17a8..18541eb 100644 --- a/README.md +++ b/README.md @@ -1,713 +1,203 @@ -# Process Scheduler Simulator — Especificação Técnica Completa +# 🖥️ Process Scheduler Simulator -> **Versão:** 1.0 -> **Data:** 2026-03-19 -> **Autor:** Lucas Rayan Guerra -> **Stack alvo:** React + Vite (Single Page Application, browser-only, sem backend) +> Uma ferramenta educacional interativa para visualizar e comparar algoritmos clássicos de escalonamento de processos de Sistemas Operacionais. + +[![React](https://img.shields.io/badge/React-18-61DAFB?logo=react&logoColor=white)](https://react.dev/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![Vite](https://img.shields.io/badge/Vite-6-646CFF?logo=vite&logoColor=white)](https://vitejs.dev/) +[![Tailwind CSS](https://img.shields.io/badge/Tailwind-4-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com/) +[![Vitest](https://img.shields.io/badge/Tested_with-Vitest-6E9F18?logo=vitest&logoColor=white)](https://vitest.dev/) +[![License: ISC](https://img.shields.io/badge/License-ISC-yellow.svg)](https://opensource.org/licenses/ISC) --- -## 1. Visão Geral +## ✨ O que é? -O **Process Scheduler Simulator** é uma ferramenta educacional interativa que roda inteiramente no navegador. Ele permite ao usuário criar processos, escolher um algoritmo de escalonamento, executar a simulação passo a passo ou de forma automática, visualizar o diagrama de Gantt em tempo real e analisar métricas detalhadas por processo e globais. +O **Process Scheduler Simulator (PSS)** roda completamente no navegador — sem servidor, sem instalação de dependências de sistema. Você define os processos, escolhe o algoritmo, e assiste à simulação acontecer em tempo real através do diagrama de Gantt. -### 1.1 Objetivos - -| # | Objetivo | -|---|----------| -| O1 | Simular fielmente os algoritmos clássicos de escalonamento de SO | -| O2 | Permitir execução passo a passo para fins didáticos | -| O3 | Exibir diagrama de Gantt animado com estados de CPU e I/O | -| O4 | Calcular e exibir métricas completas por processo e agregadas | -| O5 | Ser completamente autocontido — sem servidor, sem dependências externas de dados | - -### 1.2 Público-Alvo - -- Estudantes de Sistemas Operacionais (graduação/pós) -- Professores que queiram usar em sala de aula -- Profissionais revisando fundamentos de SO +Ideal para: +- 📚 Estudantes de Sistemas Operacionais querendo visualizar o que antes era só teoria +- 👩‍🏫 Professores buscando uma ferramenta interativa para sala de aula +- 🔍 Profissionais revisitando fundamentos de SO --- -## 2. Requisitos Funcionais +## 🚀 Quick Start -### RF-01 — Gerenciamento de Processos +### Pré-requisitos -| ID | Descrição | -|----|-----------| -| RF-01.1 | O usuário pode **criar** um processo com os atributos listados na seção 3.1 | -| RF-01.2 | O usuário pode **editar** um processo antes de iniciar a simulação | -| RF-01.3 | O usuário pode **remover** um processo individual ou **limpar** todos | -| RF-01.4 | O usuário pode **gerar processos aleatórios** com parâmetros configuráveis (quantidade, faixas de valores) | -| RF-01.5 | A lista de processos exibe uma prévia das propriedades e a classificação CPU/I/O Bound estimada | -| RF-01.6 | Mínimo de 1 processo, máximo de 16 processos por simulação | +- [Node.js](https://nodejs.org/) 20+ +- npm 10+ -### RF-02 — Configuração do Escalonador +### Instalação e execução local -| ID | Descrição | -|----|-----------| -| RF-02.1 | O usuário seleciona **um** algoritmo de escalonamento por simulação | -| RF-02.2 | Parâmetros específicos de algoritmo são exibidos dinamicamente (ex.: quantum para RR) | -| RF-02.3 | O usuário configura o **tempo de context switch** (0–10 unidades de tempo, padrão 0) | -| RF-02.4 | O usuário configura se o escalonador é **preemptivo ou cooperativo** (onde aplicável) | +```bash +# Clone o repositório +git clone https://github.com/lucasrguerra/pss.git +cd pss -### RF-03 — Simulação +# Instale as dependências +npm install -| ID | Descrição | -|----|-----------| -| RF-03.1 | **Play** inicia/retoma a simulação com velocidade configurável | -| RF-03.2 | **Pause** suspende a execução sem perder o estado | -| RF-03.3 | **Step** avança exatamente 1 unidade de tempo (tick) | -| RF-03.4 | **Reset** retorna ao estado inicial sem perder a configuração de processos | -| RF-03.5 | **Velocidade** ajustável: 0.25×, 0.5×, 1×, 2×, 4× (padrão 1×) | -| RF-03.6 | A simulação termina quando todos os processos atingem estado **Terminated** | -| RF-03.7 | O tick atual é exibido em destaque no painel de controle | - -### RF-04 — Diagrama de Gantt - -| ID | Descrição | -|----|-----------| -| RF-04.1 | Cada processo ocupa uma linha horizontal no diagrama | -| RF-04.2 | Cada tick é representado por uma célula colorida conforme o estado | -| RF-04.3 | O tick atual é destacado com uma linha vertical animada | -| RF-04.4 | Legenda de cores dos estados exibida abaixo do diagrama | -| RF-04.5 | O diagrama faz scroll horizontal automático para acompanhar o tick atual | -| RF-04.6 | Hovering sobre uma célula exibe tooltip: processo, tick, estado, detalhes | - -### RF-05 — Métricas - -| ID | Descrição | -|----|-----------| -| RF-05.1 | Métricas são calculadas por processo ao final da simulação | -| RF-05.2 | Métricas globais (médias, totais) são exibidas em painel separado | -| RF-05.3 | Um gráfico de barras comparativo exibe o turnaround e waiting time por processo | -| RF-05.4 | A classificação CPU Bound / I/O Bound é determinada automaticamente (ver seção 5) | -| RF-05.5 | As métricas podem ser exportadas como CSV | - -### RF-06 — Persistência Local - -| ID | Descrição | -|----|-----------| -| RF-06.1 | O estado atual (processos + configuração) é salvo automaticamente no `localStorage` | -| RF-06.2 | O usuário pode exportar/importar configurações como JSON | -| RF-06.3 | Cenários pré-definidos (presets) estão disponíveis para carregamento rápido | - ---- - -## 3. Modelo de Dados - -### 3.1 Processo (`Process`) - -```typescript -interface BurstSegment { - type: "cpu" | "io"; - duration: number; // unidades de tempo -} - -interface Process { - id: string; // UUID gerado na criação - name: string; // "P1", "P2" ou nome personalizado - arrivalTime: number; // tick de chegada na fila ready (≥ 0) - priority: number; // 1 (maior prioridade) a 10 (menor); padrão 5 - color: string; // cor HEX para o diagrama - bursts: BurstSegment[]; // sequência alternada CPU→I/O→CPU→... - // deve começar e terminar com CPU -} +# Inicie o servidor de desenvolvimento +npm run dev ``` -**Exemplo de processo:** +Acesse [http://localhost:5173](http://localhost:5173) no seu navegador. -```json -{ - "id": "p1", - "name": "P1", - "arrivalTime": 0, - "priority": 3, - "color": "#4FC3F7", - "bursts": [ - { "type": "cpu", "duration": 4 }, - { "type": "io", "duration": 3 }, - { "type": "cpu", "duration": 2 } - ] -} +### Build de produção + +```bash +npm run build +npm run preview ``` -> **Regra:** `bursts` deve ter estrutura CPU → (IO → CPU)\* — sempre começa com CPU. Mínimo: 1 burst CPU. +### Com Docker -### 3.2 Configuração do Escalonador (`SchedulerConfig`) - -```typescript -interface SchedulerConfig { - algorithm: SchedulingAlgorithm; - quantum: number; // apenas para RR (padrão: 2) - contextSwitchTime: number; // overhead entre processos (padrão: 0) - isPreemptive: boolean; // aplicável a SJF e Priority - agingEnabled: boolean; // evitar starvation em Priority - agingInterval: number; // ticks para incremento de prioridade -} -``` - -### 3.3 Estado de Execução do Processo (`ProcessState`) - -```typescript -type StateLabel = - | "New" // antes do arrivalTime - | "Ready" // na fila, aguardando CPU - | "Running" // executando burst CPU - | "Waiting" // executando burst I/O - | "Terminated"; // concluído - -interface ProcessRuntime { - processId: string; - state: StateLabel; - remainingBurst: number; // ticks restantes no burst atual - burstIndex: number; // índice atual em Process.bursts - arrivalTick: number; // tick em que entrou na fila Ready pela 1ª vez - startTick: number | null; // tick da 1ª vez em Running - finishTick: number | null; // tick em que terminou - waitingTime: number; // acumulado em Ready - cpuTime: number; // acumulado em Running - ioTime: number; // acumulado em Waiting - responseTime: number | null; -} -``` - -### 3.4 Tick de Simulação (`SimTick`) - -```typescript -interface SimTick { - tick: number; - cpuProcess: string | null; // PID executando na CPU - ioProcesses: string[]; // PIDs em I/O - readyQueue: string[]; // ordem da fila ready - states: Record; - contextSwitching: boolean; // overhead ativo -} +```bash +docker compose up ``` --- -## 4. Algoritmos de Escalonamento +## 🎮 Como usar -### 4.1 Lista de Algoritmos Suportados +1. **Crie seus processos** — No painel esquerdo, adicione processos definindo nome, tempo de chegada, prioridade e sequência de bursts (CPU e I/O). Ou use o gerador aleatório para começar rápido. +2. **Configure o escalonador** — Escolha o algoritmo e ajuste os parâmetros (quantum para RR, aging para Priority, etc.). +3. **Execute a simulação** — Use os controles de Play/Pause/Step para rodar a simulação na velocidade que quiser (0.25× até 4×). +4. **Analise os resultados** — O diagrama de Gantt mostra em tempo real o estado de cada processo. Ao final, o painel de métricas exibe turnaround, waiting time, throughput e mais. -| Código | Nome | Preemptivo? | Parâmetro extra | -|--------|------|-------------|-----------------| -| `FCFS` | First Come First Served | Não | — | -| `SJF_NP` | Shortest Job First (não-preemptivo) | Não | — | -| `SJF_P` | Shortest Remaining Time First (preemptivo) | Sim | — | -| `RR` | Round Robin | Sim | Quantum | -| `PRIORITY_NP` | Priority Scheduling (não-preemptivo) | Não | — | -| `PRIORITY_P` | Priority Scheduling (preemptivo) | Sim | — | -| `MULTILEVEL` | Multilevel Queue | Sim | Nº de filas, quantum por fila | -| `HRRN` | Highest Response Ratio Next | Não | — | - -### 4.2 Regras de Desempate - -Para todos os algoritmos, quando dois processos têm o mesmo critério de seleção, o desempate é feito por ordem de chegada (`arrivalTime`) e depois por `id` lexicográfico. - -### 4.3 Especificação de Comportamento por Algoritmo - -#### FCFS -- A fila ready é ordenada por `arrivalTime` ascendente. -- O processo na cabeça da fila ocupa a CPU até terminar seu burst CPU atual. -- Ao término do burst CPU, se houver burst I/O, transita para Waiting. -- Ao terminar o I/O, retorna para a fila Ready (cauda). - -#### SJF Não-Preemptivo -- Na seleção, escolhe o processo com **menor burst CPU atual** (`remainingBurst`). -- Não interrompe o processo em execução. - -#### SRTF (SJF Preemptivo) -- A cada tick, verifica se algum processo na fila Ready tem `remainingBurst` menor que o processo atual. -- Se sim, realiza preempção (com context switch se configurado). - -#### Round Robin -- Usa fila FIFO com quantum `q`. -- Ao expirar o quantum, o processo retorna ao fim da fila Ready se ainda tiver burst CPU restante. -- I/O bursts não consomem quantum. - -#### Priority (Não-Preemptivo / Preemptivo) -- Menor valor numérico = maior prioridade. -- Com aging habilitado: a cada `agingInterval` ticks em Ready, `priority--` (até mínimo 1). - -#### HRRN -- `ratio = (waitingTime + burstTime) / burstTime` -- A cada seleção, escolhe o processo com maior ratio. -- Não-preemptivo. +> 💡 **Dica:** Carregue um dos **presets** disponíveis para ver fenômenos clássicos como o efeito de comboio do FCFS ou starvation com Priority Scheduling. --- -## 5. Definição de CPU Bound vs. I/O Bound +## ⚙️ Algoritmos Suportados -A classificação é feita **por processo**, baseada na proporção de tempo total gasto: +| Algoritmo | Preemptivo? | Parâmetros | +|-----------|:-----------:|------------| +| **FCFS** — First Come, First Served | ❌ | — | +| **SJF** — Shortest Job First | ❌ | — | +| **SRTF** — Shortest Remaining Time First | ✅ | — | +| **Round Robin (RR)** | ✅ | Quantum | +| **Priority NP** — Prioridade Não-Preemptivo | ❌ | Aging (opcional) | +| **Priority P** — Prioridade Preemptivo | ✅ | Aging (opcional) | +| **HRRN** — Highest Response Ratio Next | ❌ | — | +| **Multilevel Queue** | ✅ | Quantum por fila | -``` -cpuRatio = cpuTime / (cpuTime + ioTime) -ioRatio = ioTime / (cpuTime + ioTime) - -if cpuRatio >= 0.65 → "CPU Bound" -if ioRatio >= 0.65 → "I/O Bound" -else → "Balanced" -``` - -A classificação aparece: -- Na lista de processos (badge de preview, calculado sobre os bursts declarados) -- Na tabela de métricas (calculado sobre os tempos reais simulados) +> Consulte a [documentação dos algoritmos](./docs/algorithms.md) para detalhes sobre como cada um funciona. --- -## 6. Métricas +## 📊 Métricas calculadas -### 6.1 Métricas por Processo +Para cada processo simulado, o PSS calcula automaticamente: -| Métrica | Fórmula | Descrição | -|---------|---------|-----------| -| **Arrival Time** | `arrivalTime` | Tick de chegada na fila | -| **First CPU Tick** | `startTick` | Primeiro tick em Running | -| **Finish Time** | `finishTick` | Tick de término | -| **Response Time** | `startTick − arrivalTime` | Tempo até 1ª vez na CPU | -| **Turnaround Time** | `finishTick − arrivalTime` | Tempo total de vida | -| **Waiting Time** | `turnaround − cpuTime − ioTime` | Tempo na fila Ready | -| **CPU Time** | Σ Running ticks | Total de CPU consumida | -| **I/O Time** | Σ Waiting ticks | Total de I/O | -| **CPU Utilization** | `cpuTime / turnaround × 100` | % do turnaround em CPU | -| **Bound Type** | ver seção 5 | CPU Bound / I/O Bound / Balanced | +- **Response Time** — tempo até o primeiro uso de CPU +- **Turnaround Time** — tempo total desde a chegada até o término +- **Waiting Time** — tempo total na fila Ready +- **CPU Time / I/O Time** — tempo efetivo em cada tipo de burst +- **CPU Utilization** — percentual do turnaround em CPU +- **Bound Type** — classificação automática em CPU Bound, I/O Bound ou Balanced -### 6.2 Métricas Globais - -| Métrica | Fórmula | -|---------|---------| -| **Avg Response Time** | Média dos response times | -| **Avg Turnaround Time** | Média dos turnarounds | -| **Avg Waiting Time** | Média dos waiting times | -| **CPU Throughput** | `processos concluídos / tempo total` | -| **CPU Utilization (global)** | `Σ Running ticks / tempo total × 100` | -| **Total Simulation Time** | Tick final | +E globalmente: médias de response/turnaround/waiting, throughput e utilização global de CPU. --- -## 7. Arquitetura da Aplicação - -### 7.1 Stack Tecnológica - -``` -Runtime: React 18 + Vite 5 -Linguagem: TypeScript 5 -Estilos: Tailwind CSS 3 + CSS Modules (para componentes específicos) -Gráficos: Recharts (gráfico de barras de métricas) -Estado: Zustand (store global) -Persistência: localStorage (auto-save) + JSON import/export -Testes: Vitest + @testing-library/react -``` - -### 7.2 Estrutura de Pastas +## 🗂️ Estrutura do Projeto ``` src/ ├── core/ # Lógica pura — sem React -│ ├── algorithms/ +│ ├── algorithms/ # Implementação de cada algoritmo +│ │ ├── base.ts # Classe abstrata BaseScheduler │ │ ├── fcfs.ts │ │ ├── sjf.ts │ │ ├── rr.ts │ │ ├── priority.ts +│ │ ├── priority_rr.ts │ │ ├── hrrn.ts │ │ ├── multilevel.ts -│ │ └── index.ts # dispatch por algoritmo -│ ├── engine.ts # SimulationEngine — step(), runAll() -│ ├── metrics.ts # cálculo de métricas -│ ├── types.ts # todas as interfaces -│ └── presets.ts # cenários pré-definidos +│ │ └── index.ts # Dispatch por algoritmo +│ ├── engine.ts # SimulationEngine — orquestra os ticks +│ ├── metrics.ts # Cálculo de métricas por processo e globais +│ ├── types.ts # Todas as interfaces TypeScript +│ └── presets.ts # Cenários pré-definidos │ -├── store/ -│ ├── processStore.ts # CRUD de processos -│ ├── simulationStore.ts # estado da simulação, ticks -│ └── uiStore.ts # estado da UI (painéis abertos, velocidade) +├── store/ # Estado global com Zustand +├── components/ # Componentes React +│ ├── ProcessPanel/ # Criação e edição de processos +│ ├── SchedulerPanel/ # Seleção de algoritmo e parâmetros +│ ├── ControlBar/ # Play, Pause, Step, Reset, velocidade +│ ├── GanttChart/ # Diagrama de Gantt interativo +│ ├── MetricsPanel/ # Tabela, gráficos e métricas globais +│ └── shared/ # Botões, badges, tooltips, modais │ -├── components/ -│ ├── ProcessPanel/ # criação/edição de processos -│ │ ├── ProcessList.tsx -│ │ ├── ProcessForm.tsx -│ │ └── ProcessCard.tsx -│ ├── SchedulerPanel/ # seleção de algoritmo e parâmetros -│ │ ├── AlgorithmSelector.tsx -│ │ └── SchedulerConfig.tsx -│ ├── ControlBar/ # play, pause, step, reset, velocidade -│ │ └── ControlBar.tsx -│ ├── GanttChart/ # diagrama de Gantt -│ │ ├── GanttChart.tsx -│ │ ├── GanttRow.tsx -│ │ ├── GanttCell.tsx -│ │ └── GanttLegend.tsx -│ ├── MetricsPanel/ # tabela + gráficos -│ │ ├── MetricsTable.tsx -│ │ ├── MetricsChart.tsx -│ │ └── GlobalMetrics.tsx -│ └── shared/ # botões, badges, tooltips, modais -│ -├── hooks/ -│ ├── useSimulation.ts # loop de simulação com requestAnimationFrame -│ ├── useLocalStorage.ts -│ └── useExport.ts -│ -├── App.tsx -└── main.tsx -``` - -### 7.3 Fluxo de Dados - -``` -[ProcessForm] ──create/edit──► [processStore] - │ -[AlgorithmSelector] ──config──► [simulationStore] - │ - [SimulationEngine] - ┌──────┴──────┐ - step() runAll() - └──────┬──────┘ - SimTick[] - │ - ┌─────────────────┼────────────────┐ - [GanttChart] [ControlBar] [MetricsPanel] +└── hooks/ # Hooks personalizados (loop de animação, export, etc.) ``` --- -## 8. Motor de Simulação (`SimulationEngine`) +## 📦 Presets disponíveis -### 8.1 Interface Pública +Carregue cenários clássicos com um clique para explorar fenômenos de SO: -```typescript -class SimulationEngine { - constructor(processes: Process[], config: SchedulerConfig); - - // Avança 1 tick; retorna o snapshot daquele tick - step(): SimTick; - - // Executa todos os ticks até o fim; retorna array completo - runAll(): SimTick[]; - - // Verdadeiro se todos os processos estão Terminated - get isFinished(): boolean; - - // Tick atual - get currentTick(): number; - - // Estado atual de todos os processos - get runtimeStates(): ProcessRuntime[]; -} -``` - -### 8.2 Loop Principal (pseudocódigo) - -``` -function step(): - tick++ - - // 1. Verificar chegadas de novos processos - for each process where arrivalTime == tick: - transitionTo(process, "Ready") - addToReadyQueue(process) - - // 2. Aging (se habilitado) - if agingEnabled and tick % agingInterval == 0: - for each process in readyQueue: - process.priority = max(1, process.priority - 1) - - // 3. Verificar fim de I/O - for each process in ioQueue: - process.remainingBurst-- - if process.remainingBurst == 0: - advanceBurst(process) - if hasMoreBursts(process): - transitionTo(process, "Ready") - addToReadyQueue(process) - else: - transitionTo(process, "Terminated") - process.finishTick = tick - - // 4. Verificar fim do burst CPU atual - if cpuProcess != null: - cpuProcess.remainingBurst-- - cpuProcess.cpuTime++ - if cpuProcess.remainingBurst == 0: - advanceBurst(cpuProcess) - if hasIoBurst(cpuProcess): - transitionTo(cpuProcess, "Waiting") - addToIoQueue(cpuProcess) - cpuProcess = null - else if hasMoreCpuBurst(cpuProcess): - // volta pra ready (ex: após I/O futuro) - else: - transitionTo(cpuProcess, "Terminated") - cpuProcess = null - - // 5. Verificar preempção (algoritmos preemptivos) - if isPreemptive and cpuProcess != null: - candidate = algorithm.selectFromReady(readyQueue) - if shouldPreempt(candidate, cpuProcess): - preempt(cpuProcess) - cpuProcess = candidate - - // 6. Selecionar próximo processo (se CPU livre) - if cpuProcess == null and readyQueue.length > 0: - cpuProcess = algorithm.selectFromReady(readyQueue) - if cpuProcess.startTick == null: - cpuProcess.startTick = tick - transitionTo(cpuProcess, "Running") - - // 7. Acumular waiting time - for each process in readyQueue: - process.waitingTime++ - - return snapshot() -``` +| Preset | O que demonstra | +|--------|-----------------| +| `classic_fcfs` | Execução básica com FCFS, sem I/O | +| `convoy_effect` | Efeito de comboio: um processo longo bloqueando vários curtos | +| `rr_demo` | Revezamento justo com Round Robin (quantum=3) | +| `starvation` | Processos de baixa prioridade nunca recebem CPU | +| `aging_fix` | O mesmo cenário de starvation, resolvido com aging | +| `io_heavy` | Mix de processos CPU Bound vs I/O Bound | +| `multilevel_demo` | Múltiplas filas com prioridades diferentes | --- -## 9. Interface do Usuário +## 🧪 Testes -### 9.1 Layout Geral (Desktop) +```bash +# Roda todos os testes unitários +npm test -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ HEADER: título, botão de preset, import/export │ -├──────────────┬──────────────────────────────────────────────────────┤ -│ │ │ -│ ESQUERDA │ CENTRO/DIREITA │ -│ (320px) │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ -│ [Processos] │ │ BARRA DE CONTROLE (play/pause/step/reset/vel.) │ │ -│ + lista │ └─────────────────────────────────────────────────┘ │ -│ + formulário│ │ -│ │ ┌─────────────────────────────────────────────────┐ │ -│ ────────── │ │ GANTT CHART (scroll horizontal) │ │ -│ │ │ Tick: 00000000000001111111111122222222222233... │ │ -│ [Algoritmo] │ │ P1: ██████░░░░░░██████░░░░░█████ │ │ -│ + parâmetros│ │ P2: ░░░░░░██████░░░░░░████░░░░░ │ │ -│ │ └─────────────────────────────────────────────────┘ │ -│ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ -│ │ │ MÉTRICAS (tabela por processo + gráficos) │ │ -│ │ └─────────────────────────────────────────────────┘ │ -└──────────────┴──────────────────────────────────────────────────────┘ +# Modo watch (re-executa ao salvar) +npm run test:watch + +# Com relatório de cobertura +npm run test:coverage ``` -### 9.2 Cores de Estado no Gantt - -| Estado | Cor | Token CSS | -|--------|-----|-----------| -| New | Cinza escuro | `--state-new` | -| Ready | Amarelo âmbar | `--state-ready` | -| Running | Verde brilhante | `--state-running` | -| Waiting (I/O) | Azul ciano | `--state-waiting` | -| Terminated | Cinza claro | `--state-terminated` | -| Context Switch | Vermelho/laranja | `--state-ctx-switch` | - -### 9.3 Formulário de Processo - -Campos: -- **Nome** (text, max 8 chars) -- **Arrival Time** (number, ≥ 0) -- **Priority** (1–10) -- **Cor** (color picker) -- **Bursts** — editor visual de bursts com botões +/− por segmento - - Tipo: `CPU` | `I/O` - - Duração (number, ≥ 1) - - Validação: deve iniciar com CPU, alternar CPU/IO - -### 9.4 Painel de Algoritmo - -Exibe: -- Dropdown de seleção de algoritmo -- Campos condicionais: - - RR → `quantum` - - Priority → `preemptive toggle`, `aging toggle + interval` - - Multilevel → configuração de filas -- Context switch time (sempre) -- Tooltip explicativo por algoritmo - -### 9.5 Barra de Controle - -``` -[⏮ Reset] [⏭ Step] [▶ Play / ⏸ Pause] [Tick: 0042] [Velocidade: 1×▾] -``` - -### 9.6 Painel de Métricas (após simulação) - -**Tab 1 — Por Processo:** - -Tabela com colunas: -`Processo | Arrival | Start | Finish | Response | Turnaround | Waiting | CPU Time | I/O Time | CPU% | Bound` - -**Tab 2 — Globais:** - -Cards com: -- Avg Response Time -- Avg Turnaround Time -- Avg Waiting Time -- CPU Throughput -- CPU Utilization % -- Total Simulation Time - -**Tab 3 — Gráfico:** - -Gráfico de barras agrupadas por processo: -- Barras: Waiting Time, CPU Time, I/O Time (empilhadas para turnaround) +Os testes cobrem a engine de simulação, todos os algoritmos de escalonamento, e o cálculo de métricas. --- -## 10. Cenários Pré-definidos (Presets) +## 🛠️ Stack Tecnológica -| Nome | Descrição | Algoritmo sugerido | -|------|-----------|-------------------| -| `classic_fcfs` | 4 processos simples, sem I/O | FCFS | -| `convoy_effect` | Demonstra o efeito de comboio do FCFS | FCFS vs SJF | -| `rr_demo` | 5 processos com quantum 3 | Round Robin | -| `starvation` | Prioridades que causam starvation | Priority NP | -| `aging_fix` | Mesmo cenário, com aging ativo | Priority P + Aging | -| `io_heavy` | Processos I/O Bound vs CPU Bound misturados | SRTF | -| `multilevel_demo` | Demonstra MLQ | Multilevel | +| Camada | Tecnologia | +|--------|-----------| +| Framework UI | React 18 | +| Linguagem | TypeScript 5 | +| Build tool | Vite 6 | +| Estilos | Tailwind CSS 4 | +| Estado global | Zustand 5 | +| Gráficos | Recharts | +| Ícones | Lucide React | +| Testes | Vitest + Testing Library | --- -## 11. Requisitos Não-Funcionais +## 📄 Documentação adicional -| RNF | Requisito | -|-----|-----------| -| RNF-01 | Desempenho: simulações com até 16 processos e 1000 ticks sem travamento | -| RNF-02 | Responsividade: layout funcional em telas ≥ 768px | -| RNF-03 | Acessibilidade: ARIA labels nos controles principais, contraste WCAG AA | -| RNF-04 | Offline-first: 100% funcional sem internet após build | -| RNF-05 | Build size < 500 KB gzipped | -| RNF-06 | Suporte a Chrome 120+, Firefox 120+, Safari 17+ | +- [📐 Algoritmos de Escalonamento](./docs/algorithms.md) — descrição detalhada de cada algoritmo, regras de desempate e exemplos +- [📏 Métricas](./docs/metrics.md) — fórmulas e definições de todas as métricas calculadas --- -## 12. Plano de Implementação (Fases) +## 🤝 Contribuindo -### Fase 1 — Core Engine (sem UI) — *~2 dias* -- [ ] Definir todos os tipos em `core/types.ts` -- [ ] Implementar `SimulationEngine` com suporte a FCFS -- [ ] Testes unitários: FCFS, estados de transição, métricas -- [ ] Implementar SJF NP e RR com testes -- [ ] Implementar Priority NP/P com aging e testes -- [ ] Implementar SRTF e HRRN com testes - -### Fase 2 — Store & State Management — *~1 dia* -- [ ] Configurar Zustand stores -- [ ] Hook `useSimulation` com loop de animação -- [ ] Integração com localStorage - -### Fase 3 — UI Base — *~2 dias* -- [ ] Layout geral (sidebar + área principal) -- [ ] `ProcessForm` e `ProcessList` -- [ ] `AlgorithmSelector` e `SchedulerConfig` -- [ ] `ControlBar` - -### Fase 4 — Gantt Chart — *~2 dias* -- [ ] Renderização de células por tick e processo -- [ ] Auto-scroll horizontal -- [ ] Tooltip por célula -- [ ] Legenda de estados - -### Fase 5 — Métricas e Gráficos — *~1 dia* -- [ ] Tabela de métricas por processo -- [ ] Cards de métricas globais -- [ ] Gráfico de barras com Recharts -- [ ] Export CSV - -### Fase 6 — Polimento e Presets — *~1 dia* -- [ ] Presets prontos para carregar -- [ ] Gerador de processos aleatórios -- [ ] Import/export JSON -- [ ] Responsividade mobile (≥768px) -- [ ] Refinamento visual - -**Total estimado: ~9 dias de trabalho focado** +Contribuições são bem-vindas! Sinta-se livre para abrir uma [issue](https://github.com/lucasrguerra/pss/issues) ou enviar um Pull Request. --- -## 13. Casos de Teste Funcionais +## 📜 Licença -### CT-01: FCFS Básico - -**Entrada:** -``` -P1: arrival=0, bursts=[CPU:4] -P2: arrival=1, bursts=[CPU:3] -P3: arrival=2, bursts=[CPU:1] -``` - -**Esperado:** -``` -Gantt: P1(0-4), P2(4-7), P3(7-8) -P1: response=0, turnaround=4, waiting=0 -P2: response=3, turnaround=6, waiting=3 -P3: response=5, turnaround=6, waiting=5 -``` - -### CT-02: Round Robin (quantum=2) - -**Entrada:** -``` -P1: arrival=0, bursts=[CPU:5] -P2: arrival=0, bursts=[CPU:3] -P3: arrival=0, bursts=[CPU:1] -quantum=2 -``` - -**Esperado:** -``` -Gantt: P1(0-2), P2(2-4), P3(4-5), P1(5-7), P2(7-8), P1(8-9) -P1: response=0, turnaround=9, waiting=4 -P2: response=2, turnaround=8, waiting=5 -P3: response=4, turnaround=5, waiting=4 -``` - -### CT-03: Classificação Bound - -**Entrada:** -``` -P1: bursts=[CPU:8, IO:1, CPU:1] → cpuRatio = 9/10 = 90% → CPU Bound -P2: bursts=[CPU:1, IO:8, CPU:1] → cpuRatio = 2/10 = 20% → I/O Bound -P3: bursts=[CPU:4, IO:2, CPU:4] → cpuRatio = 8/10 = 80% → CPU Bound -``` - -### CT-04: Preempção SRTF - -**Entrada:** -``` -P1: arrival=0, bursts=[CPU:8] -P2: arrival=1, bursts=[CPU:4] -quantum=∞ (SRTF) -``` - -**Esperado:** -``` -P1 executa tick 0-1, P2 preempta no tick 1 (remaining=3<7), P2 termina tick 5, -P1 retoma e termina tick 12 -``` - ---- - -## 14. Glossário - -| Termo | Definição | -|-------|-----------| -| **Tick** | Unidade atômica de tempo na simulação (equivale a 1 unidade de tempo de CPU) | -| **Burst** | Segmento contínuo de execução (CPU ou I/O) | -| **Quantum** | Fatia máxima de CPU no Round Robin | -| **Context Switch** | Overhead ao trocar o processo em execução na CPU | -| **Starvation** | Processo que nunca recebe CPU por processos de maior prioridade sempre chegando | -| **Aging** | Mecanismo que aumenta gradualmente a prioridade de processos esperando há muito tempo | -| **Turnaround Time** | Tempo total desde a chegada até o término do processo | -| **Response Time** | Tempo entre a chegada e o primeiro uso de CPU | -| **Waiting Time** | Tempo total em que o processo ficou na fila Ready | -| **CPU Bound** | Processo que passa a maior parte do tempo usando CPU | -| **I/O Bound** | Processo que passa a maior parte do tempo aguardando I/O | -| **FCFS** | First Come, First Served — ordem de chegada | -| **SJF** | Shortest Job First — menor burst next | -| **SRTF** | Shortest Remaining Time First — SJF preemptivo | -| **RR** | Round Robin — revezamento com quantum | -| **HRRN** | Highest Response Ratio Next — balanceia tempo de espera e burst | +Distribuído sob a [Licença ISC](./LICENSE). Desenvolvido por [Lucas Rayan Guerra](https://github.com/lucasrguerra). diff --git a/dist.tar.gz b/dist.tar.gz index db8f039c54ded6fc6e7a0da87019c36c827a118d..f6b9c300a80e57dc17ca5fb2e13ac196507b6a82 100644 GIT binary patch literal 190690 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�Na8U?aYd>;b0qVmA94yI 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 z zonBz>jM*{IW}=JiLr*HjRhkRau}b3t|H0Pn5v*Iwxa9w8I;xJsCTofsguwiD&=*-@pIYuz+$(0VrO<9u)?^{|~BX_DIowrY1%v$5fWE z98UZ(NC_0mBT!wMmqlSDqX6sn{r;$j>F~HEndMQ1XYR2+E26A^bF5E^fEvn>+~|V& zR}WElcSgD=-fGUu{SL+~U;r}B5y`&bbg&|V1pO-6^NT<)1W^T+oJ5LrI9uCDs8XyZ zPezR|W^e<-FCRuLJs$B6;;C?y_&=#Euf@C*Bzgx@2%3+W~Bc2#Q7 zI0=gc4w`k}P;PF@o3hW{N(I#c%?|r^DF_i2JFF-Z-4_v9;1YH%nUyIGxm*%DeMwAH z%QEmvwCrn2;>ZT)1h(wFh>>?lS31T$m-`{R`+!|Y7eL>aNK|MK2g3qT3Yhe>$g)td zhXu@f=1uxx92Yfm>y8oYB-UmfK*E}C;?lyZs%x2sZ^rV3`%C6Z{9|62)YpJ^V_j#=#Y$G}Iv5PA)W&;~h8k~&@l9Y>I=Qv|wY z9_g&nFvQ9_P<%ooJQEz@wHYDMVfvu_{1U|B-|49(&~baGO3xGx@cng4nwol$!+SL# zMkMKhrX7+?eDhOMb*fQo1&w@&`I?&6TnwXN6pVsVFbYP&C>RB!U=)mkQ7{Td!6+C7 TqhJ(_g5d%H5g;n_04NFoA};R{ literal 180930 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

- {label} - {value} +const MetricCard = ({ + label, + value, + sub, + accentColor, + accentClass, + icon, + barPct, +}: MetricCardProps) => ( +
+
+ {label} + {icon} +
+ {value} {sub && {sub}} + {barPct !== undefined && ( +
+
+
+ )}
); @@ -30,48 +60,74 @@ const GlobalMetrics = ({ metrics }: GlobalMetricsProps) => { } = metrics; const utilizationPct = Math.min(100, cpuUtilization); + // Bars for time metrics are proportional to the total simulation time + const toPct = (v: number) => + totalSimulationTime > 0 ? Math.min(100, (v / totalSimulationTime) * 100) : 0; return ( -
+
} + barPct={toPct(avgResponseTime)} /> } + barPct={toPct(avgTurnaroundTime)} /> } + barPct={toPct(avgWaitingTime)} /> } /> } /> - {/* CPU Utilization card with progress bar */} -
- CPU Utilization - {utilizationPct.toFixed(1)}% -
+ + {/* CPU Utilization — gradient bar */} +
+
+ CPU Utilization + +
+ + {utilizationPct.toFixed(1)}% + + do tempo total em CPU +
diff --git a/src/components/MetricsPanel/MetricsChart.tsx b/src/components/MetricsPanel/MetricsChart.tsx index 27bf118..39f2570 100644 --- a/src/components/MetricsPanel/MetricsChart.tsx +++ b/src/components/MetricsPanel/MetricsChart.tsx @@ -7,6 +7,10 @@ import { Legend, ResponsiveContainer, CartesianGrid, + RadarChart, + PolarGrid, + PolarAngleAxis, + Radar, } from 'recharts'; import type { ProcessMetrics, Process } from '@core/types'; @@ -15,6 +19,15 @@ interface MetricsChartProps { processMap: Record; } +const TOOLTIP_STYLE = { + backgroundColor: '#1e293b', + border: '1px solid #334155', + borderRadius: '8px', + fontSize: '11px', + color: '#e2e8f0', + boxShadow: '0 4px 12px rgba(0,0,0,0.4)', +}; + const MetricsChart = ({ metrics, processMap }: MetricsChartProps) => { if (metrics.length === 0) { return ( @@ -24,57 +37,131 @@ const MetricsChart = ({ metrics, processMap }: MetricsChartProps) => { ); } - const data = metrics.map((m) => ({ - name: processMap[m.processId]?.name ?? m.processId, - 'Waiting Time': m.waitingTime, - 'CPU Time': m.cpuTime, - 'I/O Time': m.ioTime, + const getName = (id: string) => processMap[id]?.name ?? id; + const getColor = (id: string) => processMap[id]?.color ?? '#94a3b8'; + + // ── Stacked bar data ────────────────────────────────────────── + const barData = metrics.map((m) => ({ + name: getName(m.processId), + 'Waiting': m.waitingTime, + 'CPU': m.cpuTime, + 'I/O': m.ioTime, + _color: getColor(m.processId), })); + // ── Radar chart data (normalized 0-100 per dimension) ───────── + // Each "subject" is a process, each series is a dimension. + // We invert "Response" and "Waiting" so higher = better. + const maxT = Math.max(...metrics.map(m => m.turnaroundTime), 1); + const maxR = Math.max(...metrics.map(m => m.responseTime), 1); + const maxW = Math.max(...metrics.map(m => m.waitingTime), 1); + const maxCpu = Math.max(...metrics.map(m => m.cpuTime), 1); + const maxIo = Math.max(...metrics.map(m => m.ioTime), 1); + + const radarDimensions = [ + 'Turnaround', 'Response', 'Waiting', 'CPU Time', 'I/O Time', + ] as const; + + // Radar: rows = dimensions, column per process → Recharts RadarChart needs + // one row per "subject" (dimension), with one field per process. + const radarData = radarDimensions.map(dim => { + const row: Record = { dimension: dim }; + metrics.forEach(m => { + const key = getName(m.processId); + switch (dim) { + case 'Turnaround': row[key] = (m.turnaroundTime / maxT) * 100; break; + case 'Response': row[key] = (m.responseTime / maxR) * 100; break; + case 'Waiting': row[key] = (m.waitingTime / maxW) * 100; break; + case 'CPU Time': row[key] = (m.cpuTime / maxCpu)* 100; break; + case 'I/O Time': row[key] = (m.ioTime / maxIo) * 100; break; + } + }); + return row; + }); + + const showRadar = metrics.length >= 2; + return ( -
- - - - - - - - - - - - -

- Barras empilhadas = Turnaround Time (Waiting + CPU + I/O) -

+
+ {/* ── Radar chart ───────────────────────────────────────── */} + {showRadar && ( +
+

+ Perfil Comparativo (normalizado) +

+ + + + + {metrics.map((m) => ( + + ))} + [typeof value === 'number' ? `${value.toFixed(1)}%` : '-', '']} + /> + + + +
+ )} + + {/* ── Stacked bar chart ─────────────────────────────────── */} +
+

+ Breakdown por Processo (ticks) +

+ + + + + + + + + + + + +

+ Waiting + CPU + I/O = Turnaround +

+
); }; diff --git a/src/components/MetricsPanel/MetricsPanel.tsx b/src/components/MetricsPanel/MetricsPanel.tsx index 8a6c7fb..940a826 100644 --- a/src/components/MetricsPanel/MetricsPanel.tsx +++ b/src/components/MetricsPanel/MetricsPanel.tsx @@ -46,7 +46,7 @@ const MetricsPanel = () => { const canExportCSV = status === 'finished' && processMetrics.length > 0; return ( -
+
{/* Panel header with tabs + export button */}
{TAB_CONFIG.map(tab => ( diff --git a/src/components/MetricsPanel/MetricsTable.tsx b/src/components/MetricsPanel/MetricsTable.tsx index 2d9ee13..58cc1d0 100644 --- a/src/components/MetricsPanel/MetricsTable.tsx +++ b/src/components/MetricsPanel/MetricsTable.tsx @@ -12,6 +12,26 @@ function boundVariant(type: ProcessMetrics['boundType']) { return 'balanced'; } +// Inline mini bar rendered behind the numeric value +interface MiniBarProps { + value: number; + max: number; + color: string; // tailwind bg class +} + +const MiniBar = ({ value, max, color }: MiniBarProps) => { + const pct = max > 0 ? (value / max) * 100 : 0; + return ( +
+
+ {value} +
+ ); +}; + const MetricsTable = ({ metrics, processMap }: MetricsTableProps) => { if (metrics.length === 0) { return ( @@ -21,34 +41,42 @@ const MetricsTable = ({ metrics, processMap }: MetricsTableProps) => { ); } + // Pre-compute maximums for proportional bars + const maxResponse = Math.max(...metrics.map(m => m.responseTime), 1); + const maxTurnaround = Math.max(...metrics.map(m => m.turnaroundTime), 1); + const maxWaiting = Math.max(...metrics.map(m => m.waitingTime), 1); + const maxCpu = Math.max(...metrics.map(m => m.cpuTime), 1); + const maxIo = Math.max(...metrics.map(m => m.ioTime), 1); + return (
- +
- + - - - - - + + + + + {metrics.map((m, i) => { - const proc = processMap[m.processId]; - const name = proc?.name ?? m.processId; + const proc = processMap[m.processId]; + const name = proc?.name ?? m.processId; const color = proc?.color ?? '#94a3b8'; return ( + {/* Process name */} - - - - - - - - - + + {/* Plain timestamps */} + + + + + {/* Cells with inline mini-bars */} + + + + + + + {/* CPU utilization with a tiny arc/bar */} + + + {/* Bound badge */} diff --git a/src/core/__tests__/engine.test.ts b/src/core/__tests__/engine.test.ts index b551b97..f35625a 100644 --- a/src/core/__tests__/engine.test.ts +++ b/src/core/__tests__/engine.test.ts @@ -193,10 +193,11 @@ describe("CT-04: SRTF Preemption", () => { }); // ============================================================ -// General engine behaviour +// SimulationEngine — ciclo de vida +// Tests: isFinished, step() guard, runAll vs step equivalence // ============================================================ -describe("SimulationEngine general", () => { +describe("SimulationEngine — ciclo de vida", () => { it("isFinished returns false mid-run, true after runAll", () => { const engine = new SimulationEngine( [p("p1", 0, [{ type: "cpu", duration: 3 }])], @@ -232,22 +233,14 @@ describe("SimulationEngine general", () => { expect(fromRunAll).toEqual(fromStep); }); +}); - it("process with I/O: transitions through Waiting state", () => { - const engine = new SimulationEngine( - [p("p1", 0, [{ type: "cpu", duration: 2 }, { type: "io", duration: 2 }, { type: "cpu", duration: 1 }])], - cfg(), - ); - const ticks = engine.runAll(); - const states = ticks.map((t) => t.states["p1"]); - // Running for 2, Waiting for 2, Running for 1 - expect(states[0]).toBe("Running"); - expect(states[1]).toBe("Running"); - expect(states[2]).toBe("Waiting"); - expect(states[3]).toBe("Waiting"); - expect(states[4]).toBe("Running"); - }); +// ============================================================ +// SimulationEngine — chegada de processos +// Tests: late arrivals, idle ticks while waiting for process +// ============================================================ +describe("SimulationEngine — chegada de processos", () => { it("process arriving after simulation starts is correctly scheduled", () => { const engine = new SimulationEngine( [ @@ -261,7 +254,14 @@ describe("SimulationEngine general", () => { expect(ticks[4]?.cpuProcess).toBeNull(); // tick 4: idle expect(ticks[5]?.cpuProcess).toBe("p2"); }); +}); +// ============================================================ +// SimulationEngine — troca de contexto +// Tests: idle ticks during switch, ctxSwitchForProcess across overhead +// ============================================================ + +describe("SimulationEngine — troca de contexto", () => { it("context switch inserts idle ticks between processes", () => { const engine = new SimulationEngine( [ @@ -298,3 +298,25 @@ describe("SimulationEngine general", () => { expect(ticks[4]?.ctxSwitchForProcess).toBeNull(); }); }); + +// ============================================================ +// SimulationEngine — I/O +// Tests: Waiting state, IO burst transitions +// ============================================================ + +describe("SimulationEngine — I/O", () => { + it("process with I/O: transitions through Waiting state", () => { + const engine = new SimulationEngine( + [p("p1", 0, [{ type: "cpu", duration: 2 }, { type: "io", duration: 2 }, { type: "cpu", duration: 1 }])], + cfg(), + ); + const ticks = engine.runAll(); + const states = ticks.map((t) => t.states["p1"]); + // Running for 2, Waiting for 2, Running for 1 + expect(states[0]).toBe("Running"); + expect(states[1]).toBe("Running"); + expect(states[2]).toBe("Waiting"); + expect(states[3]).toBe("Waiting"); + expect(states[4]).toBe("Running"); + }); +}); diff --git a/src/core/__tests__/fcfs.test.ts b/src/core/__tests__/fcfs.test.ts index 7799993..3a93203 100644 --- a/src/core/__tests__/fcfs.test.ts +++ b/src/core/__tests__/fcfs.test.ts @@ -1,7 +1,9 @@ import { describe, it, expect } from "vitest"; -import { fcfs } from "../algorithms/fcfs"; +import { FCFSAlgorithm } from "../algorithms/fcfs"; import type { ProcessRuntime } from "../types"; +const fcfs = new FCFSAlgorithm(); + function makeRt(id: string, arrivalTick: number): ProcessRuntime { return { processId: id, state: "Ready", remainingBurst: 4, burstIndex: 0, @@ -11,37 +13,33 @@ function makeRt(id: string, arrivalTick: number): ProcessRuntime { }; } -const config = { algorithm: "FCFS" as const, quantum: 2, contextSwitchTime: 0, isPreemptive: false, agingEnabled: false, agingInterval: 5 }; - describe("FCFS select()", () => { it("returns null for empty queue", () => { - expect(fcfs.select([], config)).toBeNull(); + expect(fcfs.select([])).toBeNull(); }); it("returns single process", () => { const rt = makeRt("p1", 0); - expect(fcfs.select([rt], config)).toBe(rt); + expect(fcfs.select([rt])).toBe(rt); }); it("returns earliest-arriving process", () => { const r1 = makeRt("p1", 5); const r2 = makeRt("p2", 2); const r3 = makeRt("p3", 8); - expect(fcfs.select([r1, r2, r3], config)?.processId).toBe("p2"); + expect(fcfs.select([r1, r2, r3])?.processId).toBe("p2"); }); it("tiebreaks by processId lexicographic", () => { const r1 = makeRt("p2", 0); const r2 = makeRt("p1", 0); - expect(fcfs.select([r1, r2], config)?.processId).toBe("p1"); + expect(fcfs.select([r1, r2])?.processId).toBe("p1"); }); }); describe("FCFS shouldPreempt()", () => { it("always returns false", () => { - const a = makeRt("p1", 0); - const b = makeRt("p2", 0); - expect(fcfs.shouldPreempt(a, b, config)).toBe(false); + expect(fcfs.shouldPreempt()).toBe(false); }); }); @@ -49,6 +47,14 @@ describe("FCFS isQuantumExpired()", () => { it("always returns false", () => { const rt = makeRt("p1", 0); rt.quantumRemaining = 0; - expect(fcfs.isQuantumExpired(rt, config)).toBe(false); + expect(fcfs.isQuantumExpired()).toBe(false); + }); +}); + +describe("FCFSAlgorithm — metadados", () => { + it("expõe propriedades educacionais corretas", () => { + expect(fcfs.name).toContain("First Come"); + expect(fcfs.isPreemptiveCapable).toBe(false); + expect(fcfs.usesQuantum).toBe(false); }); }); diff --git a/src/core/__tests__/hrrn.test.ts b/src/core/__tests__/hrrn.test.ts index bcf221b..822a4a1 100644 --- a/src/core/__tests__/hrrn.test.ts +++ b/src/core/__tests__/hrrn.test.ts @@ -1,8 +1,10 @@ import { describe, it, expect } from "vitest"; -import { hrrn } from "../algorithms/hrrn"; +import { HRRNAlgorithm } from "../algorithms/hrrn"; import { SimulationEngine } from "../engine"; import type { Process, ProcessRuntime, SchedulerConfig } from "../types"; +const hrrn = new HRRNAlgorithm(); + function makeRt(id: string, remainingBurst: number, waitingTime: number, arrivalTick = 0): ProcessRuntime { return { processId: id, state: "Ready", remainingBurst, burstIndex: 0, @@ -24,7 +26,7 @@ const p = (id: string, arrival: number, cpuDuration: number): Process => ({ describe("HRRN select()", () => { it("returns null for empty queue", () => { - expect(hrrn.select([], config)).toBeNull(); + expect(hrrn.select([])).toBeNull(); }); it("picks process with highest response ratio", () => { @@ -35,20 +37,18 @@ describe("HRRN select()", () => { const r1 = makeRt("p1", 8, 0); const r2 = makeRt("p2", 3, 6); const r3 = makeRt("p3", 5, 2); - expect(hrrn.select([r1, r2, r3], config)?.processId).toBe("p2"); + expect(hrrn.select([r1, r2, r3])?.processId).toBe("p2"); }); it("tiebreaks equal ratio by arrival then id", () => { // Both ratio = (4 + 4) / 4 = 2.0 const r1 = makeRt("p2", 4, 4, 1); // arrives at 1 const r2 = makeRt("p1", 4, 4, 2); // arrives at 2 - expect(hrrn.select([r1, r2], config)?.processId).toBe("p2"); + expect(hrrn.select([r1, r2])?.processId).toBe("p2"); }); it("shouldPreempt always false", () => { - const a = makeRt("p1", 4, 0); - const b = makeRt("p2", 4, 10); - expect(hrrn.shouldPreempt(a, b, config)).toBe(false); + expect(hrrn.shouldPreempt()).toBe(false); }); }); @@ -81,3 +81,11 @@ describe("HRRN integration", () => { expect(ticks[3]?.cpuProcess).toBe("p3"); }); }); + +describe("HRRNAlgorithm — metadados", () => { + it("expõe propriedades educacionais corretas", () => { + expect(hrrn.name).toContain("HRRN"); + expect(hrrn.isPreemptiveCapable).toBe(false); + expect(hrrn.usesQuantum).toBe(false); + }); +}); diff --git a/src/core/__tests__/multilevel.test.ts b/src/core/__tests__/multilevel.test.ts index 8ec1d41..ea03c09 100644 --- a/src/core/__tests__/multilevel.test.ts +++ b/src/core/__tests__/multilevel.test.ts @@ -1,8 +1,10 @@ import { describe, it, expect } from "vitest"; -import { multilevel } from "../algorithms/multilevel"; +import { MultilevelQueueAlgorithm } from "../algorithms/multilevel"; import { SimulationEngine } from "../engine"; import type { MlqQueueDef, Process, ProcessRuntime, SchedulerConfig } from "../types"; +const multilevel = new MultilevelQueueAlgorithm(); + // ---------------------------------------------------------------- // Helpers // ---------------------------------------------------------------- @@ -232,3 +234,11 @@ describe("MULTILEVEL integration — strict queue ordering", () => { expect(rts.find((r) => r.processId === "p3")!.cpuTime).toBe(3); }); }); + +describe("MultilevelQueueAlgorithm — metadados", () => { + it("expõe propriedades educacionais corretas", () => { + expect(multilevel.name).toContain("Multilevel"); + expect(multilevel.isPreemptiveCapable).toBe(true); + expect(multilevel.usesQuantum).toBe(true); + }); +}); diff --git a/src/core/__tests__/priority.test.ts b/src/core/__tests__/priority.test.ts index 62bd8d7..dd95d83 100644 --- a/src/core/__tests__/priority.test.ts +++ b/src/core/__tests__/priority.test.ts @@ -1,8 +1,11 @@ import { describe, it, expect } from "vitest"; -import { priorityNp, priorityP } from "../algorithms/priority"; +import { PriorityNonPreemptiveAlgorithm, PriorityPreemptiveAlgorithm } from "../algorithms/priority"; import { SimulationEngine } from "../engine"; import type { Process, ProcessRuntime, SchedulerConfig } from "../types"; +const priorityNp = new PriorityNonPreemptiveAlgorithm(); +const priorityP = new PriorityPreemptiveAlgorithm(); + function makeRt(id: string, priority: number, arrivalTick = 0): ProcessRuntime { return { processId: id, state: "Ready", remainingBurst: 4, burstIndex: 0, @@ -16,10 +19,6 @@ const cfgNp: SchedulerConfig = { algorithm: "PRIORITY_NP", quantum: 2, contextSwitchTime: 0, isPreemptive: false, agingEnabled: false, agingInterval: 5, }; -const cfgP: SchedulerConfig = { - algorithm: "PRIORITY_P", quantum: 2, contextSwitchTime: 0, - isPreemptive: true, agingEnabled: false, agingInterval: 5, -}; const p = (id: string, arrival: number, priority: number, cpuDuration: number): Process => ({ id, name: id, arrivalTime: arrival, priority, color: "#fff", @@ -31,19 +30,17 @@ describe("PRIORITY_NP select()", () => { const r1 = makeRt("p1", 5); const r2 = makeRt("p2", 2); const r3 = makeRt("p3", 8); - expect(priorityNp.select([r1, r2, r3], cfgNp)?.processId).toBe("p2"); + expect(priorityNp.select([r1, r2, r3])?.processId).toBe("p2"); }); it("tiebreaks by arrival then id", () => { const r1 = makeRt("p2", 3, 2); const r2 = makeRt("p1", 3, 5); // p1 arrives later - expect(priorityNp.select([r1, r2], cfgNp)?.processId).toBe("p2"); + expect(priorityNp.select([r1, r2])?.processId).toBe("p2"); }); it("shouldPreempt always false", () => { - const a = makeRt("p1", 5); - const b = makeRt("p2", 1); - expect(priorityNp.shouldPreempt(a, b, cfgNp)).toBe(false); + expect(priorityNp.shouldPreempt()).toBe(false); }); }); @@ -51,19 +48,19 @@ describe("PRIORITY_P shouldPreempt()", () => { it("preempts when candidate has higher priority (lower number)", () => { const current = makeRt("p1", 5); const candidate = makeRt("p2", 2); - expect(priorityP.shouldPreempt(current, candidate, cfgP)).toBe(true); + expect(priorityP.shouldPreempt(current, candidate)).toBe(true); }); it("does NOT preempt on equal priority", () => { const current = makeRt("p1", 3); const candidate = makeRt("p2", 3); - expect(priorityP.shouldPreempt(current, candidate, cfgP)).toBe(false); + expect(priorityP.shouldPreempt(current, candidate)).toBe(false); }); it("does NOT preempt when current has higher priority", () => { const current = makeRt("p1", 2); const candidate = makeRt("p2", 5); - expect(priorityP.shouldPreempt(current, candidate, cfgP)).toBe(false); + expect(priorityP.shouldPreempt(current, candidate)).toBe(false); }); }); @@ -116,3 +113,14 @@ describe("Priority P + aging", () => { expect(rt.currentPriority).toBeGreaterThanOrEqual(1); }); }); + +describe("Priority — metadados", () => { + it("PriorityNonPreemptiveAlgorithm: isPreemptiveCapable=false", () => { + expect(priorityNp.isPreemptiveCapable).toBe(false); + expect(priorityNp.usesQuantum).toBe(false); + }); + it("PriorityPreemptiveAlgorithm: isPreemptiveCapable=true", () => { + expect(priorityP.isPreemptiveCapable).toBe(true); + expect(priorityP.usesQuantum).toBe(false); + }); +}); diff --git a/src/core/__tests__/priority_rr.test.ts b/src/core/__tests__/priority_rr.test.ts index 3f4f2fb..55c1d84 100644 --- a/src/core/__tests__/priority_rr.test.ts +++ b/src/core/__tests__/priority_rr.test.ts @@ -1,8 +1,10 @@ import { describe, it, expect } from "vitest"; -import { priorityRr } from "../algorithms/priority_rr"; +import { PriorityRoundRobinAlgorithm } from "../algorithms/priority_rr"; import { SimulationEngine } from "../engine"; import type { Process, ProcessRuntime, SchedulerConfig } from "../types"; +const priorityRr = new PriorityRoundRobinAlgorithm(); + // ---------------------------------------------------------------- // Helpers // ---------------------------------------------------------------- @@ -58,22 +60,22 @@ const p = ( describe("PRIORITY_RR select()", () => { it("returns null for empty queue", () => { - expect(priorityRr.select([], cfg())).toBeNull(); + expect(priorityRr.select([])).toBeNull(); }); it("picks the process with the lowest priority number (highest priority)", () => { const high = makeRt("high", 1); const low = makeRt("low", 5); - expect(priorityRr.select([low, high], cfg())?.processId).toBe("high"); - expect(priorityRr.select([high, low], cfg())?.processId).toBe("high"); + expect(priorityRr.select([low, high])?.processId).toBe("high"); + expect(priorityRr.select([high, low])?.processId).toBe("high"); }); it("picks the FIRST in insertion order when priorities are equal (FIFO = RR)", () => { const a = makeRt("a", 3); const b = makeRt("b", 3); const c = makeRt("c", 3); - expect(priorityRr.select([a, b, c], cfg())?.processId).toBe("a"); - expect(priorityRr.select([b, c, a], cfg())?.processId).toBe("b"); + expect(priorityRr.select([a, b, c])?.processId).toBe("a"); + expect(priorityRr.select([b, c, a])?.processId).toBe("b"); }); it("ignores lower-priority processes when a higher-priority one is present", () => { @@ -81,7 +83,7 @@ describe("PRIORITY_RR select()", () => { const normal1 = makeRt("n1", 5); const normal2 = makeRt("n2", 5); expect( - priorityRr.select([normal1, normal2, critical], cfg())?.processId, + priorityRr.select([normal1, normal2, critical])?.processId, ).toBe("critical"); }); }); @@ -94,19 +96,19 @@ describe("PRIORITY_RR shouldPreempt()", () => { it("preempts when candidate has strictly higher priority", () => { const running = makeRt("current", 5); const higher = makeRt("higher", 1); - expect(priorityRr.shouldPreempt(running, higher, cfg())).toBe(true); + expect(priorityRr.shouldPreempt(running, higher)).toBe(true); }); it("does NOT preempt for same priority (quantum handles rotation)", () => { const a = makeRt("a", 3); const b = makeRt("b", 3); - expect(priorityRr.shouldPreempt(a, b, cfg())).toBe(false); + expect(priorityRr.shouldPreempt(a, b)).toBe(false); }); it("does NOT preempt when candidate has lower priority", () => { const running = makeRt("current", 1); const lower = makeRt("lower", 5); - expect(priorityRr.shouldPreempt(running, lower, cfg())).toBe(false); + expect(priorityRr.shouldPreempt(running, lower)).toBe(false); }); }); @@ -116,13 +118,13 @@ describe("PRIORITY_RR shouldPreempt()", () => { describe("PRIORITY_RR isQuantumExpired()", () => { it("returns true when quantumRemaining <= 0", () => { - expect(priorityRr.isQuantumExpired(makeRt("p", 5, 0), cfg())).toBe(true); - expect(priorityRr.isQuantumExpired(makeRt("p", 5, -1), cfg())).toBe(true); + expect(priorityRr.isQuantumExpired(makeRt("p", 5, 0))).toBe(true); + expect(priorityRr.isQuantumExpired(makeRt("p", 5, -1))).toBe(true); }); it("returns false when quantum is not exhausted", () => { - expect(priorityRr.isQuantumExpired(makeRt("p", 5, 1), cfg())).toBe(false); - expect(priorityRr.isQuantumExpired(makeRt("p", 5, 2), cfg())).toBe(false); + expect(priorityRr.isQuantumExpired(makeRt("p", 5, 1))).toBe(false); + expect(priorityRr.isQuantumExpired(makeRt("p", 5, 2))).toBe(false); }); }); @@ -246,3 +248,11 @@ describe("PRIORITY_RR integration — combined preemption + RR", () => { expect(rts.find((r) => r.processId === "p3")!.cpuTime).toBe(2); }); }); + +describe("PriorityRoundRobinAlgorithm — metadados", () => { + it("expõe propriedades educacionais corretas", () => { + expect(priorityRr.name).toContain("Priority Round Robin"); + expect(priorityRr.isPreemptiveCapable).toBe(true); + expect(priorityRr.usesQuantum).toBe(true); + }); +}); diff --git a/src/core/__tests__/rr.test.ts b/src/core/__tests__/rr.test.ts index 77e0091..7d38750 100644 --- a/src/core/__tests__/rr.test.ts +++ b/src/core/__tests__/rr.test.ts @@ -1,8 +1,10 @@ import { describe, it, expect } from "vitest"; -import { rr } from "../algorithms/rr"; +import { RoundRobinAlgorithm } from "../algorithms/rr"; import { SimulationEngine } from "../engine"; import type { Process, ProcessRuntime, SchedulerConfig } from "../types"; +const rr = new RoundRobinAlgorithm(); + function makeRt(id: string, quantumRemaining = 2): ProcessRuntime { return { processId: id, state: "Running", remainingBurst: 4, burstIndex: 0, @@ -26,32 +28,30 @@ describe("RR select()", () => { it("returns front of queue (FIFO)", () => { const r1: ProcessRuntime = { ...makeRt("p1"), state: "Ready" }; const r2: ProcessRuntime = { ...makeRt("p2"), state: "Ready" }; - expect(rr.select([r1, r2], config)?.processId).toBe("p1"); - expect(rr.select([r2, r1], config)?.processId).toBe("p2"); + expect(rr.select([r1, r2])?.processId).toBe("p1"); + expect(rr.select([r2, r1])?.processId).toBe("p2"); }); it("returns null for empty queue", () => { - expect(rr.select([], config)).toBeNull(); + expect(rr.select([])).toBeNull(); }); }); describe("RR isQuantumExpired()", () => { it("returns true when quantumRemaining <= 0", () => { - expect(rr.isQuantumExpired(makeRt("p1", 0), config)).toBe(true); - expect(rr.isQuantumExpired(makeRt("p1", -1), config)).toBe(true); + expect(rr.isQuantumExpired(makeRt("p1", 0))).toBe(true); + expect(rr.isQuantumExpired(makeRt("p1", -1))).toBe(true); }); it("returns false when quantum not yet exhausted", () => { - expect(rr.isQuantumExpired(makeRt("p1", 1), config)).toBe(false); - expect(rr.isQuantumExpired(makeRt("p1", 2), config)).toBe(false); + expect(rr.isQuantumExpired(makeRt("p1", 1))).toBe(false); + expect(rr.isQuantumExpired(makeRt("p1", 2))).toBe(false); }); }); describe("RR shouldPreempt()", () => { it("always returns false (preemption via quantum expiry only)", () => { - const a = makeRt("p1"); - const b = makeRt("p2"); - expect(rr.shouldPreempt(a, b, config)).toBe(false); + expect(rr.shouldPreempt()).toBe(false); }); }); @@ -114,3 +114,11 @@ describe("CT-02: Round Robin integration", () => { void ticks; // used for debugging if needed }); }); + +describe("RoundRobinAlgorithm — metadados", () => { + it("expõe propriedades educacionais corretas", () => { + expect(rr.name).toContain("Round Robin"); + expect(rr.isPreemptiveCapable).toBe(false); + expect(rr.usesQuantum).toBe(true); + }); +}); diff --git a/src/core/__tests__/sjf.test.ts b/src/core/__tests__/sjf.test.ts index 012f1f9..ebb2173 100644 --- a/src/core/__tests__/sjf.test.ts +++ b/src/core/__tests__/sjf.test.ts @@ -1,8 +1,13 @@ import { describe, it, expect } from "vitest"; -import { sjfNp, srtf } from "../algorithms/sjf"; +import { SJFNonPreemptiveAlgorithm, SRTFAlgorithm } from "../algorithms/sjf"; import { SimulationEngine } from "../engine"; import type { Process, ProcessRuntime, SchedulerConfig } from "../types"; +const sjfNp = new SJFNonPreemptiveAlgorithm(); +const srtf = new SRTFAlgorithm(); + + + function makeRt(id: string, remainingBurst: number, arrivalTick = 0): ProcessRuntime { return { processId: id, state: "Ready", remainingBurst, burstIndex: 0, @@ -23,27 +28,25 @@ const p = (id: string, arrival: number, bursts: { type: "cpu" | "io"; duration: describe("SJF_NP select()", () => { it("returns null for empty queue", () => { - expect(sjfNp.select([], config)).toBeNull(); + expect(sjfNp.select([])).toBeNull(); }); it("picks shortest remaining burst", () => { const r1 = makeRt("p1", 8); const r2 = makeRt("p2", 3); const r3 = makeRt("p3", 5); - expect(sjfNp.select([r1, r2, r3], config)?.processId).toBe("p2"); + expect(sjfNp.select([r1, r2, r3])?.processId).toBe("p2"); }); it("tiebreaks equal burst by arrival then id", () => { const r1 = makeRt("p2", 4, 1); const r2 = makeRt("p1", 4, 2); // p2 arrives earlier - expect(sjfNp.select([r1, r2], config)?.processId).toBe("p2"); + expect(sjfNp.select([r1, r2])?.processId).toBe("p2"); }); it("shouldPreempt always false", () => { - const a = makeRt("p1", 4); - const b = makeRt("p2", 2); - expect(sjfNp.shouldPreempt(a, b, config)).toBe(false); + expect(sjfNp.shouldPreempt()).toBe(false); }); }); @@ -51,19 +54,19 @@ describe("SRTF shouldPreempt()", () => { it("preempts when candidate has strictly smaller burst", () => { const current = makeRt("p1", 7); const candidate = makeRt("p2", 4); - expect(srtf.shouldPreempt(current, candidate, config)).toBe(true); + expect(srtf.shouldPreempt(current, candidate)).toBe(true); }); it("does NOT preempt on equal remaining burst", () => { const current = makeRt("p1", 4); const candidate = makeRt("p2", 4); - expect(srtf.shouldPreempt(current, candidate, config)).toBe(false); + expect(srtf.shouldPreempt(current, candidate)).toBe(false); }); it("does NOT preempt when current has smaller burst", () => { const current = makeRt("p1", 3); const candidate = makeRt("p2", 6); - expect(srtf.shouldPreempt(current, candidate, config)).toBe(false); + expect(srtf.shouldPreempt(current, candidate)).toBe(false); }); }); @@ -92,3 +95,16 @@ describe("CT-04: SRTF Preemption (integration)", () => { expect(rt1.finishTick).toBe(12); }); }); + +describe("SJF/SRTF — metadados", () => { + it("SJFNonPreemptiveAlgorithm: isPreemptiveCapable=false, usesQuantum=false", () => { + expect(sjfNp.isPreemptiveCapable).toBe(false); + expect(sjfNp.usesQuantum).toBe(false); + expect(sjfNp.name).toContain("Shortest Job First"); + }); + it("SRTFAlgorithm: isPreemptiveCapable=true, usesQuantum=false", () => { + expect(srtf.isPreemptiveCapable).toBe(true); + expect(srtf.usesQuantum).toBe(false); + expect(srtf.name).toContain("SRTF"); + }); +}); diff --git a/src/core/algorithms/base.ts b/src/core/algorithms/base.ts new file mode 100644 index 0000000..4064cbe --- /dev/null +++ b/src/core/algorithms/base.ts @@ -0,0 +1,69 @@ +import type { ProcessRuntime, SchedulerConfig } from "../types"; +import { tiebreak as _tiebreak } from "./utils"; + +/** + * BaseAlgorithm — Classe abstrata para algoritmos de escalonamento. + * + * Cada algoritmo concreto deve implementar: + * - Propriedades educacionais (name, description, isPreemptiveCapable, usesQuantum) + * - Os três métodos do contrato de escalonamento (select, shouldPreempt, isQuantumExpired) + * + * O método estático `tiebreak` é disponibilizado a todas as subclasses como + * critério de desempate padrão: chegada mais cedo → ID lexicográfico menor. + */ +export abstract class BaseAlgorithm { + /** Nome completo do algoritmo para exibição. */ + abstract readonly name: string; + + /** Breve descrição educacional do comportamento do algoritmo. */ + abstract readonly description: string; + + /** Indica se o algoritmo suporta preempção por candidato mais prioritário. */ + abstract readonly isPreemptiveCapable: boolean; + + /** Indica se o algoritmo usa fatia de tempo (quantum). */ + abstract readonly usesQuantum: boolean; + + // ─── Contrato de escalonamento ─────────────────────────────────────────── + + /** + * Seleciona o próximo processo a executar a partir da fila de prontos. + * Não deve modificar o array — o engine remove o processo selecionado. + * Retorna null se a fila estiver vazia. + */ + abstract select( + readyQueue: readonly ProcessRuntime[], + config: SchedulerConfig, + ): ProcessRuntime | null; + + /** + * Para algoritmos preemptivos: indica se o processo em execução deve ser + * interrompido em favor do candidato selecionado. + * Chamado apenas quando há um processo rodando e um candidato disponível. + */ + abstract shouldPreempt( + current: ProcessRuntime, + candidate: ProcessRuntime, + config: SchedulerConfig, + ): boolean; + + /** + * Para Round Robin: indica se o quantum do processo expirou. + * Todos os outros algoritmos devem retornar false. + */ + abstract isQuantumExpired( + runtime: ProcessRuntime, + config: SchedulerConfig, + ): boolean; + + // ─── Helper compartilhado ──────────────────────────────────────────────── + + /** + * Critério de desempate padrão: chegada mais cedo (arrivalTick ASC), + * depois ID do processo em ordem lexicográfica. + * Disponível a todas as subclasses como método estático herdado. + */ + public static tiebreak(a: ProcessRuntime, b: ProcessRuntime): number { + return _tiebreak(a, b); + } +} diff --git a/src/core/algorithms/fcfs.ts b/src/core/algorithms/fcfs.ts index a88e0f7..e2f26a7 100644 --- a/src/core/algorithms/fcfs.ts +++ b/src/core/algorithms/fcfs.ts @@ -1,21 +1,32 @@ -import type { SchedulerAlgorithm } from "./index"; -import { tiebreak } from "./utils"; +import type { ProcessRuntime } from "../types"; +import { BaseAlgorithm } from "./base"; /** - * FCFS — First Come, First Served - * Non-preemptive. Selects the process with earliest arrival; tiebreak by id. + * FCFS — First Come, First Served (Primeiro a Chegar, Primeiro a Ser Servido) + * + * Algoritmo não-preemptivo mais simples: processa os jobs na ordem exata + * de chegada. Fácil de implementar, mas pode causar o "efeito comboio" + * (convoy effect), onde processos curtos ficam presos atrás de um longo. */ -export const fcfs: SchedulerAlgorithm = { - select(readyQueue) { +export class FCFSAlgorithm extends BaseAlgorithm { + readonly name = "First Come, First Served (FCFS)"; + readonly description = + "Não-preemptivo. Despacha processos na ordem de chegada. " + + "Simples, mas pode causar o efeito comboio: processos curtos " + + "aguardam atrás de um processo longo."; + readonly isPreemptiveCapable = false; + readonly usesQuantum = false; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { if (readyQueue.length === 0) return null; - return [...readyQueue].sort(tiebreak)[0] ?? null; - }, + return [...readyQueue].sort(FCFSAlgorithm.tiebreak)[0] ?? null; + } - shouldPreempt() { + shouldPreempt(): boolean { return false; - }, + } - isQuantumExpired() { + isQuantumExpired(): boolean { return false; - }, -}; + } +} diff --git a/src/core/algorithms/hrrn.ts b/src/core/algorithms/hrrn.ts index 1a3f30b..267322b 100644 --- a/src/core/algorithms/hrrn.ts +++ b/src/core/algorithms/hrrn.ts @@ -1,33 +1,52 @@ import type { ProcessRuntime } from "../types"; -import type { SchedulerAlgorithm } from "./index"; -import { tiebreak } from "./utils"; - -function hrrnRatio(rt: ProcessRuntime): number { - // ratio = (waitingTime + burstTime) / burstTime - // remainingBurst > 0 is guaranteed for processes in the ready queue - if (rt.remainingBurst <= 0) return Infinity; - return (rt.waitingTime + rt.remainingBurst) / rt.remainingBurst; -} +import { BaseAlgorithm } from "./base"; /** * HRRN — Highest Response Ratio Next - * Non-preemptive. Balances waiting time and burst length to prevent starvation. + * + * Algoritmo não-preemptivo que equilibra o tempo de burst e o tempo de espera + * para evitar inanição. A cada decisão de escalonamento, calcula a razão de + * resposta de cada processo na fila e despacha o de maior razão. + * + * Fórmula: ratio = (waitingTime + remainingBurst) / remainingBurst + * + * - Processos longos que esperam muito aumentam sua razão, evitando inanição. + * - Processos curtos naturalmente têm razão alta (denominador pequeno). + * - Oferece um balanço entre SJF (favorece curtos) e FCFS (favorece chegada). */ -export const hrrn: SchedulerAlgorithm = { - select(readyQueue) { +export class HRRNAlgorithm extends BaseAlgorithm { + readonly name = "Highest Response Ratio Next (HRRN)"; + readonly description = + "Não-preemptivo. Despacha o processo com maior razão de resposta: " + + "(espera + burst) / burst. Equilibra duração e tempo de espera, " + + "prevenindo inanição sem precisar de aging explícito."; + readonly isPreemptiveCapable = false; + readonly usesQuantum = false; + + /** + * Calcula a razão de resposta de um processo. + * Retorna Infinity se remainingBurst <= 0 (não deve ocorrer na fila de prontos, + * mas garante ordenação segura em casos de borda). + */ + private static hrrnRatio(rt: ProcessRuntime): number { + if (rt.remainingBurst <= 0) return Infinity; + return (rt.waitingTime + rt.remainingBurst) / rt.remainingBurst; + } + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { if (readyQueue.length === 0) return null; return [...readyQueue].sort((a, b) => { - const ratioDiff = hrrnRatio(b) - hrrnRatio(a); // descending + const ratioDiff = HRRNAlgorithm.hrrnRatio(b) - HRRNAlgorithm.hrrnRatio(a); // descendente if (ratioDiff !== 0) return ratioDiff; - return tiebreak(a, b); + return HRRNAlgorithm.tiebreak(a, b); })[0] ?? null; - }, + } - shouldPreempt() { + shouldPreempt(): boolean { return false; - }, + } - isQuantumExpired() { + isQuantumExpired(): boolean { return false; - }, -}; + } +} diff --git a/src/core/algorithms/index.ts b/src/core/algorithms/index.ts index ab7b801..eaa6b2e 100644 --- a/src/core/algorithms/index.ts +++ b/src/core/algorithms/index.ts @@ -1,61 +1,31 @@ -import type { ProcessRuntime, SchedulerConfig, SchedulingAlgorithm } from "../types"; -import { fcfs } from "./fcfs"; -import { sjfNp, srtf } from "./sjf"; -import { rr } from "./rr"; -import { priorityNp, priorityP } from "./priority"; -import { priorityRr } from "./priority_rr"; -import { hrrn } from "./hrrn"; -import { multilevel } from "./multilevel"; +import type { SchedulingAlgorithm } from "../types"; +import { BaseAlgorithm } from "./base"; +import { FCFSAlgorithm } from "./fcfs"; +import { SJFNonPreemptiveAlgorithm, SRTFAlgorithm } from "./sjf"; +import { RoundRobinAlgorithm } from "./rr"; +import { PriorityNonPreemptiveAlgorithm, PriorityPreemptiveAlgorithm } from "./priority"; +import { PriorityRoundRobinAlgorithm } from "./priority_rr"; +import { HRRNAlgorithm } from "./hrrn"; +import { MultilevelQueueAlgorithm } from "./multilevel"; + +export type { BaseAlgorithm }; // ============================================================ -// SchedulerAlgorithm interface -// All implementations must be pure (no mutation of the queue). +// Tabela de despacho — o engine busca o algoritmo pelo nome // ============================================================ +// +// As instâncias são criadas uma única vez no carregamento do módulo. +// Isso é seguro pois todas as classes são stateless: todo estado mutável +// da simulação vive em ProcessRuntime, gerenciado pelo SimulationEngine. -export interface SchedulerAlgorithm { - /** - * Select the best process to dispatch from the ready queue. - * Returns null if the queue is empty. - * Must NOT mutate the array; the engine handles removal. - */ - select( - readyQueue: readonly ProcessRuntime[], - config: SchedulerConfig, - ): ProcessRuntime | null; - - /** - * For preemptive algorithms: should the currently-running process - * be replaced by `candidate`? - * Called only when cpuProcess != null and a candidate exists. - */ - shouldPreempt( - current: ProcessRuntime, - candidate: ProcessRuntime, - config: SchedulerConfig, - ): boolean; - - /** - * RR only: has the process exhausted its quantum? - * For all other algorithms this must return false. - */ - isQuantumExpired( - runtime: ProcessRuntime, - config: SchedulerConfig, - ): boolean; -} - -// ============================================================ -// Dispatch table — engine looks up algorithm by name -// ============================================================ - -export const algorithms: Record = { - FCFS: fcfs, - SJF_NP: sjfNp, - SJF_P: srtf, - RR: rr, - PRIORITY_NP: priorityNp, - PRIORITY_P: priorityP, - PRIORITY_RR: priorityRr, - HRRN: hrrn, - MULTILEVEL: multilevel, +export const algorithms: Record = { + FCFS: new FCFSAlgorithm(), + SJF_NP: new SJFNonPreemptiveAlgorithm(), + SJF_P: new SRTFAlgorithm(), + RR: new RoundRobinAlgorithm(), + PRIORITY_NP: new PriorityNonPreemptiveAlgorithm(), + PRIORITY_P: new PriorityPreemptiveAlgorithm(), + PRIORITY_RR: new PriorityRoundRobinAlgorithm(), + HRRN: new HRRNAlgorithm(), + MULTILEVEL: new MultilevelQueueAlgorithm(), }; diff --git a/src/core/algorithms/multilevel.ts b/src/core/algorithms/multilevel.ts index 218994d..78c2898 100644 --- a/src/core/algorithms/multilevel.ts +++ b/src/core/algorithms/multilevel.ts @@ -1,109 +1,132 @@ -import type { MlqQueueDef, ProcessRuntime } from "../types"; -import type { SchedulerAlgorithm } from "./index"; -import { tiebreak } from "./utils"; +import type { MlqQueueDef, ProcessRuntime, SchedulerConfig } from "../types"; +import { BaseAlgorithm } from "./base"; /** - * MULTILEVEL — Multilevel Queue Scheduling + * MLQ — Multilevel Queue (Fila Multinível) * - * Processes are permanently assigned to a queue based on their currentPriority. - * The scheduler always dispatches from the highest-priority non-empty queue. - * Each queue has its own scheduling algorithm (FCFS, RR, or PRIORITY_NP). + * Processos são atribuídos permanentemente a filas com base em sua prioridade. + * Cada fila tem seu próprio algoritmo interno (FCFS, RR ou PRIORITY_NP). * - * Inter-queue behaviour: - * - A process from a higher-priority queue always preempts a process - * from a lower-priority queue. - * - No process from a lower-priority queue runs while a higher-priority - * queue has processes. + * Comportamento entre filas: + * - O escalonador sempre despacha da fila de maior prioridade não-vazia (índice 0). + * - Um processo de fila superior sempre preempta um processo de fila inferior. + * - Nenhum processo de fila inferior executa enquanto houver processos em fila superior. * - * Intra-queue behaviour: - * - FCFS: dispatch in arrival order; no preemption within the queue. - * - RR: round-robin using the queue's own quantum; no cross-queue switching. - * - PRIORITY_NP: dispatch the highest currentPriority process; no preemption. + * Comportamento dentro de cada fila: + * - FCFS: despacha na ordem de chegada; sem preempção interna. + * - RR: rodízio usando o quantum da fila; sem preempção interna. + * - PRIORITY_NP: despacha o de maior prioridade; sem preempção interna. * - * Queue assignment is derived from config.mlqQueues. Each queue definition - * specifies [priorityMin, priorityMax] (both inclusive). If a process's - * currentPriority falls outside all queues, it is assigned to the last queue. + * A configuração das filas vem de `config.mlqQueues`; se ausente, usa as + * filas padrão definidas em `DEFAULT_QUEUES`. */ +export class MultilevelQueueAlgorithm extends BaseAlgorithm { + readonly name = "Multilevel Queue (MLQ)"; + readonly description = + "Filas de prioridade fixas, cada uma com seu algoritmo interno (FCFS, RR, PRIORITY_NP). " + + "A fila de maior prioridade sempre executa primeiro. Processos são atribuídos " + + "permanentemente a uma fila conforme sua prioridade."; + readonly isPreemptiveCapable = true; + readonly usesQuantum = true; // verdadeiro porque a fila RR usa quantum -/** Returns the index of the queue that owns this priority value (0 = highest). */ -function getQueueIndex(priority: number, queues: readonly MlqQueueDef[]): number { - for (let i = 0; i < queues.length; i++) { - const q = queues[i]!; - if (priority >= q.priorityMin && priority <= q.priorityMax) return i; - } - // Fallback: assign to last queue if priority is out of all defined ranges. - return queues.length - 1; -} + /** Configuração padrão: 3 filas cobrindo prioridades 1–10. */ + private static readonly DEFAULT_QUEUES: MlqQueueDef[] = [ + { priorityMin: 1, priorityMax: 3, algorithm: "RR", quantum: 2 }, + { priorityMin: 4, priorityMax: 7, algorithm: "PRIORITY_NP", quantum: 2 }, + { priorityMin: 8, priorityMax: 10, algorithm: "FCFS", quantum: 2 }, + ]; -/** Select the best candidate from a sub-queue using the queue's algorithm. */ -function selectWithinQueue( - candidates: readonly ProcessRuntime[], - queueDef: MlqQueueDef, -): ProcessRuntime | null { - if (candidates.length === 0) return null; - - if (queueDef.algorithm === "RR") { - // RR: dispatch in insertion order (engine tail-appends on preemption). - return candidates[0]!; - } - - if (queueDef.algorithm === "FCFS") { - // FCFS: dispatch earliest-arriving process (by arrivalTick, then processId). - return candidates.reduce((best, rt) => - tiebreak(rt, best) < 0 ? rt : best, - ); - } - - // PRIORITY_NP: dispatch the process with the lowest currentPriority number. - let best = candidates[0]!; - for (let i = 1; i < candidates.length; i++) { - const rt = candidates[i]!; - if ( - rt.currentPriority < best.currentPriority || - (rt.currentPriority === best.currentPriority && tiebreak(rt, best) < 0) - ) { - best = rt; + /** + * Retorna o índice da fila à qual pertence o valor de prioridade informado. + * Se a prioridade não se enquadrar em nenhuma fila definida, usa a última. + */ + private static getQueueIndex( + priority: number, + queues: readonly MlqQueueDef[], + ): number { + for (let i = 0; i < queues.length; i++) { + const q = queues[i]!; + if (priority >= q.priorityMin && priority <= q.priorityMax) return i; } + return queues.length - 1; } - return best; -} -const DEFAULT_QUEUES: MlqQueueDef[] = [ - { priorityMin: 1, priorityMax: 3, algorithm: "RR", quantum: 2 }, - { priorityMin: 4, priorityMax: 7, algorithm: "PRIORITY_NP", quantum: 2 }, - { priorityMin: 8, priorityMax: 10, algorithm: "FCFS", quantum: 2 }, -]; + /** + * Seleciona o melhor candidato dentro de uma sub-fila usando o algoritmo + * definido para ela (RR, FCFS ou PRIORITY_NP). + */ + private static selectWithinQueue( + candidates: readonly ProcessRuntime[], + queueDef: MlqQueueDef, + ): ProcessRuntime | null { + if (candidates.length === 0) return null; -export const multilevel: SchedulerAlgorithm = { - select(readyQueue, config): ProcessRuntime | null { - const queues = config.mlqQueues ?? DEFAULT_QUEUES; + if (queueDef.algorithm === "RR") { + // RR: despacha na ordem de inserção (engine mantém FIFO). + return candidates[0]!; + } + + if (queueDef.algorithm === "FCFS") { + // FCFS: despacha o de chegada mais antiga (arrivalTick, depois processId). + return candidates.reduce((best, rt) => + BaseAlgorithm.tiebreak(rt, best) < 0 ? rt : best, + ); + } + + // PRIORITY_NP: despacha o de maior prioridade (menor número). + let best = candidates[0]!; + for (let i = 1; i < candidates.length; i++) { + const rt = candidates[i]!; + if ( + rt.currentPriority < best.currentPriority || + (rt.currentPriority === best.currentPriority && + BaseAlgorithm.tiebreak(rt, best) < 0) + ) { + best = rt; + } + } + return best; + } + + select( + readyQueue: readonly ProcessRuntime[], + config: SchedulerConfig, + ): ProcessRuntime | null { + const queues = config.mlqQueues ?? MultilevelQueueAlgorithm.DEFAULT_QUEUES; if (queues.length === 0) return null; - // Iterate from highest-priority queue (index 0) to lowest. + // Itera da fila de maior prioridade (índice 0) para a de menor. for (let qi = 0; qi < queues.length; qi++) { const queueDef = queues[qi]!; const candidates = readyQueue.filter( - (rt) => getQueueIndex(rt.currentPriority, queues) === qi, + (rt) => MultilevelQueueAlgorithm.getQueueIndex(rt.currentPriority, queues) === qi, ); - const selected = selectWithinQueue(candidates, queueDef); + const selected = MultilevelQueueAlgorithm.selectWithinQueue(candidates, queueDef); if (selected !== null) return selected; } return null; - }, + } - shouldPreempt(current, candidate, config): boolean { - const queues = config.mlqQueues ?? DEFAULT_QUEUES; - const currentQueueIdx = getQueueIndex(current.currentPriority, queues); - const candidateQueueIdx = getQueueIndex(candidate.currentPriority, queues); - // Preempt only if the candidate belongs to a strictly higher-priority queue. + shouldPreempt( + current: ProcessRuntime, + candidate: ProcessRuntime, + config: SchedulerConfig, + ): boolean { + const queues = config.mlqQueues ?? MultilevelQueueAlgorithm.DEFAULT_QUEUES; + const currentQueueIdx = MultilevelQueueAlgorithm.getQueueIndex(current.currentPriority, queues); + const candidateQueueIdx = MultilevelQueueAlgorithm.getQueueIndex(candidate.currentPriority, queues); + // Preempta apenas se o candidato pertence a uma fila de prioridade estritamente maior. return candidateQueueIdx < currentQueueIdx; - }, + } - isQuantumExpired(runtime, config): boolean { - const queues = config.mlqQueues ?? DEFAULT_QUEUES; - const queueIdx = getQueueIndex(runtime.currentPriority, queues); + isQuantumExpired( + runtime: ProcessRuntime, + config: SchedulerConfig, + ): boolean { + const queues = config.mlqQueues ?? MultilevelQueueAlgorithm.DEFAULT_QUEUES; + const queueIdx = MultilevelQueueAlgorithm.getQueueIndex(runtime.currentPriority, queues); const queueDef = queues[queueIdx]; if (!queueDef) return false; return queueDef.algorithm === "RR" && runtime.quantumRemaining <= 0; - }, -}; + } +} diff --git a/src/core/algorithms/priority.ts b/src/core/algorithms/priority.ts index a844b5d..d0bb236 100644 --- a/src/core/algorithms/priority.ts +++ b/src/core/algorithms/priority.ts @@ -1,49 +1,79 @@ import type { ProcessRuntime } from "../types"; -import type { SchedulerAlgorithm } from "./index"; -import { tiebreak } from "./utils"; +import { BaseAlgorithm } from "./base"; +/** + * Comparador interno compartilhado pelas duas variantes de Prioridade. + * Menor número = maior prioridade. Usa tiebreak padrão em caso de empate. + */ function prioritySort(a: ProcessRuntime, b: ProcessRuntime): number { - // Lower number = higher priority if (a.currentPriority !== b.currentPriority) return a.currentPriority - b.currentPriority; - return tiebreak(a, b); + return BaseAlgorithm.tiebreak(a, b); } -/** - * Priority Non-Preemptive - * Selects process with lowest priority number; does not interrupt running process. - */ -export const priorityNp: SchedulerAlgorithm = { - select(readyQueue) { - if (readyQueue.length === 0) return null; - return [...readyQueue].sort(prioritySort)[0] ?? null; - }, - - shouldPreempt() { - return false; - }, - - isQuantumExpired() { - return false; - }, -}; +// ───────────────────────────────────────────────────────────────────────────── /** - * Priority Preemptive - * Preempts running process if a higher-priority (lower number) process arrives. - * Aging is applied by the engine — currentPriority decrements over time. + * Priority Não-Preemptivo + * + * Seleciona o processo com maior prioridade (menor número). Uma vez que + * um processo ocupa a CPU, ele roda até terminar — novos processos de alta + * prioridade precisam esperar. Pode causar inanição (starvation) de processos + * de baixa prioridade. O mecanismo de aging, quando ativado, incrementa + * gradualmente a prioridade de processos em espera. */ -export const priorityP: SchedulerAlgorithm = { - select(readyQueue) { +export class PriorityNonPreemptiveAlgorithm extends BaseAlgorithm { + readonly name = "Escalonamento por Prioridade — Não-Preemptivo"; + readonly description = + "Despacha o processo de maior prioridade (menor número). Não-preemptivo: " + + "o processo atual não é interrompido por novos de alta prioridade. " + + "Pode causar inanição; use aging para mitigar."; + readonly isPreemptiveCapable = false; + readonly usesQuantum = false; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { if (readyQueue.length === 0) return null; return [...readyQueue].sort(prioritySort)[0] ?? null; - }, + } - shouldPreempt(current, candidate) { + shouldPreempt(): boolean { + return false; + } + + isQuantumExpired(): boolean { + return false; + } +} + +// ───────────────────────────────────────────────────────────────────────────── + +/** + * Priority Preemptivo + * + * Variante preemptiva: o processo em execução é interrompido imediatamente + * ao chegar um processo com prioridade estritamente maior (número menor). + * Prioridade igual não causa preempção (evita context switches desnecessários). + * O aging, quando ativado no engine, decrementa `currentPriority` a cada + * intervalo, prevenindo inanição de processos de baixa prioridade. + */ +export class PriorityPreemptiveAlgorithm extends BaseAlgorithm { + readonly name = "Escalonamento por Prioridade — Preemptivo"; + readonly description = + "Preempta o processo em execução quando um de maior prioridade fica pronto. " + + "Prioridade igual não gera preempção. Suporta aging para evitar inanição."; + readonly isPreemptiveCapable = true; + readonly usesQuantum = false; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { + if (readyQueue.length === 0) return null; + return [...readyQueue].sort(prioritySort)[0] ?? null; + } + + shouldPreempt(current: ProcessRuntime, candidate: ProcessRuntime): boolean { return candidate.currentPriority < current.currentPriority; - }, + } - isQuantumExpired() { + isQuantumExpired(): boolean { return false; - }, -}; + } +} diff --git a/src/core/algorithms/priority_rr.ts b/src/core/algorithms/priority_rr.ts index 82b42a7..7eabe04 100644 --- a/src/core/algorithms/priority_rr.ts +++ b/src/core/algorithms/priority_rr.ts @@ -1,49 +1,59 @@ -import type { SchedulerAlgorithm } from "./index"; +import type { ProcessRuntime } from "../types"; +import { BaseAlgorithm } from "./base"; /** * Priority Round Robin (PRIORITY_RR) * - * Mimics real-OS scheduling (Windows priority bands, POSIX SCHED_RR): + * Combina escalonamento por prioridade com rodízio dentro de cada banda: * - * - The ready queue is conceptually divided into priority bands. - * - The scheduler always dispatches from the highest-priority band - * (lowest numeric value), leaving lower-priority processes waiting. - * - Within the same priority band, processes share the CPU via round-robin - * with the configured quantum — fairness among equals. - * - A running process is preempted immediately when a STRICTLY higher-priority - * process becomes ready (arrival or I/O completion). - * - Quantum expiry only rotates within the same priority band; it does not - * allow a lower-priority process to run while a same-priority one is waiting. - * - Compatible with the aging mechanism: as low-priority processes age their - * currentPriority decreases, eventually entering a higher-priority band. + * - A fila de prontos é dividida conceitualmente em bandas de prioridade. + * - O escalonador sempre despacha da banda de maior prioridade (menor número), + * mantendo processos de menor prioridade em espera. + * - Dentro de uma mesma banda, os processos compartilham a CPU via round-robin + * com o quantum configurado — garantindo justiça entre iguais. + * - Preempção ocorre imediatamente ao chegar um processo de prioridade + * estritamente maior; prioridade igual é tratada pelo quantum. + * - Compatível com aging: ao diminuir `currentPriority`, processos de baixa + * prioridade eventualmente sobem de banda, prevenindo inanição. + * + * Simula o comportamento de SOs reais como Windows (priority bands) + * e POSIX SCHED_RR. */ -export const priorityRr: SchedulerAlgorithm = { - select(readyQueue) { +export class PriorityRoundRobinAlgorithm extends BaseAlgorithm { + readonly name = "Priority Round Robin (PRR)"; + readonly description = + "Combina prioridade com round-robin dentro de cada banda. A banda mais " + + "prioritária sempre executa primeiro; dentro da mesma banda, os processos " + + "se revezam pelo quantum. Simula o escalonamento de SOs reais (Windows, POSIX)."; + readonly isPreemptiveCapable = true; + readonly usesQuantum = true; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { if (readyQueue.length === 0) return null; - // Find the highest priority level (smallest numeric value) present. + // Localiza o nível de prioridade mais alto (menor valor numérico) presente. let bestPriority = Infinity; for (const rt of readyQueue) { if (rt.currentPriority < bestPriority) bestPriority = rt.currentPriority; } - // Within that band, return the first process (FIFO insertion order). - // The engine maintains insertion order, so this gives round-robin rotation - // after quantum expiry: the expired process goes to the tail, the next - // same-priority process is now at the head. + // Dentro da banda, retorna o primeiro processo (ordem de inserção = FIFO). + // O engine insere processos expirados no final da fila, garantindo a rotação + // round-robin: o processo que esgotou o quantum vai para o fim, + // o próximo da mesma prioridade assume. return readyQueue.find(rt => rt.currentPriority === bestPriority) ?? null; - }, + } - // Preempt ONLY for strictly higher priority. - // Same-priority candidates are handled by quantum expiry — no unnecessary - // context switches within a priority band. - shouldPreempt(current, candidate) { + // Preempta APENAS por prioridade estritamente maior. + // Processos de mesma prioridade são tratados pelo mecanismo de quantum — + // evita trocas de contexto desnecessárias dentro da mesma banda. + shouldPreempt(current: ProcessRuntime, candidate: ProcessRuntime): boolean { return candidate.currentPriority < current.currentPriority; - }, + } - // Quantum expiry drives round-robin rotation within a priority band, - // exactly like plain Round Robin. - isQuantumExpired(runtime) { + // A expiração do quantum conduz a rotação round-robin dentro da banda, + // exatamente como no Round Robin puro. + isQuantumExpired(runtime: ProcessRuntime): boolean { return runtime.quantumRemaining <= 0; - }, -}; + } +} diff --git a/src/core/algorithms/rr.ts b/src/core/algorithms/rr.ts index c1b4ac6..dc5f9f2 100644 --- a/src/core/algorithms/rr.ts +++ b/src/core/algorithms/rr.ts @@ -1,22 +1,36 @@ -import type { SchedulerAlgorithm } from "./index"; +import type { ProcessRuntime } from "../types"; +import { BaseAlgorithm } from "./base"; /** * RR — Round Robin - * FIFO queue with a configurable quantum. - * select() returns the front of the queue (insertion-order maintained by engine). - * Preemption is driven by quantum expiry, not by a better candidate. + * + * Mantém a fila de prontos como FIFO e concede a cada processo uma fatia + * de tempo (quantum). Ao esgotar o quantum, o processo vai para o fim da + * fila e o próximo assume a CPU. Garante justiça e baixo tempo de resposta, + * ao custo de maior tempo de turnaround para processos curtos. + * + * A rotação é garantida pelo engine: ao expirar o quantum, o processo é + * reinserido no final da fila — select() simplesmente retorna o primeiro. */ -export const rr: SchedulerAlgorithm = { - select(readyQueue) { +export class RoundRobinAlgorithm extends BaseAlgorithm { + readonly name = "Round Robin (RR)"; + readonly description = + "Fila FIFO com quantum configurável. Cada processo recebe uma fatia " + + "de tempo igual. Garante justiça e baixo tempo de resposta, mas pode " + + "aumentar o turnaround de processos longos."; + readonly isPreemptiveCapable = false; // preempção é por expiração de quantum, não por candidato + readonly usesQuantum = true; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { return readyQueue[0] ?? null; - }, + } - // RR does not preempt based on candidate priority; quantum expiry handles it. - shouldPreempt() { + // RR não preempta por candidato mais prioritário; a troca ocorre via quantum. + shouldPreempt(): boolean { return false; - }, + } - isQuantumExpired(runtime) { + isQuantumExpired(runtime: ProcessRuntime): boolean { return runtime.quantumRemaining <= 0; - }, -}; + } +} diff --git a/src/core/algorithms/sjf.ts b/src/core/algorithms/sjf.ts index 6578bba..6b26b3e 100644 --- a/src/core/algorithms/sjf.ts +++ b/src/core/algorithms/sjf.ts @@ -1,48 +1,79 @@ import type { ProcessRuntime } from "../types"; -import type { SchedulerAlgorithm } from "./index"; -import { tiebreak } from "./utils"; +import { BaseAlgorithm } from "./base"; +/** + * Comparador interno compartilhado pelas duas variantes do SJF. + * Ordena por menor burst restante; usa tiebreak padrão em caso de empate. + */ function sjfSort(a: ProcessRuntime, b: ProcessRuntime): number { if (a.remainingBurst !== b.remainingBurst) return a.remainingBurst - b.remainingBurst; - return tiebreak(a, b); + return BaseAlgorithm.tiebreak(a, b); } -/** - * SJF Non-Preemptive — Shortest Job First - * Selects the process with the smallest remaining burst; no preemption. - */ -export const sjfNp: SchedulerAlgorithm = { - select(readyQueue) { - if (readyQueue.length === 0) return null; - return [...readyQueue].sort(sjfSort)[0] ?? null; - }, - - shouldPreempt() { - return false; - }, - - isQuantumExpired() { - return false; - }, -}; +// ───────────────────────────────────────────────────────────────────────────── /** - * SRTF — Shortest Remaining Time First (SJF Preemptive) - * At each tick, preempts if a ready process has strictly smaller remainingBurst. - * Equal remaining burst → no preemption (avoids unnecessary context switches). + * SJF Não-Preemptivo — Shortest Job First + * + * Seleciona o processo com o menor burst de CPU restante. Uma vez que um + * processo ocupa a CPU, ele roda até terminar (não pode ser interrompido). + * Ótimo em tempo médio de espera, mas pode causar inanição (starvation) + * de processos longos se processos curtos chegam continuamente. */ -export const srtf: SchedulerAlgorithm = { - select(readyQueue) { +export class SJFNonPreemptiveAlgorithm extends BaseAlgorithm { + readonly name = "Shortest Job First — Não-Preemptivo (SJF)"; + readonly description = + "Seleciona o processo com menor burst restante. Não-preemptivo: " + + "o processo rodando não pode ser interrompido. Minimiza o tempo " + + "médio de espera, mas pode causar inanição de processos longos."; + readonly isPreemptiveCapable = false; + readonly usesQuantum = false; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { if (readyQueue.length === 0) return null; return [...readyQueue].sort(sjfSort)[0] ?? null; - }, + } - shouldPreempt(current, candidate) { + shouldPreempt(): boolean { + return false; + } + + isQuantumExpired(): boolean { + return false; + } +} + +// ───────────────────────────────────────────────────────────────────────────── + +/** + * SRTF — Shortest Remaining Time First (SJF Preemptivo) + * + * Variante preemptiva do SJF. A cada tick, se um processo recém-chegado + * tem burst restante estritamente menor que o processo em execução, ocorre + * preempção. Burst igual não gera troca (evita context switches desnecessários). + * Produz o menor tempo médio de espera possível entre todos os algoritmos, + * porém com maior overhead de trocas de contexto. + */ +export class SRTFAlgorithm extends BaseAlgorithm { + readonly name = "Shortest Remaining Time First (SRTF)"; + readonly description = + "Variante preemptiva do SJF. Preempta o processo rodando sempre que " + + "um processo mais curto fica disponível. Otimiza o tempo médio de " + + "espera, mas gera mais trocas de contexto."; + readonly isPreemptiveCapable = true; + readonly usesQuantum = false; + + select(readyQueue: readonly ProcessRuntime[]): ProcessRuntime | null { + if (readyQueue.length === 0) return null; + return [...readyQueue].sort(sjfSort)[0] ?? null; + } + + shouldPreempt(current: ProcessRuntime, candidate: ProcessRuntime): boolean { return candidate.remainingBurst < current.remainingBurst; - }, + } - isQuantumExpired() { + isQuantumExpired(): boolean { return false; - }, -}; + } +} diff --git a/src/core/engine.ts b/src/core/engine.ts index 7e0659d..dd38ac3 100644 --- a/src/core/engine.ts +++ b/src/core/engine.ts @@ -6,24 +6,52 @@ import type { StateLabel, } from "./types"; import { algorithms } from "./algorithms/index"; -import type { SchedulerAlgorithm } from "./algorithms/index"; - -// ============================================================ -// SimulationEngine -// ============================================================ +import type { BaseAlgorithm } from "./algorithms/index"; +/** + * SimulationEngine — Núcleo de execução da simulação de escalonamento. + * + * Responsável por avançar o simulador tick a tick, aplicando o algoritmo + * de escalonamento configurado e mantendo o estado de todos os processos. + * + * Ciclo de vida de um único tick (método `step()`): + * 1. Chegada — processos cujo `arrivalTime` é igual ao tick atual + * transitam New → Ready e entram na fila de prontos. + * 2. Preempção — o algoritmo decide se o processo em CPU deve ceder + * lugar a um candidato mais prioritário. + * 3. Despacho — seleciona e despacha o próximo processo (com overhead + * de troca de contexto, se configurado). + * 4. Snapshot — captura o estado de todos os processos neste tick. + * 5. Passagem do tempo — decrementa bursts, acumula tempos de CPU/IO/espera. + * 6. Aging — decrementa prioridade dos processos em espera prolongada. + * 7. Conclusões — trata término de bursts de CPU e IO; avança para o + * próximo burst ou termina o processo. + * + * Uso típico: + * ```ts + * const engine = new SimulationEngine(processes, config); + * const ticks = engine.runAll(); // executa até todos os processos terminarem + * ``` + * + * Invariante: após `runAll()`, `isFinished` é `true` e todos os runtimes + * têm `state === "Terminated"`. + */ export class SimulationEngine { + // ─── Campos privados ────────────────────────────────────────────────────── + private readonly _processes: Process[]; private readonly _config: SchedulerConfig; - private readonly _algorithm: SchedulerAlgorithm; + private readonly _algorithm: BaseAlgorithm; - private _tick: number; // starts at -1; incremented at top of step() + private _tick: number; // começa em -1; incrementado no início de step() private _runtimes: Map; private _cpuProcess: ProcessRuntime | null; - private _readyQueue: ProcessRuntime[]; // ordered array (FIFO for RR) + private _readyQueue: ProcessRuntime[]; // array ordenado (FIFO para RR) private _ioQueue: ProcessRuntime[]; private _contextSwitchRemaining: number; - private _prevCpuProcessId: string | null; // track context switch detection + private _prevCpuProcessId: string | null; // para detectar troca de contexto + + // ─── Construtor ─────────────────────────────────────────────────────────── constructor(processes: Process[], config: SchedulerConfig) { if (processes.length === 0) throw new Error("At least one process required"); @@ -36,20 +64,75 @@ export class SimulationEngine { this._ioQueue = []; this._contextSwitchRemaining = 0; this._prevCpuProcessId = null; - this._runtimes = new Map(processes.map((p) => [p.id, initRuntime(p, config)])); + this._runtimes = new Map( + processes.map((p) => [p.id, SimulationEngine._initRuntime(p, config)]), + ); } - // ---------------------------------------------------------- - // Public API - // ---------------------------------------------------------- + // ─── API pública ────────────────────────────────────────────────────────── - /** Advance one tick; return snapshot of that tick. */ + /** + * Avança a simulação por um tick e retorna o snapshot do estado neste tick. + * + * Lança um erro se a simulação já tiver terminado (`isFinished === true`). + * O número do tick é incrementado no início; o primeiro tick válido é 0. + */ step(): SimTick { if (this.isFinished) throw new Error("Simulation is already finished"); this._tick++; - // 1. Arrivals + this._handleArrivals(); // 1. New → Ready para quem chega agora + this._checkPreemption(); // 2. Preempta CPU se candidato melhor chegou + this._dispatchNext(); // 3. Despacha próximo (ou inicia context switch) + const snapshot = this._snapshot(); // 4. Captura estado DURANTE este tick + this._advanceTime(); // 5. Decrementa bursts, acumula métricas + this._applyAging(); // 6. Aging de prioridade (se habilitado) + this._handleCpuCompletion(); // 7a. Finaliza burst/quantum de CPU + this._handleIoCompletions(); // 7b. Finaliza bursts de I/O + + return snapshot; + } + + /** Executa até o fim e retorna todos os snapshots de tick. */ + runAll(): SimTick[] { + const results: SimTick[] = []; + while (!this.isFinished) { + results.push(this.step()); + if (results.length > 10_000) { + throw new Error("Simulation exceeded 10,000 ticks — check for infinite loop"); + } + } + return results; + } + + /** Verdadeiro quando todos os processos estão no estado "Terminated". */ + get isFinished(): boolean { + for (const rt of this._runtimes.values()) { + if (rt.state !== "Terminated") return false; + } + return true; + } + + /** Número do tick atual (−1 antes do primeiro `step()`). */ + get currentTick(): number { + return this._tick; + } + + /** Array com o estado de runtime de todos os processos. */ + get runtimeStates(): ProcessRuntime[] { + return Array.from(this._runtimes.values()); + } + + // ─── Fases do ciclo de simulação ────────────────────────────────────────── + + /** + * Fase 1 — Chegada de processos. + * + * Processos cujo `arrivalTime` é igual ao tick atual transitam do estado + * "New" para "Ready" e são inseridos na fila de prontos. + */ + private _handleArrivals(): void { for (const p of this._processes) { const rt = this._runtimes.get(p.id)!; if (p.arrivalTime === this._tick && rt.state === "New") { @@ -57,55 +140,79 @@ export class SimulationEngine { this._readyQueue.push(rt); } } + } - // 2. Preemption & Quantum Check (from previous tick's state) - if (this._cpuProcess !== null && this._readyQueue.length > 0) { - const candidate = this._algorithm.select(this._readyQueue, this._config); - if ( - candidate !== null && - this._algorithm.shouldPreempt(this._cpuProcess, candidate, this._config) - ) { - const cpu = this._cpuProcess; - this._transition(cpu, "Ready"); - this._readyQueue.push(cpu); - this._cpuProcess = null; - } + /** + * Fase 2 — Verificação de preempção. + * + * Consulta o algoritmo: se houver um candidato na fila de prontos que deva + * preemptar o processo em CPU, o processo atual retorna à fila de prontos + * e `_cpuProcess` é zerado. Chamado após a chegada para que processos + * recém-chegados possam imediatamente preemptar. + */ + private _checkPreemption(): void { + if (this._cpuProcess === null || this._readyQueue.length === 0) return; + const candidate = this._algorithm.select(this._readyQueue, this._config); + if ( + candidate !== null && + this._algorithm.shouldPreempt(this._cpuProcess, candidate, this._config) + ) { + const cpu = this._cpuProcess; + this._transition(cpu, "Ready"); + this._readyQueue.push(cpu); + this._cpuProcess = null; } + } - // 3. Dispatch / Context Switch - if (this._contextSwitchRemaining > 0) { - // Doing context switch this tick - // We don't dispatch. + /** + * Fase 3 — Despacho / troca de contexto. + * + * Se um context switch estiver em andamento, nenhum processo é despachado + * neste tick. Caso contrário, e se a CPU estiver ociosa com processos + * prontos, o algoritmo seleciona o próximo processo: + * + * - Se houver overhead de troca de contexto configurado e o processo + * selecionado for diferente do último, o processo volta ao início da + * fila e o contador de context-switch é iniciado. + * - Caso contrário, o processo é despachado imediatamente para a CPU. + */ + private _dispatchNext(): void { + if (this._contextSwitchRemaining > 0) return; + if (this._cpuProcess !== null || this._readyQueue.length === 0) return; + + const next = this._algorithm.select(this._readyQueue, this._config); + if (next === null) return; + + const idx = this._readyQueue.indexOf(next); + if (idx !== -1) this._readyQueue.splice(idx, 1); + + if ( + this._config.contextSwitchTime > 0 && + this._prevCpuProcessId !== null && + this._prevCpuProcessId !== next.processId + ) { + this._readyQueue.unshift(next); + this._contextSwitchRemaining = this._config.contextSwitchTime; + this._prevCpuProcessId = next.processId; } else { - if (this._cpuProcess === null && this._readyQueue.length > 0) { - const next = this._algorithm.select(this._readyQueue, this._config); - if (next !== null) { - const idx = this._readyQueue.indexOf(next); - if (idx !== -1) this._readyQueue.splice(idx, 1); - - if ( - this._config.contextSwitchTime > 0 && - this._prevCpuProcessId !== null && - this._prevCpuProcessId !== next.processId - ) { - this._readyQueue.unshift(next); - this._contextSwitchRemaining = this._config.contextSwitchTime; - this._prevCpuProcessId = next.processId; - } else { - if (next.startTick === null) next.startTick = this._tick; - next.quantumRemaining = this._config.quantum; - this._transition(next, "Running"); - this._prevCpuProcessId = next.processId; - this._cpuProcess = next; - } - } - } + if (next.startTick === null) next.startTick = this._tick; + next.quantumRemaining = this._config.quantum; + this._transition(next, "Running"); + this._prevCpuProcessId = next.processId; + this._cpuProcess = next; } + } - // 4. Take Snapshot representing what happens DURING this tick - const snapshot = this._snapshot(); - - // 5. Passage of Time (Simulate execution for 1 tick) + /** + * Fase 5 — Passagem do tempo. + * + * Simula a execução de 1 tick: + * - Decrementa o contador de context-switch restante (se ativo). + * - Decrementa o burst restante do processo em CPU e acumula cpuTime/quantum. + * - Decrementa o burst restante de cada processo em I/O e acumula ioTime. + * - Incrementa o waitingTime de todos os processos na fila de prontos. + */ + private _advanceTime(): void { if (this._contextSwitchRemaining > 0) { this._contextSwitchRemaining--; } @@ -125,44 +232,80 @@ export class SimulationEngine { for (const rt of this._readyQueue) { rt.waitingTime++; } + } - // 6. Aging (Priority) + /** + * Fase 6 — Aging (envelhecimento de prioridade). + * + * Quando o aging está habilitado, a cada `agingInterval` ticks o valor de + * `currentPriority` de todos os processos na fila de prontos é decrementado + * em 1 (até o mínimo de 1). Isso previne inanição em algoritmos de prioridade. + * + * Não é executado no tick 0 para evitar decremento prematuro. + */ + private _applyAging(): void { if ( - this._config.agingEnabled && - this._tick > 0 && - this._tick % this._config.agingInterval === 0 + !this._config.agingEnabled || + this._tick === 0 || + this._tick % this._config.agingInterval !== 0 ) { - for (const rt of this._readyQueue) { - rt.currentPriority = Math.max(1, rt.currentPriority - 1); - } + return; } + for (const rt of this._readyQueue) { + rt.currentPriority = Math.max(1, rt.currentPriority - 1); + } + } - // 7. Process completions / transition to next state for NEXT tick - if (this._cpuProcess !== null) { - const cpu = this._cpuProcess; - if (cpu.remainingBurst === 0) { - this._advanceBurst(cpu); - const process = this._processes.find((p) => p.id === cpu.processId)!; - const nextBurst = process.bursts[cpu.burstIndex]; - if (nextBurst !== undefined && nextBurst.type === "io") { - this._transition(cpu, "Waiting"); - this._ioQueue.push(cpu); - } else if (nextBurst !== undefined && nextBurst.type === "cpu") { - this._transition(cpu, "Ready"); - this._readyQueue.push(cpu); - } else { - this._transition(cpu, "Terminated"); - cpu.finishTick = this._tick + 1; - } - this._cpuProcess = null; - } else if (this._algorithm.isQuantumExpired(cpu, this._config)) { + /** + * Fase 7a — Conclusão de burst de CPU. + * + * Após a passagem do tempo, verifica se o processo em CPU terminou seu burst + * ou esgotou o quantum: + * + * - Burst zerado: avança para o próximo burst do processo. + * · Se o próximo for I/O → transita para "Waiting" e entra na ioQueue. + * · Se o próximo for CPU → retorna à fila de prontos ("Ready"). + * · Se não houver próximo → termina o processo ("Terminated"). + * + * - Quantum expirado (sem término de burst): retorna à fila de prontos. + */ + private _handleCpuCompletion(): void { + if (this._cpuProcess === null) return; + + const cpu = this._cpuProcess; + + if (cpu.remainingBurst === 0) { + this._advanceBurst(cpu); + const process = this._processes.find((p) => p.id === cpu.processId)!; + const nextBurst = process.bursts[cpu.burstIndex]; + if (nextBurst !== undefined && nextBurst.type === "io") { + this._transition(cpu, "Waiting"); + this._ioQueue.push(cpu); + } else if (nextBurst !== undefined && nextBurst.type === "cpu") { this._transition(cpu, "Ready"); this._readyQueue.push(cpu); - this._cpuProcess = null; + } else { + this._transition(cpu, "Terminated"); + cpu.finishTick = this._tick + 1; } + this._cpuProcess = null; + } else if (this._algorithm.isQuantumExpired(cpu, this._config)) { + this._transition(cpu, "Ready"); + this._readyQueue.push(cpu); + this._cpuProcess = null; } + } - // IO completions + /** + * Fase 7b — Conclusão de bursts de I/O. + * + * Percorre a ioQueue e, para cada processo cujo burst de I/O zerou: + * - Se houver próximo burst → transita para "Ready" e insere na readyQueue. + * - Caso contrário → termina o processo ("Terminated"). + * + * Processos ainda com I/O pendente permanecem na ioQueue. + */ + private _handleIoCompletions(): void { const nextIoQueue: ProcessRuntime[] = []; for (const rt of this._ioQueue) { if (rt.remainingBurst === 0) { @@ -180,45 +323,22 @@ export class SimulationEngine { } } this._ioQueue = nextIoQueue; - - return snapshot; } - /** Run to completion; return all tick snapshots. */ - runAll(): SimTick[] { - const results: SimTick[] = []; - while (!this.isFinished) { - results.push(this.step()); - if (results.length > 10_000) { - throw new Error("Simulation exceeded 10,000 ticks — check for infinite loop"); - } - } - return results; - } - - get isFinished(): boolean { - for (const rt of this._runtimes.values()) { - if (rt.state !== "Terminated") return false; - } - return true; - } - - get currentTick(): number { - return this._tick; - } - - get runtimeStates(): ProcessRuntime[] { - return Array.from(this._runtimes.values()); - } - - // ---------------------------------------------------------- - // Private helpers - // ---------------------------------------------------------- + // ─── Helpers internos ───────────────────────────────────────────────────── + /** + * Aplica uma transição de estado a um runtime, atualizando `state`. + * Centraliza todas as transições para facilitar rastreamento e depuração. + */ private _transition(rt: ProcessRuntime, state: StateLabel): void { rt.state = state; } + /** + * Avança o índice de burst de um runtime e atualiza `remainingBurst` + * com a duração do próximo burst. Se não houver próximo burst, `remainingBurst` é 0. + */ private _advanceBurst(rt: ProcessRuntime): void { rt.burstIndex++; const process = this._processes.find((p) => p.id === rt.processId)!; @@ -226,6 +346,11 @@ export class SimulationEngine { rt.remainingBurst = nextBurst !== undefined ? nextBurst.duration : 0; } + /** + * Captura o estado instantâneo de todos os processos no tick atual. + * Se um context switch estiver em andamento, `cpuProcess` é null e + * `ctxSwitchForProcess` identifica o processo prestes a executar. + */ private _snapshot(): SimTick { const states: Record = {}; for (const [id, rt] of this._runtimes) { @@ -244,30 +369,32 @@ export class SimulationEngine { : null, }; } -} -// ============================================================ -// Helper: initialise a ProcessRuntime from a Process -// ============================================================ + // ─── Inicialização ──────────────────────────────────────────────────────── -function initRuntime(p: Process, config: SchedulerConfig): ProcessRuntime { - const firstBurst = p.bursts[0]; - if (firstBurst === undefined || firstBurst.type !== "cpu") { - throw new Error(`Process ${p.id}: first burst must be a CPU burst`); + /** + * Inicializa o estado de runtime de um processo a partir de sua definição. + * O primeiro burst deve ser do tipo "cpu"; caso contrário, um erro é lançado. + */ + private static _initRuntime(p: Process, config: SchedulerConfig): ProcessRuntime { + const firstBurst = p.bursts[0]; + if (firstBurst === undefined || firstBurst.type !== "cpu") { + throw new Error(`Process ${p.id}: first burst must be a CPU burst`); + } + return { + processId: p.id, + state: "New", + remainingBurst: firstBurst.duration, + burstIndex: 0, + arrivalTick: p.arrivalTime, + startTick: null, + finishTick: null, + waitingTime: 0, + cpuTime: 0, + ioTime: 0, + responseTime: null, + quantumRemaining: config.quantum, + currentPriority: p.priority, + }; } - return { - processId: p.id, - state: "New", - remainingBurst: firstBurst.duration, - burstIndex: 0, - arrivalTick: p.arrivalTime, - startTick: null, - finishTick: null, - waitingTime: 0, - cpuTime: 0, - ioTime: 0, - responseTime: null, - quantumRemaining: config.quantum, - currentPriority: p.priority, - }; }
Processo Arrival Start FinishResponseTurnaroundWaitingCPU TimeI/O TimeResponseTurnaroundWaitingCPUI/O CPU% Bound
{ style={{ backgroundColor: color }} /> {proc?.pid !== undefined && ( - + #{proc.pid} )} {name}
{m.arrivalTime}{m.startTick}{m.finishTick}{m.responseTime}{m.turnaroundTime}{m.waitingTime}{m.cpuTime}{m.ioTime}{m.cpuUtilization.toFixed(1)}%{m.arrivalTime}{m.startTick}{m.finishTick} + + + + + + + + + + +
+
+
+
+ + {m.cpuUtilization.toFixed(0)}% + +
+
{m.boundType}

e|N7=K;zI=kSDRS6|*zIe2 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 ejL-Ot&-jeb_>9l^jL-PI **Na lista de processos:** estimativa calculada sobre os bursts declarados (antes da simulação). +> **Na tabela de métricas:** classificação calculada sobre os tempos reais registrados. + +--- + +## Gráficos (aba "Gráfico") + +### Perfil Comparativo — Radar Chart + +Exibido quando há **2 ou mais processos**. Cada eixo representa uma dimensão de tempo, normalizada de 0–100% em relação ao maior valor dessa dimensão entre todos os processos: + +| Eixo | Significado | +|------|------------| +| **Turnaround** | Tempo total de vida relativo | +| **Response** | Tempo até a primeira CPU relativo | +| **Waiting** | Tempo na fila Ready relativo | +| **CPU Time** | Uso de CPU relativo | +| **I/O Time** | Uso de I/O relativo | + +Cada processo é desenhado como um polígono colorido (a cor configurada no processo). Polígonos mais "amplos" indicam processos com tempos maiores nas dimensões correspondentes. O radar é ideal para identificar **diferenças de perfil** entre processos — por exemplo, um processo CPU Bound terá o eixo CPU Time muito maior que o eixo I/O Time. + +### Breakdown por Processo — Stacked Bar Chart + +Sempre exibido. Cada barra representa um processo, com os segmentos empilhados: + +- **Âmbar** — Waiting Time +- **Verde** — CPU Time +- **Ciano** — I/O Time + +A altura total de cada barra equivale ao **Turnaround Time** do processo. + +--- + +## Exemplo + +Considere três processos com os seguintes bursts: + +| Processo | Bursts | cpuTime | ioTime | cpuRatio | Classificação | +|----------|--------|:-------:|:------:|:--------:|:-------------:| +| P1 | CPU:8, IO:1, CPU:1 | 9 | 1 | 90% | CPU Bound | +| P2 | CPU:1, IO:8, CPU:1 | 2 | 8 | 20% | I/O Bound | +| P3 | CPU:4, IO:2, CPU:4 | 8 | 2 | 80% | CPU Bound | diff --git a/src/components/MetricsPanel/GlobalMetrics.tsx b/src/components/MetricsPanel/GlobalMetrics.tsx index 7d39215..1f2899c 100644 --- a/src/components/MetricsPanel/GlobalMetrics.tsx +++ b/src/components/MetricsPanel/GlobalMetrics.tsx @@ -1,3 +1,11 @@ +import { + Clock, + Timer, + Hourglass, + Cpu, + Zap, + Activity, +} from 'lucide-react'; import type { GlobalMetrics as GlobalMetricsType } from '@core/types'; interface GlobalMetricsProps { @@ -8,14 +16,36 @@ interface MetricCardProps { label: string; value: string; sub?: string; - accent?: string; + accentColor: string; // hex or CSS color for the bar fill + accentClass: string; // tailwind text class for the value + icon: React.ReactNode; + barPct?: number; // 0–100; undefined = no bar } -const MetricCard = ({ label, value, sub, accent = 'text-blue-300' }: MetricCardProps) => ( -