Multiprogramming, Multiprocessing e multitasking
Tags: computerscience, architecture
Published: 2020-01-29 17:25:49

Comecei a estudar sobre o assunto e resolvi escrever um pouco sobre o entendimento que tive durante esse tempo. Então, tentarei explicar de maneira simples e clara sobre esses conceitos. 

##Multiprogramming

**Multiprogramming** é um dos aspectos mais importante nos sistemas operacionais modernos, ele funciona da seguinte forma:

Sabemos que os sistemas operacionais atuais possuem múltiplos processos a serem executados, como a memória principal é muito pequena para armazenar todos eles, esses processos são inicialmente armazenados numa fila chamada _job pool_.
 
O CPU, então, seleciona um desses jobs (processos), armazena na memória principal e começa a executá-lo até que esse processo seja interrompido por algum fator externo ou inicie alguma tarefa de I/O.
No momento da interrupção, o CPU então seleciona outro job no _job pool_ e executa até que o mesmo seja interrompido, fazendo assim uma espécie de rodízio. 
Dessa forma o CPU não fica ocioso aguardando os jobs executarem seus trabalhos de I/O (leitura e escrita no disco, comunicação em rede).


![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u44bdo3dk2ci7gnfof60.png)

Como podemos ver na imagem acima, em nenhum momento o processador ficou ocioso

##Multiprocessing

Como vimos, com um CPU, apenas um processo executava por vez.
Hoje em dia, a maioria dos computadores possuem processadores com múltiplos cores permitindo assim que vários processos sejam executados de forma paralela.

Supondo um processador dual-core, dois processos serão executados simultaneamente. Um quad-core executaria 2x mais rápido que um dual-core e 4x mais rápido que um processador com um único core.

Dessa forma podemos concluir que quando falamos de paralelismo, estamos tendo como referência o hardware. Em resumo é a capacidade do CPU executar mais de um processo de forma simultânea através dos múltiplos cores.


##Multitasking

**Multitasking** como o próprio nome já diz, seria a capacidade de executar múltiplas tarefas ao mesmo tempo. 
Multitasking é uma extensão lógica de multiprogramming. A maior diferença entre eles é que em multiprogramming havia uma mudança de contexto entre os processos através de uma interrupção, já multitasking é baseado em tempo de compartilhamento (_time slicing_ ou _time sharing_)

- Num modelo de compartilhamento de tempo, o CPU separa um _quantum_ de tempo para cada processo. Por exemplo, 4 processos (A, B, C e D) executam de forma alternada a cada 4 nanosegundos. 
- Quando o tempo do processo expira, o CPU faz a troca de contexto para outro processo.
- Nesse modelo, a troca de contexto acontece de uma forma tão rápida que dá a ilusão que os processos estão sendo executados de forma paralela. Dessa forma o usuário consegue interagir com os processos de forma separada.

Podemos então concluir que os processos estão sendo executados de forma concorrente.

## Concorrência vs Paralelismo 

Baseado nos conceitos apresentados, vamos então montar uma tabela comparativa entre os dois:

|           | Concorrência | Paralelismo 
| --------- |:---------:| -------:|
| **Definição** | Execução de vários processos em um único core usando compartilhamento de tempo (time slicing) | Execução de múltiplos processos de forma simultânea usando múltiplos cores  |
| **Objetivo**  | Simular paralelismo usando menos recurso de hardware  | Paralelismo  real e mais performático|
| **Perspectiva** | Software Design | Hardware |


Bom, é isso. Espero que tenha conseguido explicar da melhor forma esses conceitos  tão usados no mundo da programação.

Até a próxima