Guerra Infinita, uma análise da Ciência da Computação

Já assistiu Guerra Infinita? Se não, cuidado com pequenos e até insignificantes, spoilers. Este artigo é uma forma lúdica de tratar problemas que se tem ao realizar programas de computador

[ Hits: 10.437 ]

Por: Elgio Schlemer em 04/05/2018 | Blog: https://profelgio.duckdns.org/~elgio


E quanto a seção crítica?



O maior problema, porém, a ser resolvido é por conta de uma programação concorrente.

Para facilitar o entendimento, considerei que o estalar os dedos consiste nas seguintes tarefas (é software proprietário, logo não tive acesso ao algoritmo):

1. Contar quantos seres vivos existem no universo e armazenar em uma variável (qtdSeresVivos)
2. Calcular a metade (divisão inteira para evitar crossover com the walking dead)
3. Tratar o caso de ser um número impar (visto no capítulo anterior deste artigo). nvit tem a quantidade de vítimas
4. Executar um laço de 1 até nvit:
   4a) escolher aleatoriamente um ser do universo
   4b) se o escolhido já foi escolhido antes, volta para nova escolha
   4c) mata o ser escolhido
   4d) incrementa contador do laço
   4d) próxima vítima
5. FIM


Obs.: poderia ter somente a escolha das vitimas gerando uma lista e após, já tendo as vitimas, executar um único kill para todas. Porém ficou evidente que a manopla demora para matar, já que as pessoas da terra foram morrendo lentamente. Uns que morreram até viram os anteriores a eles morrerem. Então a escolha foi a etapa mais lenta.

Considerando tal algoritmo, percebe-se nitidamente um problema clássico de concorrência.

Vamos assumir que o passo 1 ocorre no tempo T1 e passo 5 (FIM) ocorre no tempo T2.

Entre T1 e T2 existe um enorme lapso de tempo onde:

a - seres vivos do universo podem ter morrido de outras formas entre T1 e T2.
b - novos seres podem ter nascido entre T1 e T2

No caso de (a) pode ser que a função kill(vitima) falhe por tentar matar uma vítima escolhida que já havia morrido de outra forma após a escolha. Pode gerar um kernel panic ou algum outro erro bem sério. Na melhor das hipóteses, sem erro algum, ocorrerá que a manopla falhou pois efetivamente não irá dizimar metade do universo.

Já no caso de (b) tem-se que, além da metade ter mudado, os seres nascidos entre T1 e T2 não participaram da seleção e foram, desta forma, beneficiados. O plano de Thanos é que a escolha não beneficiasse ninguém.

Ambos os problemas (a) e (b) são inadmissíveis, ainda mais considerando-se jóias que se intitulam "do infinito".

A solução para este impasse é o gerenciamento desta seção crítica: um semáforo antes de T1.

O semáforo bloquearia qualquer nascimento ou morte por outros meios até que o algoritmo da manopla esteja completado:

1) pede acesso exclusivo a área crítica antes de T1
2) com o acesso garantido, sessam-se todos os nascimentos e mortes do universo, pois a manopla está atualizando o sistema
3) Procede-se normalmente ao algoritmo
4) Ao final, item 4 do código, sai da seção crítica, liberando nascimentos e mortes

Esta abordagem precisa ser melhor estruturada, mas para isso é necessário detalhes do hardware e sistema operacional da manopla.

Certamente não é Windows, senão já teríamos visto uma tela azul e Vingadores Win.

Impressionante como os roteiristas esqueceram deste detalhe.

Página anterior    

Páginas do artigo
   1. O estalar dos dedos
   2. O problema matemático de calcular a metade
   3. E quanto a seção crítica?
Outros artigos deste autor

Introdução a criptografia

Sinais em Linux

Mecanismo de firewall e seus conceitos

Estrutura do IPTables 2: a tabela nat

Cuidado com números em Ponto Flutuante

Leitura recomendada

Debian 3.1 (Sarge) - Atualizando pacotes para unstable e compilando um novo kernel

Compilando o Kernel Linux

Alterando as permissões de um arquivo

Atualizando kernel de 2.4.31 para 2.6.13 no Slackware 10.2

Kernel-BALA

  
Comentários
[1] Comentário enviado por sacioz em 05/05/2018 - 20:49h

Caraca ! Esse cara tá vivo ainda....Putz...ha quanto tempo não havia nada dele por aqui...Talvez eu tome alguma patada pelo comentário , mas é o que penso.

[2] Comentário enviado por elgio em 05/05/2018 - 21:03h


[1] Comentário enviado por sacioz em 05/05/2018 - 20:49h

Caraca ! Esse cara tá vivo ainda....Putz...ha quanto tempo não havia nada dele por aqui...Talvez eu tome alguma patada pelo comentário , mas é o que penso.


E quando volto é para escrever bobagem. Kkkk

[3] Comentário enviado por eduardo em 07/05/2018 - 09:20h

Ótima abordagem para explicar concorrência! Realmente, não havia pensado de forma algoritmica quando vi o filme. Há casos do caso (a), inclusive, que ocorrerão devido ao algoritmo (acidentes de trânsito, um avião caindo pois "o piloto sumiu"...). Me lembrou a série The Leftovers hehehe

[4] Comentário enviado por Nerdiarretado em 07/05/2018 - 12:08h

Edificante. Parabéns!

[5] Comentário enviado por Nerdiarretado em 08/05/2018 - 13:37h

Só não entendi a razão desse crescimento populacional ser uma PG, perguntei ao meu professor de faculdade e ele disse que não fazia o menor sentido esse crescimento ser uma progressão geométrica. Poderia me explicar de onde tirou isso?
Se caso não existisse as guerras, epidemias e desastres naturais, atuando no combate desse crescimento, você não acha que a população teria duplicado a cada 25 anos. Aí sim seria uma PG.

[6] Comentário enviado por Ragen em 10/05/2018 - 14:50h

Penso que quando o personagem começou a ser escrito, não havia muita preocupação do autor com seres em extinção, assim sendo, recorro a lógica da entropia do universo: um kill random.

Além disso se ele tem a gema do tempo, não poderia fazer um bypass em qualquer concorrência, já que manipula o próprio tempo. Seria muito mais um broadcast com um dispatch de kill com um lock para todos os outros eventos. Ainda em tempo: como visto no Dr. Strange, se ele bypassar a própria concorrência do tempo, ele pode entrar em um loop temporal.

[7] Comentário enviado por adrianoh2 em 14/05/2018 - 07:31h

Na boa, fazia tempo que não aparecia um artigo nerd aqui. Todo mundo vai no CTRL+C e CTRL+V.... estava na hora de usarem a manopla para acabar com a mesmice.
Ainda bem que os nerds não foram escolhidos no algoritimo, um tipo de vírus imune ao registro.

[8] Comentário enviado por oseasfr em 20/05/2018 - 01:23h

Foi bem divertida a postagem.

[9] Comentário enviado por rabbit em 28/05/2018 - 17:34h

Excelente artigo mano!

[10] Comentário enviado por osobreira em 30/05/2018 - 20:38h

Parabéns, está divertido, porém foi bem explicativo. Aguardando também a resposta a pergunta do nerdiarretado quanto ao crescimento populacionar ser uma PG.




[11] Comentário enviado por Buckminster em 06/06/2018 - 19:41h

O crescimento populacional não é uma PG. Os dados do texto abaixo são da ONU:

"No ano 10 mil A.C. (antes de Cristo) estima-se que a população mundial estava em torno de 10 milhões de pessoas. No ano 0 (era Cristã) a população mundial estava em torno de 170 milhões de pessoas. No ano 1.000 era de 300 milhões. Em 1.500 era de 425 milhões. No ano de 1.700 a população mundial era de 600 milhões de pessoas. Em 1.800 a população mundial atinge, aproximadamente, o primeiro bilhão de pessoas. Atualmente, em 2017, somos 7 bilhões de pessoas.
Sem querer examinar as causas do crescimento populacional nestes diferentes períodos, salta aos olhos que a partir de 1.700 a população mundial começou a crescer vertiginosamente denotando que neste período aconteceu alguma coisa; e esta coisa poderíamos dizer que foi a revolução industrial. Estimando-se a margem de erro no cálculo populacional mundial em 5% (uma taxa estimada aceitável), para mais ou para menos, daria um total de 350 milhões de pessoas. Contudo, sabe-se que em certos países o censo demográfico não chega nem perto da realidade.
Mesmo com várias doenças, com duas guerras mundiais e vários genocídios que ocorreram a partir de 1.900, causas que sabidamente refreiam o crescimento demográfico, ainda assim a população mundial cresceu e cresce a passos largos, o que não acontecia até meados de 1.700. Em 1963 a média mundial de bebês nascidos era de 5 por mulher, atualmente essa média é de 2,5.
Apesar de que a expectativa de vida subiu e a taxa de mortalidade infantil desceu, vê-se que em 11.700 anos (10.000 a.c. - 1700) a população mundial cresceu 590 milhões de pessoas e, desde o ano de 1.700 até os dias atuais (1700-2017), em 317 anos a população cresceu 6 bilhões e 400 milhões de pessoas. É muita diferença.
Em 11.700 anos a população mundial cresceu 590 milhões de pessoas e em 317 anos cresceu 6 bilhões e 400 milhões de pessoas. É muita diferença. Sem questionar a veracidade desses números, pois não se ousa contestar dados da ONU. Porém, é muita diferença.
Estando certos esses dados, resta uma pergunta: o que houve para que a humanidade começasse a procriar como coelhos? E assim tão de repente?"

E, independentemente dos dados do texto acima, se o crescimento populacional é uma PG, qual é a razão dessa PG?
Alguém, por gentileza, calcule a razão da PG do crescimento populacional terrestre.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts