# Introdução aos Sistemas Operacionais/Gerência de Processos
## Introdução

O conceito de processo é a base para a implementação de um sistema multiprogramável. O processador é projetado apenas para executar instruções, não se importando com qual programa esteja em execução ou qual o seu conteúdo. O sistema operacional por sua vez, é o responsável por gerenciar qual programa está em execução e é, também, o responsável por controlar o uso concorrente do processador.
A gerência de processos é uma das principais funções do sistema operacional. Através dos processos, um programa pode alocar recursos, compartilhar dados, trocar informações, etc. Nos sistemas multiprogramáveis, os processos são executados concorrentemente, compartilhando o uso do processador, da memória principal e os dispositivos e Entrada/Saída. Nos sistemas com múltiplos processadores ou com vários núcleos, além da execução de processos concorrentemente ocorre também a execução simultânea de processos nos diversos processadores do sistema
* Gerenciador de Processos do Windows

## Estrutura do Processo - Contexto

Um processo pode ser entendido como um programa que está em execução. Em sistemas multiusuário, cada usuário é associado a um processo. O processador executa o programa do usuário em um determinado intervalo de tempo e, no instante seguinte, poderá executar outro programa, de outro usuário.
Um processo também pode ser definido como o ambiente onde o programa é executado. Este ambiente, além das informações importantes a execução do programa, possui também informações relativas aos recursos que o programa pode utilizar como espaço de endereçamento, uso do processador, área em disco, etc. Se um programa necessitar utilizar uma área em disco superior ao seu limite estipulado, o sistema operacional interrompe a execução do programa por falta de recursos.
Para que a troca de processos ocorra sem problema, todas as informações do processo interrompido devem ser guardadas. Essas informações são denominadas: Contexto. Um processo é formado por três partes, que juntas mantêm as informações necessárias à execução de um programa.
Essas três partes são: – Contexto de hardware
– Contexto de software – Espaço de endereçamento
Ao lado, uma imagem que ilustra os três contextos de um processo. Vamos falar de cada um deles detalhadamente:
Contexto de Hardware:
O contexto de hardware armazena o conteúdo dos registradores gerais da CPU, além dos registradores de uso específico, como o program counter(PC), o stack point(SP) e o registrador de status. Quando um processo esta em execução, o seu contexto de hardware está armazenado nos registradores da CPU. No momento em que ocorre a troca de processo, o sistema salva as informações do contexto de hardware do processo.
Para que a troca de programas ocorra sem problemas, é necessário que todas as informações do programa interrompido sejam armazenadas para que, quando o programa retorne a execução possa continuar exatamente de onde parou. A troca de um processo por outro, comandada pelo sistema operacional, é denominada mudança de contexto. A mudança de contexto consiste em salvar o conteúdo dos registradores do processo que esta deixando a CPU para carregá-los com os valores referentes ao do novo processo que será executado. Essa operação consiste em trocar um contexto de hardware de um processo por outro.
Contexto de Software:
No contexto de software são especificados características e limites de recursos que podem ser alocados pelo processo, como o número máximo de arquivos abertos simultaneamente, prioridade de execução e tamanho do buffer. Muitas destas características são determinadas no momento da criação do processo, enquanto outras podem ser alteradas durante a execução.
O contexto de software é composto por três grupos de informações sobre o processo: identificação, cotas e privilégios.

## Estados do Processo

Em um sistema multiprogramável, os processos passam por diferentes estados ao longo do seu processamento, seja em função de eventos gerados pelo sistema operacional, seja pelo próprio processo. Um processo ativo pode ter três estados diferentes:
- Execução (running)
Um processo está estado de execução quando está sendo processado efetivamente pela CPU, ou seja, utilizando o processador. Em sistemas com um único processador, somente um processo pode estar em estado de execução em um dado instante. Em sistemas com mais de uma CPU ou com CPU com mais de um núcleo, o número de processos que pode estar em estado de execução ao mesmo tempo é igual ao número de processadores existentes. Neste tipo de sistema, também é possível que um mesmo processo esteja sendo executado em mais de um processador ao mesmo tempo.
- Pronto (ready) Um processo está no estado de pronto quando aguarda para ser executado. O sistema operacional é o responsável por determinar a ordem e os critérios pelos quais os processos em estado de pronto devem fazer uso do GPU
Podem existir diversos processos em estado de pronto aguardando para serem executados. Estes processos são organizados em uma lista encadeada e são ordenados pela sua importância, permitindo que os processos com prioridade mais alta sejam executados primeiro.
- Espera (waiter) Um processo no estado de espera aguarda por algum evento externo ou por algum recurso para continuar sua execução, como por exemplo, aguardando alguma operação de entrada/saída.
Os processos no estado de espera também são organizados em uma lista encadeada e, assim que o evento esperado aconteça, o processo que aguardava o evento é então transferido para o estado de pronto.