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.