Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Estrutura x Execução

Concorrência é uma propriedade da estrutura de um programa. Um programa é concorrente quando ele é decomposto em múltiplas tarefas, e o tempo de vida (lifetime) dessas tarefas é intercalado.

A imagem abaixo mostra três tarefas que compõem um programa concorrente. Cada tarefa executa durante um tempo, e dá espaço para outra. A tarefa A é a primeira a começar, mas só termina após outras duas terem iniciado.

Paralelismo é uma propriedade da execução de um programa. Um programa é executado em paralelo quando duas ou mais tarefas que o compõem são executadas no mesmo instante de tempo.

Um programa só pode ser paralelo (isto é, executado em paralelo) se tiver um hardware que dê suporte a isso, ou seja, se o programa for executado num computador com múltiplos cores. Por exemplo, um computador com quatro cores permite executar 4 tarefas no mesmo instante de tempo.

Dessa forma, todo programa paralelo é concorrente: Não é possível executar duas “tarefas” de um programa no mesmo instante se o programa já não está estruturado em múltiplas tarefas pra começo de conversa.

Porém, o inverso não é verdade. Nem todo programa concorrente é paralelo. Um programa decomposto em múltiplas tarefas, mas executado num hardware single-core, verá que cada tarefa que o compõe irá executar na CPU por um certo intervalo de tempo, para em seguida ser trocado por outra (Um processo chamado de escalonamento). Os sistemas operacionais mais antigos, executados em hardware single-core, davam a ilusão de muitas tarefas sendo executadas ao mesmo, sendo que eles apenas escalonavam múltiplas tarefas num único processador de maneira muito rápida, imperceptível ao olho humano.

Um programa concorrente, e talvez paralelo

Considere o seguinte programa em pseudocódigo:

Seja L uma lista de itens
Seja Ts uma lista vazia

para cada item X em L:
  crie uma tarefa T
  programe T para processar o item X
  insira T em Ts

para cada tarefa T em Ts:
  inicie T
aguarde todas as tarefas em Ts finalizarem

Não vamos nos preocupar nesse momento com o que exatamente seria essa “tarefa”1. Vamos focar na seguinte pergunta: Esse programa é concorrente, paralelo ou ambos?

Primeiro, vejamos se é concorrente:

  • O programa é estruturado em várias tarefas.
  • Cada tarefa é iniciada sequencialmente, mas o pseudocódigo não especifica que elas serão necessariamente executadas ou finalizadas sequencialmente2.

Portanto, sim, o programa é concorrente.

Agora, veja que não temos informações suficientes para determinar se o programa é paralelo ou não, pois o pseudocódigo só nos informa a estrutura do programa, não trazendo nenhuma informação sobre o computador em que ele será executado. Como não sabemos se o programa será executado num hardware single-core ou multi-core, não podemos afirmar se ele é paralelo ou não.


  1. Posteriormente veremos que uma “tarefa” pode ser implementada como um de vários tipos de unidades de execução: processos, threads, green threads, corotinas, etc. ↩

  2. Veremos mais na frente como pode ser feito o escalonamento dessas tarefas. ↩