Hoje na disciplina de sistemas operacionais, abordamos o conceito de processos, que é essencial para entender como o sistema gerencia a execução de programas. Um processo pode ser definido como um programa em execução, contendo todo o contexto necessário para sua execução: código, dados, pilha, registradores e descritores de arquivos.

O que é um processo?

Um processo é uma abstração usada pelo sistema operacional para representar um programa em execução. Enquanto um programa é um arquivo estático armazenado em disco, um processo é dinâmico e possui um ciclo de vida. Cada processo é identificado por um número único chamado PID (Process Identifier).

Os componentes principais de um processo incluem:

  • Código: as instruções do programa.
  • Dados: variáveis globais e estáticas.
  • Pilha: chamadas de funções e variáveis locais.
  • Contexto de hardware: valor dos registradores da CPU.
  • Descritores de arquivos: arquivos abertos pelo processo.

Essas informações são armazenadas em uma estrutura chamada Process Control Block (PCB), que o sistema operacional mantém para cada processo.

Estados de um processo

Durante seu ciclo de vida, um processo pode assumir diferentes estados:

  • Novo: o processo está sendo criado.
  • Pronto: o processo está na fila de prontos, aguardando a CPU.
  • Executando: o processo está sendo executado pela CPU.
  • Bloqueado: o processo está aguardando a ocorrência de algum evento (como E/S).
  • Terminado: o processo concluiu sua execução.

A transição entre esses estados é gerenciada pelo escalonador do sistema operacional.

Escalonamento de processos

O escalonador decide qual processo pronto será executado pela CPU. Existem diversos algoritmos de escalonamento, cada um com suas vantagens e desvantagens:

  • First-Come, First-Served (FCFS): executa os processos na ordem de chegada.
  • Shortest Job First (SJF): executa o processo com menor tempo de execução estimado.
  • Round Robin (RR): cada processo recebe um pequeno quantum de tempo e a CPU alterna entre eles.
  • Escalonamento por prioridade: processos com maior prioridade executam primeiro.

O escalonamento pode ser preemptivo, onde o sistema força a troca de processo, ou não preemptivo, onde o processo executa até terminar ou bloquear. Algoritmos modernos como o Completely Fair Scheduler (CFS) do Linux buscam balancear justiça e desempenho.

Comunicação entre processos (IPC)

Em sistemas multitarefa, é comum que processos precisem se comunicar ou sincronizar suas operações. Os mecanismos de comunicação entre processos (IPC) incluem:

  • Pipes: fluxo de dados unidirecional entre dois processos.
  • Memória compartilhada: região de memória acessível por múltiplos processos.
  • Filas de mensagens: troca de mensagens estruturadas.
  • Semáforos: controle de acesso a recursos compartilhados.

Esses mecanismos são fundamentais para a construção de sistemas concorrentes e distribuídos. Um exemplo clássico é o uso do sistema fork no Unix:

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        printf("Processo filho\n");
    } else {
        printf("Processo pai\n");
    }
    return 0;
}

Após o fork(), o processo pai e o filho executam concorrentemente a partir do mesmo ponto.

Troca de contexto

A alternância entre processos (context switch) é uma operação na qual o sistema salva o estado do processo atual e carrega o estado do próximo processo a ser executado. Essa operação tem um custo computacional, pois envolve a manipulação de registradores, cache e tabelas de memória. Por isso, sistemas operacionais otimizam o escalonamento para minimizar trocas de contexto desnecessárias.

Processos zombie e órfãos

Um processo zombie ocorre quando o processo filho termina, mas o pai não chama wait() para coletar seu status. O processo filho permanece na tabela de processos como um "zombie". Já um processo órfão ocorre quando o pai termina antes do filho; nesse caso, o processo init adota o filho.

Perguntas Frequentes

Qual a diferença entre processo e thread?
Um processo possui seu próprio espaço de endereçamento, enquanto threads compartilham o mesmo espaço de endereçamento dentro de um processo. Threads são mais leves e a comunicação entre elas é mais eficiente.
O que é um processo zombie?
Um processo zombie é um processo que já terminou sua execução, mas ainda permanece na tabela de processos porque o processo pai não leu seu código de saída.
O que é escalonamento preemptivo?
No escalonamento preemptivo, o sistema operacional pode interromper um processo em execução e colocar outro processo para executar, geralmente após o término do quantum de tempo.
Como funciona o comando fork() no Linux?
O comando fork() cria um novo processo filho que é uma cópia do processo pai. Ambos continuam a execução a partir da mesma instrução, mas com valores de retorno diferentes para distinguir pai e filho.

Conclusão

Os processos são a unidade fundamental de execução em sistemas operacionais modernos. Compreender seus estados, escalonamento e mecanismos de comunicação é essencial para qualquer estudante de ciência da computação. Na próxima aula, daremos continuidade ao estudo de processos com exemplos práticos e implementações.