Nesta aula, continuamos nosso estudo sobre sistemas operacionais, agora focando nos processos e no escalonamento da CPU. Processos são a unidade básica de execução em um sistema operacional moderno. Entender como eles são criados, gerenciados e escalonados é fundamental para compreender o comportamento de qualquer sistema computacional. Abordaremos desde os conceitos fundamentais até algoritmos clássicos de escalonamento, com exemplos práticos.

O que é um processo?

Um processo é um programa em execução. Enquanto um programa é uma entidade estática armazenada em disco (um arquivo executável), um processo é uma entidade dinâmica que possui um contexto de execução completo: contador de programa (PC), pilha, registradores da CPU, espaço de endereçamento de memória e recursos alocados, como arquivos abertos e conexões de rede. Cada processo é identificado exclusivamente por um número chamado PID (Process Identifier). O sistema operacional mantém uma estrutura chamada tabela de processos para gerenciar todos os processos ativos. Quando um programa é executado, o sistema cria um novo processo, carrega o código na memória e inicia sua execução.

Estados de um processo

Durante seu ciclo de vida, um processo pode estar em diferentes estados. Os estados clássicos são: novo (new), quando o processo está sendo criado; pronto (ready), quando está carregado na memória e aguardando a CPU; executando (running), quando está sendo executado pela CPU; bloqueado (waiting ou blocked), quando está esperando por algum evento (como término de operação de E/S, disponibilidade de recurso, ou sinal); e terminado (terminated), quando finaliza sua execução. O escalonador de curto prazo (CPU scheduler) é o componente responsável por selecionar um processo do estado pronto para executar. Existem também estados adicionais, como suspenso (swapped out), mas vamos focar nos básicos.

Bloco de Controle de Processo (PCB)

Cada processo é representado no kernel do sistema operacional por uma estrutura de dados chamada Process Control Block (PCB). O PCB é fundamental para o gerenciamento de processos. Ele contém informações como: identificador do processo (PID), estado atual, contador de programa, registradores da CPU (que devem ser salvos durante uma troca de contexto), informações de escalonamento (prioridade, ponteiros para filas), informações de gerenciamento de memória (tabela de páginas, limites), lista de arquivos abertos, e outros dados específicos do processo. O PCB é criado quando o processo é criado e é atualizado a cada transição de estado. A troca de contexto (context switch) é a operação de salvar o PCB do processo atual e carregar o PCB do próximo processo a ser executado. Esse custo é uma consideração importante no projeto de escalonadores.

Escalonamento de Processos

O escalonamento é a atividade de decidir qual processo pronto será executado pela CPU. O escalonador de curto prazo é invocado sempre que a CPU fica ociosa ou quando ocorre uma interrupção de timer (no caso de escalonamento preemptivo). Os principais critérios de escalonamento incluem: utilização da CPU (manter a CPU ocupada o máximo possível), throughput (número de processos completados por unidade de tempo), tempo de turnaround (tempo total desde a submissão até a conclusão), tempo de espera (tempo total gasto na fila de prontos) e tempo de resposta (tempo desde a submissão até a primeira resposta). O escalonamento preemptivo permite que o sistema operacional interrompa um processo em execução para dar a CPU a outro, geralmente baseado em um timer. O escalonamento não preemptivo depende de o processo liberar a CPU voluntariamente (ao terminar ou bloquear).

Algoritmos de Escalonamento

Vamos revisar os algoritmos clássicos:

  • First-Come, First-Served (FCFS): implementa uma fila FIFO. Simples, mas o tempo médio de espera pode ser alto. Exemplo: se um processo longo chegar primeiro, todos os processos curtos atrás dele sofrerão alto tempo de espera (efeito comboio).
  • Shortest Job First (SJF): seleciona o processo com menor tempo de execução estimado. Minimiza o tempo médio de espera, mas precisa conhecer o tempo de execução futuro, o que é difícil. A versão preemptiva é chamada Shortest Remaining Time First (SRTF).
  • Round Robin (RR): cada processo recebe um quantum de tempo (slice) fixo, tipicamente entre 10 e 100 ms. Após o quantum, se o processo não terminou, ele é colocado no final da fila de prontos. É justo e adequado para sistemas de tempo compartilhado. O desempenho depende do tamanho do quantum: se muito pequeno, muitas trocas de contexto; se muito grande, aproxima-se de FCFS.
  • Escalonamento por Prioridade: cada processo tem uma prioridade. O processo de maior prioridade é executado. Pode ser preemptivo ou não. O principal problema é a starvation (inanição) de processos de baixa prioridade. Solução: envelhecimento (aging), onde a prioridade aumenta com o tempo de espera.
  • Múltiplas Filas: utiliza múltiplas filas com diferentes políticas. Por exemplo, processos de sistema em uma fila de alta prioridade com Round Robin, processos de usuário em filas de prioridade mais baixa com FCFS.

O escalonamento em sistemas modernos é mais complexo. O Linux, por exemplo, utiliza o Completely Fair Scheduler (CFS), que busca distribuir a CPU de forma justa entre todos os processos usando uma árvore rubro-negra e tempo de execução virtual. Isso garante baixa latência para processos interativos e boa utilização para processos batch.

Pontos Principais

  • Processo é um programa em execução com contexto próprio.
  • PCB é a estrutura de dados que representa o processo no kernel.
  • Estados: novo, pronto, executando, bloqueado, terminado.
  • Escalonador de curto prazo decide qual processo pronto executa.
  • Algoritmos: FCFS, SJF, Round Robin, Prioridade; cada um com trade-offs.
  • Escalonamento preemptivo permite melhor responsividade; não preemptivo é mais simples.
  • Tamanho do quantum impacta desempenho no Round Robin.
  • Starvation pode ser mitigada com aging.

Perguntas Frequentes

O que é um processo?
Um processo é um programa em execução, com seu próprio espaço de endereçamento, registradores e recursos alocados pelo sistema operacional.
Qual a diferença entre processo e thread?
Threads são linhas de execução leves que compartilham o mesmo espaço de endereçamento e recursos do processo pai. Processos são isolados entre si, enquanto threads de um mesmo processo compartilham memória.
O que é uma troca de contexto (context switch)?
É o mecanismo pelo qual o sistema operacional salva o estado (PCB) do processo atual e carrega o estado do próximo processo a ser executado. Esse processo tem um custo computacional.
Qual algoritmo de escalonamento é melhor para sistemas interativos?
O Round Robin é geralmente escolhido por sua justiça e baixo tempo de resposta. Sistemas modernos usam variações como CFS (Linux).
O que é starvation?
É a situação em que um processo nunca recebe tempo de CPU porque outros processos com prioridade maior ou tempo mais curto sempre são escolhidos. Técnicas como aging resolvem.

Nesta aula, cobrimos os conceitos fundamentais de processos e escalonamento. Esses tópicos são essenciais para entender como os sistemas operacionais gerenciam múltiplas tarefas de forma eficiente. Na próxima aula, continuaremos com tópicos avançados de gerência de memória.