Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
June 24, 2022 08:44 pm GMT

Ol mundo da programao concorrente

Nest post vamos dar uma introduo sobre a programao concorrente. Vamos abordar tambm um pouco sobre a diferena entre concorrncia e paralelismo, assuntos que podem parecer sinnimos, mas quando falamos em programao de computadores h diferenas.

Neste post foram abordados os assuntos principais de cada pesquisa feita. Para mais detalhes sugiro a leitura ou visualizao delas:

  1. Site da Intel;
  2. Livro C++ Concurrency in Action;
  3. Livro Erlang and OTP in Action;
  4. Vdeo O que so os NCLEOS, THREADS, DUO, QUAD?.
  5. Artigo Concurrency vs Parallelism
  6. Artigo Threads: O que so e para que servem em um processador?
  • O que concorrncia?
  • Concorrncia em sistemas de computador
    • Ncleos vs. Threads
    • Hyper-threading (threads adicionais)
    • Alternncia de Tarefas (Task Switching)
    • Execuo Paralela
    • Alternncia de Tarefas vs. Execuo Paralela
    • Execuo paralela e concorrente
  • Paralelismo
    • Assncrono X Sncrono
  • Abordagens concorrncia
    • Concorrncia com mltiplos processos
    • Concorrncia com mltiplos threads
  • Concluso

O que concorrncia?

Conforme o livro C++ Concurrency in Action a concorrncia sobre duas, ou mais atividades separadas/independentes que acontecem ao mesmo tempo. Encontramos a concorrncia como parte natural da vida; podemos caminhar e falar ao mesmo tempo, ou realizar aes diferentes com cada mo, e cada um pode viver a sua vida independentemente do outro - voc pode ver futebol enquanto eu vou nadar, e assim por diante.

Image description

Concorrncia em sistemas de computador

Quando falamos de concorrncia em computadores, nos referimos a um nico sistema que executa mltiplas atividades independentes ao mesmo tempo e sem ordem especfica, em vez de sequencialmente (ordem especfica).

Sequencialmente (ordem especfica):

Image description

Em um jogo de cartas, os jogadores jogam ao mesmo tempo, mas o jogo comea com o baralho sendo embaralhado, as cartas sendo entregues aos jogadores e, depois, cada jogador joga na sua vez, h uma ordem especifica:
Image description

Ao mesmo tempo e sem ordem especfica:

Image description

Definio do livro Erlang and OTP in Action:

Concorrncia apenas mais uma palavra para paralelo? Quase, mas no exatamente, pelo menos quando estamos falando de computadores e programao.

Uma definio semiformal popular diz algo como: "Aquelas coisas que no tm nada que as obrigue a acontecer em uma ordem especfica so ditas como concorrentes". Por exemplo, dada a tarefa de ordenar dois baralhos de cartas, voc poderia ordenar um baralho primeiro e depois o outro; ou se voc tivesse braos e olhos extras, voc poderia ordenar ambos em paralelo. Nada exige que voc os faa em uma determinada ordem; portanto, so tarefas concorrentes. Elas podem ser feitas em qualquer ordem, ou voc pode pular para frente e para trs entre as tarefas at que ambas sejam feitas; ou, se voc tiver os recursos extras (ou talvez algum para ajud-lo), voc pode execut-las simultaneamente de forma verdadeiramente paralela.

Image description

Isto pode soar estranho: no deveramos dizer que as tarefas s so concorrentes se elas esto acontecendo ao mesmo tempo? Bem, a questo com essa definio que elas podem acontecer ao mesmo tempo, e ns somos livres para agend-las de acordo com nossa convenincia. Tarefas que precisam ser feitas simultaneamente no so tarefas separadas, enquanto algumas tarefas so separadas mas no concorrentes e devem ser feitas em ordem, como quebrar o ovo antes de fazer a omelete. As demais so concorrentes.

Ncleos vs. Threads

Conforme o site da Intel, um thread, ou thread de execuo, um termo de software para a sequncia bsica ordenada de instrues que pode ser passada ou processada por um nico ncleo/core de CPU.

  • Single thread: Cada core corresponde um thread;
  • Multi thread (Hyper-threading): Cada core possui mais de um thread.

Image description

Crditos da imagem acima: https://www.mobilebit.com.br/tecnologia/2020/12/15/threads-o-que-sao-para-que-servem-em-um-processador/

Hyper-threading (threads adicionais)

Image description

  • As Threads adicionais so conhecidas popularmente como ncleos lgicos ou ncleos virtuais.
  • As Threads adicionais no tem o mesmo poder de processamento de um ncleo fsico (thread real).
  • As Threads adicionais vo ajudar em softwares que no conseguem lidar com vrios ncleos fsicos.

Em um processador de quatro ncleos e oito threads, como o caso do processador Intel Core i7-1165G7 voc ver em um sistema Linux no Monitor do Sistema oito grficos representando os ncleos, ou seja, oito linhas de execuo (threads) - quatro ncleos fsicos e quatro ncleos virtuais.

Image description

Veja no site as especificaes do processador Intel Core i7-1165G7
Image description

Alternncia de Tarefas (Task Switching / Context Switching)

Executando mais de uma tarefa ao mesmo tempo, mas no de forma paralela.

Image description

Alternncia de tarefas em uma mquina com um s ncleo e um s thread:
Image description

Historicamente, a maioria dos computadores de mesa (desktop) tiveram um processador, com uma nica unidade de processamento ou ncleo (single core processor). Tal mquina s pode executar uma tarefa de cada vez, mas pode alternar entre tarefas muitas vezes por segundo. Ao fazer um pouco de uma tarefa e depois um pouco de outra e assim por diante, parece que as tarefas acontecem simultaneamente. Isto chama-se alternncia de tarefas (task switching).

Exemplos de processadores single core:

Execuo paralela

Executando mais de uma tarefa ao mesmo tempo e de forma paralela (lado a lado).

Image description

Crditos da imagem acima: https://jenkov.com/.

Computadores contendo mltiplos processadores tm sido utilizados para servidores e tarefas de computao de alto desempenho durante anos, e computadores baseados em processadores com mais do que um ncleo num nico chip (multicore processors) tornam-se cada vez mais comuns em mquinas desktop. Quer tenham processadores mltiplos ou ncleos mltiplos dentro de um processador (ou ambos), estes computadores conseguem executar genuinamente mais do que uma tarefa em paralelo.

Exemplos de processadores multi core:

Alternncia de Tarefas vs. Execuo Paralela

Image description

Crditos da imagem acima: Livro C++ Concurrency in Action.

A Figura 1.1 mostra um cenrio idealizado de um computador com precisamente duas tarefas a fazer, cada uma dividida em 10 blocos de igual tamanho. Numa mquina de ncleo duplo (com dois ncleos de processamento), cada tarefa pode executar no seu prprio ncleo. Numa mquina de ncleo nico que faz a troca de tarefas (task switching), os blocos de cada tarefa so intercalados. Mas tambm so espaados um pouco (na figura 1.1, isto mostrado pelas barras cinzentas que separam os blocos sendo mais espessas do que as barras separadoras mostradas para a mquina de ncleo duplo); para fazer a intercalao, o sistema tem de executar uma troca de contexto cada vez que muda de uma tarefa para outra, e isto leva tempo. Para executar uma mudana de contexto, o sistema operacional tem de guardar o estado da CPU e o ponteiro de instrues para a tarefa atualmente em execuo, determinar para qual tarefa mudar, e recarregar o estado da CPU para a tarefa para a qual mudada. A CPU ter ento potencialmente de carregar a memria para as instrues e os dados para a nova tarefa na memria transitria (cache), o que pode impedir a CPU de executar quaisquer instrues, causando mais atrasos.

Execuo paralela e concorrente

Executando mais de uma tarefa ao mesmo tempo mas no de forma paralela em cada CPU e as duas CPUs trabalhando de forma paralela.

Em uma CPU acontece a alternncia de tarefas, ou seja, uma tarefa deve parar para a outra prosseguir. As duas CPUs esto trabalhando em paralelo (lado a lado), ou seja, uma CPU no precisar parar para a outra prosseguir.

Image description

Crditos da imagem acima: Livro C++ Concurrency in Action.

Embora a disponibilidade de concorrncia no hardware seja mais bvia com sistemas multiprocessadores ou multincleo, alguns processadores podem executar vrios fios (threads) num nico ncleo (Hyper-threading). O fator importante a considerar o nmero de fios do hardware, sendo a medida de quantas tarefas independentes o hardware pode genuinamente executar concorrentemente. Mesmo com um sistema com uma concorrncia genuna de hardware, fcil ter mais tarefas do que o hardware pode executar em paralelo, por isso a alternncia de tarefas continua a ser utilizada nestes casos. Por exemplo, num computador desktop tpico pode haver centenas de tarefas em execuo, executando operaes em segundo plano (background), mesmo quando o computador est nominalmente inativo. a alternncia de tarefas que permite executar estas tarefas em segundo plano e executar o processador de texto, compilador, editor, e browser da web (ou qualquer combinao de aplicaes) tudo de uma s vez. A Figura 1.2 mostra a alternncia de tarefas entre quatro tarefas numa mquina dual-core, mais uma vez para um cenrio idealizado com as tarefas divididas ordenadamente em blocos de igual tamanho.

Paralelismo

Dividir uma nica tarefa em subtarefas que podem ser executadas em paralelo.

Image description

Crditos da imagem acima: https://jenkov.com/.

Conforme o livro C++ Concurrency in Action a concorrncia e o paralelismo tm significados amplamente sobrepostos no que diz respeito ao cdigo multithreaded. De fato, para muitos eles significam a mesma coisa. A diferena principalmente uma questo de nuance, foco e inteno. Ambos os termos so sobre executar mltiplas tarefas simultaneamente, usando o hardware disponvel, mas o paralelismo muito mais orientado para o desempenho. As pessoas falam em paralelismo quando sua principal preocupao aproveitar o hardware disponvel para aumentar o desempenho do processamento de dados em massa, enquanto as pessoas falam em concorrncia quando sua principal preocupao a separao de preocupaes, ou capacidade de resposta.

Assncrono X Sncrono

Podemos encontrar a palavra async (asynchronous = assncrono) como uma palavra reservada em linguagens de programao para converter cdigo sequencial em cdigo concorrente, como na linguagem Elixir com o Task.async.

Assncrono (lado a lado mas em velocidades diferentes):
Image description

Sncrono (lado a lado mas na mesma velocidade):
Image description

Concorrncia com mltiplos processos

Image description

Crditos da imagem acima: Livro C++ Concurrency in Action.

A primeira maneira de fazer uso da concorrncia dentro de uma aplicao dividir a aplicao em mltiplos processos separados, em uma nica thread, que so executados ao mesmo tempo, da mesma forma que voc pode executar seu navegador web e processador de texto ao mesmo tempo. Estes processos separados podem ento passar mensagens uns para os outros atravs de todos os canais normais de comunicao interprocessados (signals, sockets, files, pipes, etc.), como mostrado na figura 1.3. Uma desvantagem que tal comunicao entre processos muitas vezes complicada de configurar ou lenta, ou ambos, porque os sistemas operacionais normalmente fornecem muita proteo entre processos para evitar que um processo modifique acidentalmente os dados pertencentes a outro processo. Outra desvantagem que h uma sobrecarga inerente na execuo de mltiplos processos: leva tempo para iniciar um processo, a operao deve dedicar recursos internos ao gerenciamento do processo, e assim por diante.

Nem tudo negativo: a proteo adicional que os sistemas operacionais normalmente proporcionam entre os processos e os mecanismos de comunicao de nvel superior significa que pode ser mais fcil escrever cdigo concorrente seguro com os processos do que com as threads. De fato, ambientes como o fornecido pela linguagem de programao Erlang (www.erlang.org/) utilizam processos como o bloco fundamental da concorrncia com grande efeito.

A utilizao de processos separados para a concorrncia tambm tem uma vantagem adicional - voc pode executar os processos separados em mquinas distintas conectadas atravs de uma rede. Embora isto aumente o custo de comunicao, em um sistema cuidadosamente projetado pode ser uma forma econmica de aumentar o paralelismo disponvel e melhorar o desempenho.

Image description

Crditos da imagem acima: Livro Erlang and OTP in Action.

Concorrncia com mltiplos threads

Image description

Crditos da imagem acima: Livro C++ Concurrency in Action.

A abordagem alternativa para a concorrncia executar vrios threads em um nico processo. Os threads so muito parecidos com processos leves: cada thread funciona independentemente dos outros, e cada um pode executar uma seqncia diferente de instrues. Mas todos os threads em um processo compartilham o mesmo espao de endereo, e a maioria dos dados pode ser acessada diretamente de todos os threads - variveis globais permanecem globais, e ponteiros ou referncias a objetos ou dados podem ser passados entre os threads. Embora muitas vezes seja possvel compartilhar memria entre processos, isto complicado de configurar e muitas vezes difcil de gerenciar, porque os endereos de memria dos mesmos dados no so necessariamente os mesmos em processos diferentes. A Figura 1.4 mostra dois threads dentro de um processo comunicando atravs da memria compartilhada.

O espao de endereos compartilhado e a falta de proteo dos dados entre os threads fazem com que a sobrecarga (overhead) associada ao uso de mltiplos threads seja muito menor do que a do uso de mltiplos processos, porque o sistema operacional tem menos contabilidade (bookkeeping) a fazer. Mas a flexibilidade da memria compartilhada tambm vem com um preo: se os dados so acessados por mltiplos threads, o programador da aplicao deve garantir que a visualizao dos dados vistos por cada thread seja consistente sempre que ela for acessada. As questes relacionadas ao compartilhamento de dados entre threads, e as ferramentas a serem usadas e as diretrizes a serem seguidas para evitar problemas so abordadas no livro C++ Concurrency in Action. Os problemas no so intransponveis, desde que se tome o cuidado adequado ao escrever o cdigo, mas eles significam que muita reflexo deve ir para a comunicao entre os threads.

A baixa sobrecarga associada ao lanamento e comunicao entre mltiplos threads dentro de um processo em comparao com o lanamento e a comunicao entre mltiplos processos de uma nica thread significa que esta a abordagem favorecida para a concorrncia nas linguagens orientadas a objetos, incluindo C++, apesar dos problemas potenciais decorrentes da memria compartilhada.

Concluso

Essa foi realmente s uma introduo sobre o assunto. H muito conhecimento ainda pra ser estudado quando falamos em concorrncia com mltiplos threads ou concorrncia com mltiplos processos. Cada abordagem tem seus pontos positivos e negativos e, dependendo da linguagem de programao que voc atua; voc ter que focar mais em umas dessas abordagens. O prximo passo agora procurar colocar a mo no cdigo visando esses conceitos e como isso pode melhorar e trazer benefcios ao seu software.


Original Link: https://dev.to/maiquitome/ola-mundo-da-programacao-concorrente-57mp

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To