# Multiprocessamento

Multiprocessamento é o uso de duas ou mais unidades centrais de processamento (CPUs) dentro de um único sistema de computador. O termo também se refere à capacidade de um sistema suportar mais de um processador ou a capacidade de alocar tarefas entre eles. Difere da multitarefa, pois esta simula a simultaneidade, utilizando-se de vários recursos, sendo o principal o compartilhamento de tempo de uso do processador entre vários processos.

## Características

Um multiprocessador ou sistema multiprocessado é um sistema integrado de computação com as seguintes características:
* Envolve dois ou mais processadores físicos (sejam processadores separados ou múltiplos núcleos encapsulados no mesmo chip) ou lógicos (processador(es) com a tecnologia HyperThreading da Intel) com o mesmo poder computacional e cada um capaz de executar processos autonomamente. Isto implica que não há nenhuma unidade "central" de controle; cada processador contém sua própria unidade de controle. Assim, efetivamente, a lógica de controle é distribuída pelo sistema.
* Os processadores compartilham um único espaço de endereçamento de memória.
* O sistema de hardware é como um todo gerenciado por um único sistema operacional.
O sistema operacional com suporte a multiprocessamento deve ser capaz de:
* suportar multitarefa;
* manter múltiplas filas de processos, uma para cada processador.

## Arquitetura

Sistemas multiprocessados podem ser de dois tipos:
* Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal.
* Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória.

## Simetria dos processadores

Os sistemas com múltiplos processadores podem ser divididos em sistemas com processadores simétricos, e assimétricos. A simetria pode ser considerada a partir da combinação do sistema operacional e do hardware utilizado.
Em sistemas nos quais os processadores são tratados de forma diferente um dos outros são chamados sistemas de processamento assimétrico (ASMP Asymmetric Multiprocessing), nesses sistemas os processadores podem ter níveis de acesso a memória diferentes, formas de acesso a memória e outros hardwares diferentes.
Sistemas de processamento simétrico (SMP Symmetric Multiprocessing) são sistemas em que todos os processadores são tratados da mesma forma.

## Sistemas Mestre/Escravo

Em um sistema do tipo Mestre/Escravo o processador designado como mestre atribui tarefas para os "Escravos". Os processadores podem ter arquitetura e velocidade diferentes, e ter memórias privadas independentes, bem como também podem dividir um espaço de memória comum. É uma arquitetura comum em sistemas legados.

## Acoplamento dos processadores
### Sistemas de multiprocessamento fortemente acoplados

Os processadores podem ser conectados em nível de barramento, e dividir a mesma memória principal, porém, podem ter também uma memória local. Chips com multiprocessadores, também conhecidos como sistemas multi-core, podem ser considerados um tipo de multiprocessador acoplado muito firmemente.

### Sistemas de multiprocessamento vagamente acoplados

São sistemas independentes que são interligados por algum meio de comunicação de alto desempenho para dividir o processamento entre si. Deve ser considerado que esse tipo de sistema é energeticamente menos eficiente do que sistemas firmemente acoplados, devido aos gastos de energia extras com mais maquinas. Deve ser considerado também a possibilidade de executar sistemas operacionais diferentes em cada máquina nesse tipo de sistema.