Nesta aula vamos mergulhar nos conceitos de processos e threads, dois pilares fundamentais dos sistemas operacionais modernos. Entender como o sistema gerencia múltiplas tarefas concorrentes é essencial para quem deseja programar de forma eficiente e compreender o comportamento do computador.

1. O que é um processo?

Um processo pode ser definido como um programa em execução. Ele não se resume apenas ao código, mas inclui também o contexto necessário para sua execução: registradores, variáveis, pilha, descritores de arquivos e outras informações de estado. Quando você abre um editor de textos ou um navegador, o sistema operacional cria um processo para cada aplicação, garantindo que elas não interfiram umas nas outras.

Todo processo possui um ciclo de vida, passando por diferentes estados ao longo de sua execução. Esses estados são gerenciados pelo escalonador (scheduler) do sistema operacional, que decide qual processo deve usar a CPU em cada instante.

2. Estados de um processo

Os principais estados de um processo são:

  • New (novo): o processo está sendo criado, o sistema aloca recursos iniciais.
  • Ready (pronto): o processo está na fila de prontos, aguardando a CPU.
  • Running (executando): o processo está utilizando a CPU.
  • Waiting (bloqueado): o processo está esperando por algum evento externo, como E/S ou sinal.
  • Terminated (terminado): o processo finalizou sua execução e seus recursos são liberados.

Essa máquina de estados permite que o sistema operacional maximize o uso da CPU, alternando rapidamente entre processos e dando a ilusão de paralelismo.

3. Bloco de Controle de Processo (PCB)

Para gerenciar cada processo, o sistema operacional mantém uma estrutura de dados chamada Process Control Block (PCB). O PCB armazena todas as informações relevantes: identificador do processo (PID), estado atual, registradores, contador de programa, prioridade, lista de arquivos abertos e muito mais. Sempre que ocorre uma troca de contexto, o sistema salva o estado do processo atual no seu PCB e carrega o próximo processo a partir do seu PCB.

Essa estrutura é crucial para a implementação de multitarefa e deve ser acessada rapidamente pelo kernel.

4. O que são threads?

Uma thread é a menor unidade de execução dentro de um processo. Enquanto um processo possui seu próprio espaço de endereçamento, as threads de um mesmo processo compartilham o mesmo espaço de memória e recursos. Isso permite que múltiplas tarefas sejam executadas concorrentemente dentro de uma única aplicação, como: uma thread para interface gráfica, outra para processamento de dados e outra para E/S.

Existem dois tipos principais de threads:

  • Threads de nível de usuário: gerenciadas por uma biblioteca no espaço do usuário, sem intervenção do kernel. São mais leves mas podem bloquear o processo inteiro.
  • Threads de nível de kernel: gerenciadas diretamente pelo sistema operacional. Permitem melhor paralelismo, mas exigem mais recursos.

5. Diferenças entre processos e threads

A tabela abaixo resume as principais diferenças:

CaracterísticaProcessoThread
Espaço de endereçamentoPróprio e isoladoCompartilhado com o processo
ComunicaçãoIPC (pipe, socket, etc.)Memória compartilhada (direta)
CriaçãoMais pesada (fork)Mais leve
Troca de contextoCusta mais caroMais rápido
IsolamentoAltoBaixo (pode corromper dados comuns)

A escolha entre processos e threads depende da aplicação: processos oferecem maior segurança e isolamento, enquanto threads proporcionam eficiência e comunicação simplificada.

6. Vantagens do uso de múltiplas threads

A adoção de threads traz diversos benefícios:

  • Capacidade de resposta: uma thread pode continuar interagindo com o usuário enquanto outra realiza uma operação demorada.
  • Compartilhamento de recursos: threads do mesmo processo compartilham memória e descritores, evitando cópias desnecessárias.
  • Economia de recursos: criar uma thread é mais barato que criar um processo.
  • Escalabilidade: em máquinas com múltiplos núcleos, threads podem ser executadas em paralelo, melhorando o desempenho.

No entanto, é preciso tomar cuidado com condições de corrida e sincronização. Técnicas como semáforos, mutexes e monitores são usadas para evitar problemas de concorrência.

Pontos principais

  • Processo é um programa em execução com seu próprio espaço de endereçamento; thread é uma unidade de execução dentro de um processo.
  • Os estados de um processo (new, ready, running, waiting, terminated) são gerenciados pelo escalonador.
  • O PCB armazena todo o contexto necessário para salvar e restaurar um processo.
  • Threads permitem paralelismo leve e compartilhamento eficiente de dados.
  • A concorrência exige cuidado com sincronização para evitar race conditions.

Perguntas frequentes

O que acontece se um processo bloqueia?

Se um processo entra em estado de espera (bloqueado), o escalonador seleciona outro processo pronto para executar, garantindo que a CPU não fique ociosa.

Threads de usuário ou kernel: qual usar?

A escolha depende da aplicação. Threads de usuário são mais rápidas de criar, mas não aproveitam múltiplos núcleos. Threads de kernel oferecem verdadeiro paralelismo, mas têm maior custo de gerenciamento.

Um processo pode ter apenas uma thread?

Sim. Todo processo começa com uma thread principal (a função main). Aplicações single-threaded são comuns e mais simples de implementar.

Compreender processos e threads é o primeiro passo para dominar sistemas operacionais e programação concorrente. Nos próximos dias exploraremos tópicos avançados como sincronização, deadlocks e gerenciamento de memória.