De 1970 a 2002, os processadores dobraram de velocidade a cada 18 meses. Portanto, como programador, tudo o que você precisava fazer era esperar e seu programa seria mais rápido. O problema é que, por volta de 2002, as regras foram alteradas. Agora eles não estão fabricando processadores rápidos maiores, mas sim processadores mais lentos menores, mas os colocando em grupos. O computador em que estou trabalhando agora tem 4 núcleos e existem chips com até 8 núcleos (e 4 threads por núcleo). Em breve teremos chips com muito mais núcleos.
Portanto, se você escrever um programa que não é de todo simultâneo, descobrirá que está usando 1 núcleo ou thread, mas o restante da CPU está lá, sem fazer nada. Portanto, se você tiver 16 núcleos, 1 estará executando seu programa e os outros 15 estarão lá!
O problema com a simultaneidade é que não é determinístico. Ou seja, você não sabe exatamente em que ordem os diferentes threads farão as coisas. Tradicionalmente, os programadores tentam resolver isso usando bloqueios e coisas do gênero. Isso levou a muita dor. Ter alguma forma de estado mutável que mais de um thread possa acessar livremente geralmente é uma fórmula para dor e heisnebugs!
Ultimamente, a tendência tem sido mudar para linguagens funcionais que controlam rigidamente o estado mutável. Existem duas maneiras básicas pelas quais as linguagens funcionais lidam com a simultaneidade. A primeira é usando a passagem de mensagens. Isso é melhor mostrado por Erlang. Em Erlang, em geral, não há estado compartilhado entre processos. Eles se comunicam não compartilhando memória, mas minhas mensagens que passam. Isso deve fazer sentido para você, como estamos fazendo agora. Estou enviando esta informação para você, enviando uma mensagem, não lembrando-a do meu cérebro! Ao mudar para a mensagem que passa, a maioria dos erros de bloqueio simplesmente desaparece. Além disso, as mensagens podem ser transmitidas pela rede e dentro de um nó.
O outro método é o STM, que significa Memória Transcricional de Software. Está presente no clojure e Haskell (e outros). No STM, a memória é compartilhada, mas as alterações só podem ser feitas através de uma transação. Como o pessoal do banco de dados descobriu tudo isso na década de 1970, é muito fácil garantir que acertemos.
Na verdade, simplifiquei um pouco mais, Clojure e Haskell podem passar a mensagem e Erlang pode fazer STM.
Isenção de responsabilidade Eu sou o autor de Programming Web Services with Erlang , que sairá no lançamento antecipado nas próximas semanas.