Concorrência versus Paralelismo

Em um universo onde tudo acontece ao mesmo tempo e nem mesmo cogitamos a quantidade de eventos que acontecem ao nosso redor, tudo é dinâmico e as vezes não existe sequência ou previsão.

Imagine uma fila para fazer um pedido, pode ser o pedido de um lanche, por exemplo: e enquanto espera por sua vez, o atendente do caixa esta registrando os pedidos, a pessoa a sua frente esta para ser atendida, o pedido novo já chegou na cozinha, outro atendente está servindo um pedido anterior e você consultando seu smartphone super pontente com quatro núcleos, curioso para saber quais filmes estão passando no cinema, enquanto ouve a sua banda favorita. Nossa! quanta coisa, não é mesmo ? Esta é somente uma narração incrivelmente resumida do que aconteceu ao redor neste exercício imaginário.

Ao longo dos anos o desenvolvimento de software avançou e criou ferramentas, linguagens e formas para lidar com o nosso "universo" de eventos.

Programas foram feitos para trabalhar de forma assíncrona e ao mesmo tempo que recebem uma requisição já trabalhem em uma requisição anterior, no mesmo momento que calcula uma saída para outro pedido e tudo de forma super rápida, não há espaço para uma fila onde as coisas ocorrem unicamente de forma sequencial, há espaço para tarefas divididas de forma inteligente e várias filas para processar várias tarefas.

Concorrência

Quem já utilizou computadores com somente um processador/núcleo, talvez viveu a concorrência e nem percebeu (talvez percebeu e trocou por um computador melhor), só por que acontece tão rápido pode parecer que é tudo ao mesmo tempo. Mas o computador precisa receber os dados do teclado, enviar para o vídeo, tocar a sua música (talvez Pink Floyd), receber dados de rede, mostrar um novo email (uffa! eu devo ter falado só 1%). Tudo isso em um processador/núcleo e foi tão rápido e não, não foi tudo ao mesmo tempo, foram pequenas tarefas bem trabalhadas, uma de cada vez, divididas por tempo e cada uma usando microsegundos (0.000001 Segundo) apenas.

Um programa que não foi construído para trabalhar de forma concorrente jamais vai ter perfomance satisfatória, assim como um programa que não foi construído para trabalhar de forma paralela também não vai utilizar vários processadores/núcleos de forma satisfatória, o hardware não vai fazer milagre.

Paralelismo

Quando falei "tudo acontecendo ao mesmo tempo" no exemplo anterior, deixei claro que realmente não foi tudo ao mesmo tempo. No entanto as tarefas foram executadas de forma incrivelmente rápida.

Para que ocorra realmente ao mesmo tempo é necessário o paralelismo, precisamos de mais de um processador ou um processador com mais de um núcleo, para que realmente duas ou mais tarefas aconteçam simultaneamente.

Se a meta é o paralelismo então precisamos de uma concorrência bem planejada, tarefas realizadas pelo programa não podem conflitar, travar ou ficar em uma espera sem fim.

Quando falamos de concorrência focamos na estrutura e quando falamos de paralelismo o foco é como serão executadas tais estruturas em hardwares múltiplos processadores/núcleos.

Concorrência e paralelismo juntas

Agora que temos em mente os conceitos que precisávamos e também espero que estejam claros, podemos passar para a peça final.

Vamos unir ambos conceitos e fazer com que essa estrutura se comunique de forma segura e escalável, para alcançar a concorrência iremos utilizar as múltiplas rotinas em nosso programa, podemos chamar de threads ou routines, vamos nos ater aos conceitos por enquanto.

Agora que temos o paralelismo ao distribuir as tarefas entre os processadores/núcleos, a peça final é o meio de comunicação, o túnel ou canal que liga as múltiplas rotinas, pois não adianta ter várias rotinas se as mesmas não comunicam entre sí.

O meio de comunicação irá possibilitar a comunicação sincronizada, ou seja, nenhum dado irá chegar antes da hora, ou chegar depois, não irá bloquear uma anterior tarefa e nem deixar de atender outra. Por isso é tão importante que este meio de comunicação seja sincronizado. Que permita que todas as tarefas ocorram sem que uma "atropele" a outra.

Considerações finais

Este é um assunto denso e também tem muita teoria envolvida, um assunto que geralmente se extende em uma cadeira no curso de Ciência da Computação (Sistemas Operacionais/Sistemas Multiprocessados).

Espero ter ilustrado de forma simples e clara sobre o assunto que irei tratar de forma prática em um próxima exemplo, onde ire explicar sobre como utilizar concorrência e paralelismo programando em Go.

Fontes