Um processo representa uma instância de um programa em execução, incluindo todos os dados relacionados a ele como valores do contador do programa, registradores e variáveis.
Processos são uma das abstrações mais importantes e centrais dos sistemas operacionais, pois eles tornam possíveis muitas operações essenciais para os sistemas computacionais modernos. Uma dessas importantes operações é o pseudo paralelismo, onde a execução de vários processos é intercalada em uma única CPU, dando ao usuário a impressão de execução paralela dos programas. Essa e muitas outras operações só são possíveis através da abstração fornecida pelos processos.
Todo armazena as seguintes informações relativas à sua execução:
- Conjunto de instruções (programa)
- Espaço de endereçamento
- Contexto de hardware (valores de registradores como PC, ponteiro de pilha e registradores intermediários)
- Contexto de software (arquivos abertos, variáveis de ambiente etc)
Criação de processos
Em sistemas UNIX há apenas uma chamada de sistema para criar um novo processo: fork
. A chamada fork
cria um clone do processo que a chamou, ou seja, após a chamada fork
tanto o processo pai quanto o filho possuem o mesmo estado, incluindo imagem de memória, variáveis de ambiente e mais (porém possuem seus próprios espaços de endereços distintos, ou seja, alterações no espaço de endereço do processo filho não alteram o processo pai). Normalmente após uma chamada fork
o processo filho executa uma outra chamada de sistema como execve
para então executar um programa diferente.
Estados de processos
Durante sua execução, um processo pode estar em 3 diferentes estados:
- Em execução: está utilizando a CPU.
- Pronto: está pronto para ser executado, aguardando para usar a CPU.
- Bloqueado: está incapacitado de ser executado, geralmente aguardando a resposta de alguma chamada referente a IO.