# Processo (informática)

Em computação, um processo é uma instância de um programa de computador que está sendo executada. Ele contem o código do programa e sua atividade atual. Dependendo do sistema operacional (SO), um processo pode ser feito de várias linhas de execução que executam instruções concorrentemente.
Um programa de computador é uma coleção passiva de instruções, enquanto que um processo é a execução real dessas instruções. Vários processos podem ser associados com o mesmo programa. Por exemplo, abrir várias instâncias do mesmo programa geralmente significa que mais de um processo está sendo executado.
Multitarefa é um método que permite vários processos compartilharem processadores (UCPs) e outros recursos. Cada UCP (núcleo) executa uma única tarefa por vez. Entretanto, a computação multitarefa permite que cada processador comute entre tarefas que estão sendo executadas sem ter que esperar que cada tarefa finalize. Dependendo da implementação do sistema operacional, a comutação pode ser realizada quando tarefas realizam operações de entrada/saída, quando uma tarefa indica que ela pode ser comutada, ou quando há interrupções de hardware.
Uma forma comum de multitarefa é o compartilhamento de tempo. Compartilhamento de tempo é um método para permitir resposta rápida para aplicações interativas de usuário. Em sistemas de tempo compartilhado, trocas de contexto são realizadas rapidamente, o que faz parecer que vários processos estejam sendo executados simultaneamente no mesmo processador. Esta aparente execução de vários processos simultaneamente é chamada de concorrência.
Para segurança e confiabilidade, a maioria dos sistemas operacionais modernos impedem a comunicação direta entre processos independentes, fornecendo funcionalidade de comunicação entre processos estritamente mediada e controlada.

## Tipos de Processo

Dentre os processos, podemos destacar dois principais tipos que estão relacionados a seu local de execução, no caso CPU e Entrada e Saída de dados.
* Processos CPU bound (orientados à CPU): são processos que utilizam muito o processador, em que o tempo de execução é definido pelos ciclos de processador.
* Processos I/O bound (orientados à E/S): são processos que realizam muitas operações de entrada e saída de dados, em que o tempo de execução é definido pela duração destas.
* IDEAL: existir um balanceamento entre processos CPU-bound e I/O-bound;

## Representação

Em geral, processos de sistemas computacionais são formados pelos seguintes recursos:
* Uma imagem do código de máquina executável associado com um programa.
* Memória, que inclui o código executável, dados específicos do processo (dados da entra e saída), uma chamada de pilha (para manter a pilha de subrotinas ativas e/ou outros eventos) e um heap (alocação dinâmica de memória) para manter a computação intermediária gerada durante o tempo de execução.
* Descritores de sistema operacional que são alocados aos processo, como os descritores de arquivo do (segundo a terminologia UNIX) ou handles (usado no Windows) e os códigos e sinks.
* Atributos de segurança, tais como conjunto de permissões para o usuário que criou o processo, são as operações permitidas.
* Contexto de estado do processador, tal como o conteúdo dos registradores, memória física de endereçamento. O estado é normalmente guardado nos registradores quando o processo está em execução, e na memória principal caso contrário.
O sistema operacional mantém a maior parte da informação sobre processos dentro de estruturas de dados chamadas Bloco de controle de processos
Qualquer subconjunto de recursos, mas normalmente ao menos o estado do processador, pode ser associado com cada um dos processos threads no sistema operacional, que suporte threads ou processos 'filho'.
O sistema operacional mantém esses processos separados e aloca recursos necessários para cada um deles, diminuindo as chances de um processo atrapalhar o outro (e.g., deadlock). O sistema operacional pode além disso prover mecanismos para comunicação entre processos, permitindo assim interação e comportamento mais seguro entre os processos.

## Comunicação entre processos

A comunicação entre processos é o grupo de mecanismos que permite aos processos transferirem informação entre si. A capacidade de um sistema operacional executar simultaneamente dois ou mais processos é chamada multiprocessamento. Se existirem dois ou mais processos executados em simultâneo e disputam o acesso a recursos partilhados, problemas da concorrência podem ocorrer. Estes problemas podem ser resolvidos pelo gerenciamento adequado de múltiplas linhas de execução ou processos através da sincronização (multitarefa) ou por outros recursos (como a troca de contexto).
A execução de um processo ocorre de maneira sequencial, ou seja, uma instrução após a outra. A qualquer instante, apenas uma instrução de um determinado processo é executada. Os processos também exercem a atividade de executar operações concorrentes mesmo que possua apenas uma Unidade Central de Processamento disponível.
Embora dois processos possam estar associados a um mesmo programa, são considerados duas sequências de execução distintas. Por exemplo, cópias de um programa de correio eletrônico podem estar sendo executadas por vários usuários ou o mesmo usuário pode estar usando diversas cópias de um processador de texto. Cada um desses programas em execução constitui um processo distinto e, por mais que o texto de alguns programas possa ser o mesmo, o estado de cada um será diferente. É comum ter um processo que crie muitos processos durante sua execução, criando uma hierarquia entre processos pais e filhos.

## Memória compartilhada
### Vantagens

* Melhora o desempenho de processos que acessam frequentemente dados compartilhados.
* Os processos podem compartilhar a mesma quantidade de dados que podem endereçar.

### • Interface padronizada

* Memória compartilhada System V
* Memória compartilhada POSIX
* Não permite que os processos mudem privilégios de um segmento de memória compartilhada.

## Hierarquia de processos

Em alguns sistemas, quando um processo cria outro, o processo pai e o processo filho continuam, de certa forma, associados. Os processo filhos pode criar mais processos, formando assim uma hierarquia de processos, porém nela apenas existirá um processo pai e ter ou não um ou mais processos filhos.
Este tipo de organização dificulta a propagação de vírus em nossos sistemas operacionais, pois quando um processo pai é “morto” seja pelo sistema ou pelo próprio usuário, todos que estiverem abaixo dele na hierarquia serão mortos também.
No UNIX, um processo, todos os seus filhos e descendentes formam um grupo de processos. Exemplos da atuação de hierarquia ocorre quando há envio de sinal do teclado, onde o sinal é entregue a todos os processos associados ao teclado. Individualmente, cada processo pode capturar o sinal, ignorá-lo ou tomar a ação predefinida, isto é, ser finalizado pelo sinal. Além disso, os processos filhos não podem ser deserdados do processo pai.
Por outro lado, o Windows não apresenta esse conceito de hierarquia, nele todos os processos são iguais. Algo parecido com uma hierarquia ocorre somente quando um processo é criado. Ao pai é dado um identificador especial, que ele pode usar para controlar o filho. Contudo, ele é livre para passar o identificador para alguns outros processos, invalidando, assim, a hierarquia.

## Estados de processos

Em um sistema multiprogramado (multitarefa), um processo passa por diferentes estados desde sua criação até seu término.
No geral, pode-se dizer que, a princípio, pode-se dizer que existe a ideia de sete estados de processos, são eles (não definitivamente nessa ordem ou com essas terminologias):

### Não Submetido

É o processo que ainda não está submetido à CPU, está nas mãos do usuário. "Até onde interessa aos sistemas, ele não existe, porque o usuário ainda não o submeteu. Ele é simplesmente apresentado como sendo o primeiro passo na vida de um processo. O Sistema Operacional, naturalmente, não reconhece esse estado.". Pode por exemplo, ser um arquivo executável que está armazenado no HD.

### Criando

Enquanto o processo está sendo criado, esse é seu estado.
Um processo é dito no estado e criação quando o sistema operacional já criou um novo PCB (Process Control Blocks), porem ainda não pode coloca-lo na lista de processos do estado pronto.

### Pronto

Esse é como um estado de ponto de partida, aqui ficam os processos que estão prontos para serem processados.
Em outras palavras, quando um processo é criado, seu estado passa a ser este, além de que quando um processo que já estava em execução é suspendido, ele retorna para o estado de prontidão, a menos que deva e esteja, após a suspensão, aguardando a ocorrência de algum evento a parte, onde por sua vez só passará ao estado de prontidão após a finalização desse evento.

### Executando

Quando o processo está sendo executado, seu estado passa a ser este.

### Aguardando evento externo

Quando um processo depende da ocorrência de algum evento, este é seu estado.

### Esperando

Esse é um estado especial que na verdade está mais para uma característica de outros estados, basta observar os processos que estão nos estado de prontidão e os que estão aguardando eventos, pois ambos também estão em um estado de espera.

### Encerrando

Esse é o último estado de um processo, sua finalização, seja de forma voluntária, como quando ele não é mais necessário ou de forma involuntária, como as ocasionadas por um erro.

## Criação de Processos

Há várias razões para o início de um processo, os principais são:
* Inicio do sistema;
* Solicitação de chamada de execução ao sistema de criação de processo;
* Solicitação do usuário;
* Início de um job em lote.
* Quando se cria um processo, o sistema operacional realiza os seguintes passos:
* Atribui um identificador único ao processo. Cria-se o BCP, mas só se preenche o campo do identificador.
* Atribui memória ao processo.
* Inicializa o BCP.
* Inserir o processo na lista de processos que corresponda. Por exemplo na lista de processos prontos.
* Outras operações, como atualizar todas as estruturas de controle que mantenha o sistema operacional.

## Término de Processos

Os processos podem terminar de forma voluntária e involuntária. Aqui estão alguns exemplos de motivos para os processos cessarem sua execução e sua forma:
* Saída normal: A tarefa anteriormente solicitada já terminou sua execução (saída voluntária);
* Saída por erro: O arquivo não é encontrado (saída voluntária);
* Erro fatal: é efetuado uma divisão por 0 (saída involuntária);
* Cancelamento por um outro processo: kill, TerminateProcess (saída involuntária).

## Bloco de Controle de Processo (BCP)

BCP é a estrutura de dados que contém a informação a cerca de um processo.
A manifestação de um processo em um sistema operacional é um BCP. Um BCP é a representação de um processo durante sua execução. Um BCP é criado quando se cria seu processo associado. O conjunto de BCPs representa o estado do sistema. São acedidos e mantidos por rotinas do sistema operacional.

### Elementos do BCP

* Informações importantes para o controle
* identificação do processo, estado em que ele se encontra, prioridade.
* registradores e status
* ponteiros: pilha, código e dados
* tempos: início, de CPU, alarmes, dos filhos
* diretórios: raiz, trabalho
* descritores de arquivos
O BCP permite ao sistema operacional localizar toda a informação dos processos. O conjunto de BCP forma as tabelas de processos. O vão do processo usa-se como índice nas tabelas dos processos.

## Localização dos processos

* Processos ficam em estruturas que os classificam conforme seu estado. Processos prontos a serem escalonados para a execução ficam na lista/fila de prontos.

## Estados do processo em Linux

O linux trabalha com 4 estados de processo.
* Executável: O processo pode ser executado imediatamente.
* Dormente: Precisa aguardar algo para ser executado.
* Parado: Não pode ser executado.
* Zumbi: O processo é considerado "morto", mas ainda existe.

### Alguns comandos que podem ser utilizados

* Ps - Pelo comando ps é possível saber quais os processos em execução atualmente, quais os PIDs correspondentes e outros.
* Kill - O comando Kill tem a função de "matar" um processo, e é usado em momentos críticos.
* Jobs - Este comando visualiza os processos que estão parados ou executando em segundo plano.
* Bg - Coloca a última tarefa que estiver em segundo plano em execução.

## Fork no Unix

O fork no Unix cria um processo filho, que diferencia-se a partir do processo pai somente em suas PID e PPID. O fork consome tempo e memória requerida para duplicar as tabelas do processo pai. Se funcionar, a PID do processo filho é devolvido para o pai e retorna-se um 0 para o filho. Caso contrário, um -1 é retornado no contexto pai, e não se cria o processo filho.