Concorrência e Paralelismo (Parte 1) | Entendendo Back-End para Iniciantes (Parte 3)
113.72k views6894 WordsCopy TextShare
Fabio Akita
De volta à série Começando aos 40, estamos já no oitavo episódio! E ela é a Parte 3 do tema de Back-...
Video Transcript:
olá pessoal fábio akita vamos voltar à parte 3 do tema the black and recapitulando eu já expliquei os conceitos básicos do computador e no sistema operacional sobre processos e trailers expliquei sobre compilação e bibliotecas estáticas e dinâmicas também já expliquei sobre máquinas virtuais e interpretadores vemos uma rápida passada em características de algumas linguagens a história do java um pouco do lado dot net até de uma tangente na história inicial de desenvolvimento mobile e mais um pouco sobre licenças de software estamos já no oitavo episódio da série começando aos 40 e hoje acho que é hora de começar a tratar de um tema que é muito discutido mas eu acho que os iniciantes têm dificuldade para visualizar na cabeça concorrência e paralelismo mas antes de entrarmos nos assuntos mais óbvios como go ele dizia o node js precisamos voltar na história como sempre para que todos finalmente comecem a entender esse assunto de verdade infelizmente explicar concorrência paralelismo só falando é muito difícil vocês ainda vão precisar praticar programando centenas de vezes coisas diferentes para começar a entender de verdade como isso funciona eu espero que a explicação que eu dei agora pelo menos ajuda um pouco vocês terem uma imagem na cabeça do que esperar quando realmente colocarem as mãos no metal então vamos lá [Música] hoje em dia todo mundo tem um computador potente mesmo o mais fraco intel e 3 é dual core com 3 ghz ou mais e se você tiver a bufa comprar os novos intel e 9 ou amd fred hitler com oito cozzi mais de 4 gigahertz você tem mais poder de computação do que os mais poderosos computadores dos anos 60 combinados e se falarmos de processadores de servidor como o sinttel z 1 e 7 temos até 24 corpos e vocês sabem que até que intel tem a tal tecnologia hyperthreading gente e faz você enxergar duas tradings simultâneas no mesmo corpo então esses 11 e sete de 24 corpos podem ter até 48 trajes de execução isso é bastante paralelismo até mesmo seu celular android com chipset qualcomm 845 é nada menos que o que está a correr com 2. 8 ghz escada e isso porque não estamos falando de gepeas que tem propósitos diferentes de uma cpu mas possuem corsa que processam em paralelo também no caso da nvidia é o que chamamos de cuidar kors e na nova rtx 2080 temos nada mais nada menos que 2 1944 cuidar kors sendo quem coloca as mães melhores podemos colocar duas placas dessa rodando em paralelo e poder ter acesso a quase 6 mil com da costa ao mesmo tempo isso sim é processamento paralelo massivo então do seu celular a desktops servidores estamos claramente no mundo massivamente paralelo mas não foi sempre assim considere que acesso a esse mundo paralelo só começou de verdade pra nós programadores a coisa de pouco mais de uma década para entender como tudo mudou eu vou resumir como foi do fim dos anos 50 até agora nos anos 50 talvez você já tenha ouvido falar do meme que a ibm dizia que o mundo não precisa de mais do que cinco computadores eles estavam falando do ibm 701 e se você não sabia disso essa frase foi obviamente já de contexto e é fake news pra variar a frase em contexto foi numa reunião de acionistas que dizer que amy tinha planos de vender talvez cinco ibm 701 mas voltaram com 19 pedidos estamos falando de uma máquina que se fosse alugar na época não custaria menos que 15 mil dólares em dólares dos anos 50 ea potência era uma máquina de 18 bits lembrando que seu celular hoje a 64 bits e essa máquina minha com nada menos que 1 quilo byte de memória e podia suportar um máximo de 9 km e ainda foi a primeira que vinha com gravador de fita que podia gravar nada menos que 1 ponto 2 megabytes a uma velocidade estrondosos de 5. 6 kilobytes por segundo lembrando que sua placa de rede ethernet porcaria trava trafega dados há pelo menos 1 gigabit por segundo isto é considerado lento hoje em dia dado que existem placas de 10 gigabits então você imagina que numa máquina cara dessas basicamente uma calculadora glorificada você gostaria de usá lo da forma mais eficiente possível era uma época onde a linguagem mais avançada eram fortran da vida pra fazer cálculos e onde você carregava programas com cartões perfurados numa máquina que conseguia ler no máximo 150 cartões por minuto e perfurar no máximo 100 cartões por minuto então a forma mais eficiente de usar essa máquina era os programadores serem extremamente cuidadosos para escrever programas de cálculo muito precisos e sem erros que chamamos de jobs e organizar esses jovens em bétis ou grupos de programas similares e deixar numa fila para ir processando dia e noite foi a época dos jobs em betty se tivesse um erro no seu programa você só ia saber no dia seguinte ter que repetir todo o processo então dos anos 50 para os anos 60 alguns grandes nomes que já falei antes como joão barcos criador foram hoje uma cartilha que é considerado o pai da inteligência artificial eo criador lugar bate colector lhesp começaram a trabalhar o conceito para aumentar a eficiência dos programadores em vez de terem que colocar seus jovens numa fila e ficar só esperando de braços cruzados e se fosse possível usar as ineficiências do computador como o tempo que ele fica lendo escrevendo nas fitas em outras causas para permitir que múltiplos programadores pudessem trabalhar concorrentemente no mesmo computador o conceito básico era que fosse possível salvar o contexto do ambiente de um programador e trocar pelo contexto de outro programador entenda contexto como o que define o ambiente de trabalho desse programador o que está na memória basicamente se você trocar muito rápido entre um contexto e outro ou seja fazer suíte para os programadores parece que ele está sozinho na máquina mas na verdade a máquina está gerenciando entre múltiplos contextos a máquina oferece um pedaço de tempo o time sly se para cada ambiente e vai dando a vez para outro ambiente sucessivamente esse é o conceito de time share baseado em conto ex witching esse conceito nasceu na época do cbm 704 ibm 709 e foi incorporado aos meios frames dos anos 60 o conceito de time share em existe mais no mundo corporativo em frames em mini computador dos anos 60 até 70 nos anos 80 principalmente começou a aparecer nos únicos usados em work stations e só nos anos 90 começou há de fato aparecendo mundo dos desktops se você usou microcomputadores nos anos 60 e 80 e no cume cruz muito simples com cpus como os 80 ou motorola 68 mil ou mesmo entre 80 e 88 todos cp uso de um único corte só sabe executar uma única instrução de cada vez a cada giro do coque se você já teve 15 air msx commodore 64 apple 2 ou outras máquinas 8 bits ou 16 bits da década de 80 você se viu na mesma situação dos computadores dos anos 50 só consegui executar uma tarefa ou um jovem de cada vez no ms dose você podia executar o programa mas para executar outro precisava sair do primeiro e só depois carregar o segundo ou usar um truque de interrupção a famosa int 21h que era o recurso determinate em esteio residente ou tsr de uma forma rudimentar você podia carregar um segundo programa chamar essa interrupção para devolver controle por voz mas deixar residente em memória de forma que podia ser chamado de volta era como utilitários pequenos como bora onde sai de que funcionavam na época e isso meio que simulava um tipo de multitarefa foi só com o windows 3.
1 que a maioria das pessoas realmente experimentou mais esse conceito de multitarefa mas no caso era multitarefa cooperativa quando falamos em multitarefa num computador com cpu do único corp pensa numa mesa de escritório sendo dividida entre mais de uma pessoa a primeira pessoa chega coloca as coisas dela na mesa e começa a trabalhar pra outra pessoa usar a primeira precisa tirar todas as coisas dela da mesa e deixar a outra colocar as coisas dela as coisas da primeira pessoa é o tal contexto ea troca entre uma e outra é o suite é o mesmo conceito de time share em que falei antes mas se a segunda pessoa se recusar a sair da mesa ninguém mais consegue usar mesmo então ela precisa cooperar para todo mundo poder usar esse é o conceito de multitarefa cooperativa que é o que tinha no windows 3. 1 se um programa fizesse alguma coisa que bloqueasse o sistema como imprimir todos os outros programas ficam impedidos de ter sua vez para rodar isso veio a mudar em sistemas operacionais 32 bits como o s2 o windows 95 eo windows nt e também nas distribuições linux que começaram a aparecer do começo por meio da década de 90 nesse caso temos o que já expliquei antes cada processo é iniciado pelo sistema operacional no espaço de memória é protegido ou seja onde um programa não consegue escrever em cima da memória de outro programa além disso agora não há um programa que tem que cooperar para os outros poderem rodar na metáfora da mesa e imagine que agora tenha um supervisor que tira a pessoa da mesa para deixar a outra usar mesmo se a pessoa não quiser sair naquele momento esse supervisor é que chamamos de esquiador do sistema operacional ele a lógica com um pedaço de tempo o times live para cada programa e interrompe para deixar outro rodar a forma de fazer isso é pegar o que tá natal mesa separada do lado e colocar as outras coisas da outra pessoa na mesa e quando del tempo ele tira as coisas da mesa e devolve o que estava fazendo antes e vai fazendo esses suíte de contexto e multitarefa preemptiva isso é feito no nível do processo que na metáfora é o que está executando natal mesmo naquele determinado momento mas digamos que quiséssemos ter tarefa sem paralelo na mesma mesa ao mesmo tempo por definição cada processo tem uma única tragédia de execução pense numa cred como sendo uma tarefa a ser executada na mesa mas podemos ter mult3 que seria o equivalente a até duas pessoas usando a mesma mesa e os mesmos materiais na mesa ao mesmo tempo para isso acontecer o tal supervisor faz a mesma coisa ele força uma das pessoas a parar de usar o material da mesa para deixar a outra pessoa sentada do lado usar o mesmo material multi threaded é mais ou menos isso duas pessoas começando com o mesmo material ao mesmo tempo cada pessoa pode até usar o seu próprio material mas ela tem acesso ao material todo que está na mesa que na metáfora é o espaço de memória do processo um processo pode ter uma ou mais travis num processador com o único corte não é possível que as duas pessoas trabalhem exatamente ao mesmo tempo porque só tem um único espaço na mesa então a única forma de haver concorrência é o tal supervisor fica fazendo uma das pessoas para usar o trabalho para dar um tempo pra outra pessoa continuar o trabalho dela quando falei de um processador moderno como intel e 3 ela tem dois corpos pense em dois corpos com duas mesas nesse caso cada tragédia ou cada pessoa realmente pode trabalhar verdadeiramente em paralelo mas nos anos 90 o comum era um processador 486 o peixe onde o único corte só servidores tinham computadores com dois ou mais kors então você tinha multitarefa preemptiva que fica para usando trajes pra outra poder rodar e agora você tem múltiplo orçamento paralelo onde cada três de roda separadamente em um processador separado quando são dois processos independentes eles podem rodar 100 por cento em paralelo se não estiverem usando nada que é compartilhado pelos dois como um arquivo ou outro recurso de hardware com uma impressora ou rede se um deles estiver usando a impressora obviamente o segundo processo é obrigado a esperar ou fazer outra coisa enquanto espera a mesma coisa se forem duas tragédias dentro do mesmo processo seria o equivalente às duas pessoas uma em cada mesa mas onde ambos dependem do mesmo material para trabalhar e é nessa situação que multicred começa a ficar complicado se ambas as pessoas quiserem escrever do mesmo pedaço compartilhado de papel ao mesmo tempo por exemplo imagine a zona que ia ser cada linha ou cada palavra de uma pessoa fica misturado com o que a outra pessoa quer escrever por cima ou seja seja lá o que eles gostariam de escrever no papel e havia um monte de dados misturados na realidade você talvez gostaria que a primeira pessoa a usar seu papel e só quando terminasse a segunda pessoa usasse na sequência mas como eles estão disputando ao mesmo tempo pode ser que o inverso aconteça e como não sabemos quem vai ganhar a disputa de quem começa a usar o papel na frente do outro literalmente temos uma condição de corrida ou que se chama the race condition que pode levar a resultados inesperados ou não determinística us então como fazer nesses casos para isso precisamos de um sinalizador quando a primeira pessoa quiser escrever ele coloca uma placa dizendo ocupado quando a segunda pessoa foi escrever também ele ver a placa e espera quando a primeira pessoa termina o que queria ele tira a placa de ocupado agora a segunda pessoa pode colocar a placa dela e escrever a sua parte e depois tirar a placa de ocupado se ela vai embora e esquece a placa aquele pedaço de papel fica bloqueado e ninguém mais consegue escrever nele agora pense que a primeira pessoa bloqueia o pedaço de papel então a segunda pessoa resolve book a outro pedaço de papel que a primeira vai precisar na sequência mas ambos esquecem de tirar as placas de ocupado de seus respectivos papéis e cada um que é usar o papel do outro temos o impasse onde nenhum sinaliza para o outro que já terminou e ambos pararam de trabalhar esperando eles estão literalmente mortos por causa do bloqueio ou seja o que chamamos de de locke essa placa de ocupado é o queen programação multi threaded chamamos de locke como tex que significa mutuamente exclusivo é um sinalizador de exclusividade e como no exemplo quem bloqueia o recurso também têm a responsabilidade de desbloquear quando acabar e com isso você consegue ver como duas tradings mesmo se tiver dois corpos na cpu onde eles teoricamente poderiam trabalhar independente sem paralelo se tiver um recurso compartilhado como o tal pedaço de papel de exemplo um é obrigado a esperar um outro terminar eu tentei usar metáforas aqui mas você só vai entender realmente o que tudo isso significa o dia que realmente começar a programar usando esses recursos entenda alguns fatos primeiro toda a cpu moderna é feita para rodar prédios é como se fosse a menor unidade de execução cada trad executa uma sequência de instruções e tem um contexto que seu material de trabalho que fica nos registradores da cpu quando o cpu faz o tal context suíte ele guarda que está nos registradores naquele momento e deixa outra tragédia executar fazer essa troca de contexto não sai de graça porque tem o trabalho de tirar o material da atual mesa e colocar o material do outro na mesma mesa então quanto mais travis você tem que executar no core mais devagar o trabalho geral vai ficar então não adianta ficar criando trad que nem um idiota achando que tudo vai rodar em paralelo e fica mais rápido lógico que não é o ideal é ter mesmo número de tragédias que o número de cosmos eo cpu por outro lado não é porque você tem dois corpos início duas tradings que ambos vão rodar da forma mais eficiente porque eles podem estar compartilhando o mesmo recurso e esperando liberal o tex que o outro colocou nesse caso uma terceira tragédia poderia se aproveitar desse período de espera executar enquanto isso caso não precisa usar o mesmo recurso então você vê como também têm exatamente o mesmo número de 3 que cortes não é uma regra em muitos casos determinar qual o número ideal de tradings que você pode subir na casa determinada máquina é uma questão de tentativa e erro criar processos é um procedimento que custa para o sistema operacional não é de graça ele precisa carregar o binário do programa alocar memória do sistema checar permissões de segurança etc esse procedimento inclusive é diferente entre os sistemas operacionais em particular sistemas linux são mais rápidos para criar processos do que um mac ou és e uma ordem de grandeza mais rápido que o windows eu já falei em outro episódio que no linux muitos programas como o apache tomam vantagem de fazer o tal forte que queria uma cópia rápida do processo atual para gerar outro processo que vai rodar concorrentemente e fazer fortes em linux é uma operação comparativamente mais barata do que no windows ou seja só porque ambos fazem a mesma coisa não quer dizer que fazem do mesmo jeito qualquer sistema que dependa de fox vai rodar ordens de grandeza pior no windows por isso mesmo desenvolvimento em windows privilegia e recomenda criar um único processo por aplicação mais usar mais três dentro do mesmo processo como uma tragédia e compartilha memória interna do processo com outras três sedes a ação de criar travis é ordem de grandeza mais barato do que criar novos processos por outro lado isso também é uma troca processo são isolados de outros processos e um não vai pisar no calo do outro você não tem o race conditions você não precisa manualmente gerenciar no texas e nem se preocupar com dread locks mais processos em windows são mais caros para criar por outro lado tradição bem mais barata só que agora temos o trabalho de nos preocuparmos em técnico manualmente codificar no texas e tudo mais a programação é sempre o ato de se comprometer você aceita uma vantagem em troca de uma desvantagem tudo sempre depende e nunca tem uma resposta certa para tudo alguém poderia dizer que porque tradição mais rápidas de criar a ilusão - recursos eles são obviamente melhores do que fazer fortes de processo por outro lado alguém pode argumentar que como temos que gerenciar muteka e coisas assim manualmente você tem muito mais bugs situações não determinísticas contradiz e portanto processos são infinitamente mais fáceis de programar com menos bugs e ambos estão certos na prática você vai encontrar mais soluções baseadas em forte de processos e sistemas linux o unix como no mac ou és e mais soluções multi threaded no windows mas isso não é uma regra e em alguns casos a melhor opção não necessariamente é a mais óbvia por exemplo um navegador web como firefox ou chrome acho que se você é desenvolvedor já sabe que eles usam recursos de multiprocesso antigamente um navegador só abria uma única página de cada vez mas aí inventaram a idéia de abrir abas e abrir múltiplos sites diferentes em múltiplas abas como navegador é razoavelmente pesado e consome muita memória para guardar tantas imagens javascript cada página carrega você quer tentar usar a menor quantidade de memória quanto possível então o primeiro instinto de um programador é fazer cada aba ser uma tragédia de fato você vai usar menos recursos mas à medida que os navegadores vão ficando mais e mais complexos a quantidade de blogs por causa de travis aumentam exponencialmente agora o bug numa tragédia pode desestabilizar o navegador inteiro porque dentro do processo do navegador uma tragédia tem acesso a tudo que outras tragédias têm acesso então era muito comum você abrir um site qualquer e de repente o navegador inteiro com 20 abas dava pau e você perdia tudo para piorar alguns desses blogs eram bugs de segurança imagina uma aba que abrir um site conseguir vasculhar memória da outra aba que está com o e comerce aberto e com seus dados de cartão de crédito na memória global cada vez que você tenta consertar um bug pode acabar acidentalmente largando um novo bug no lugar então é como tentar tampar o sol com a peneira some a isso a possibilidade de instalar polícia que ganham acesso à memória do navegador como os pubs de java os antigos de flash e você tem um desastre esperando para acontecer por isso muitos navegadores começaram a separar se as partes em processos independentes como os a falha que iniciou separando coisas como flash java em processos mas ainda manteve muita coisa entregues para usar menos memória mas no caso do google chrome ele resolveu separar completamente cada aba em seu próprio processo por um lado isso trouxe muito mais estabilidade e você já deve ter visto muitas vezes uma aba inteira crachá mas o navegador continuar rodando sem nenhum problema e você pode ver cada processo separado num teste média do windows por exemplo e inclusive pode matar um processo por lá mesmo na mão é a grande vantagem de se separar tudo em processos como eu já falei antes por outro lado todo mundo sabe como chrome hoje é um dos aplicativos que mais come ram do seu sistema e essa separação é uma das razões já que o código comum entre as diversas abas precisa ser copiada em outro processo a cada nova aba conceitualmente falando um fork de um processo é como se você pára usasse esse processo e fizesse uma cópia de tudo o que ele tem na memória pra outro processo isolado e resume-se os dois ea partir daí cada um tem vida independente um processo está consumindo um mega de ram com um forte você deveria estar agora usando dois mega mas no livro que temos um recurso chamado cópia honra haiti ou cal onde o segundo processo não usa praticamente nenhuma memória adicional e fica apontando para a memória do processo original assim que é criado se a memória não for modificada ambos podem aproveitar o mesmo dado em vez de fazer cópias desnecessárias e só coisas que o segundo processo começa a gravar começa a usar mais memória e fica invisível ao processo original e vice versa no windows o equivalente ao forte realmente duplica memória que é outro motivo de porque queria processo no windows é considerado mais caro um forte com cópia um light no linux cada processo tem acesso a uma cópia da memória do processo pai mas diferente retretes dentro do processo que compartilha tudo não existe nesse demo tex ou outro tipo de controle de acesso porque a partir do ponto do forte cada processo tem sua cota na memória e um não escreve em cima da memória do outro isso faz as coisas serem muito mais simples de programar e claro traz ainda são muito mais leves e usam muito menos memória no total você pensa no linux como um sistema estático que é sempre igual mas ele mudou radicalmente dos anos 90 para os anos 2000 e até agora a interface que você interage com o sistema que seria o chelsea linha de comando as apis são parecidas muito porque ele segue o que chamamos de padrão pouse kits que sbd porta boa por ele insistir em interface onde o ex no final de nota sua herança de unix teoricamente os de unix e seus clones como linux deveriam seguir esse padrão dos programas serem portáveis entre eles no nível do código fonte porque os binários não são compatíveis no mundo posix você tem a abstração deposits dreads o petróleo é implementado como linux dreads anos atrás fred em linux eram bugado sem nunca foram grande coisa até que finalmente alguns projetos começaram a surgir para reimplementar o suporte trás do linux como o next generation posix tradings ou ngp da ibm que eu me lembro que uma característica marcante era ser um mapeamento de m pra n ou seja uma tragédia em linux não seria equivalente um para um com uma tragédia de verdade mas o projeto que ganhou foi o leite e pouse extrai libere o npt l de urique driver que era mantenedor do gnc e embu monark vou citar de novo a seguir o mpt é uma implementação um para um em vez de cm pra n como o ngp portanto era bem mais simples de ser implementado esse projeto corrige as falhas do linux fred só partir desse ponto da praça dizer que tradings em linux ficaram decente e isso é um fato a partir daquele ano dois pontos seis a mais ou menos por volta de 2007 para ver como as coisas são diferentes entre diferentes e unix o solaris usar uma estratégia m pra ele até o solaris 9 o fmli psd-m fps deram m pra ele também mas acho que o ps também é ou foi para um para um parece que um para 1 começou a ganhar terreno mas vamos votar isso em breve guarde esse ponto eu já expliquei sobre o tal esquerdo na metáfora das mesas sendo supervisor que forçam uma pessoa a sair da mesa para dar lugar para a outra existem diferentes estratégias que o esquiador pode tomar quando você só tem uma mesa você é obrigado a deixar uma pessoa trabalhando e mandar as outras esperarem a vez do supervisor manda trocar de lugar com o próximo para ir dando chance das outras trabalharem também mas imagine se o supervisor resolve deixar uma pessoa que ainda não está pronto a sentar na mesa e ela fica sem fazer nada enquanto as outras estão esperando e se você adicionar uma segunda mesa parece que fica mais fácil mas na verdade fica mais difícil imagina se você tem três pessoas para usar as duas mesas mesma coisa você vai rotacionando uma pessoa em cada mesa mas imagina o tranco de uma pessoa ficar transportando o seu trabalho de uma mesa pra outra se o supervisor não foi muito legal e não deixar ficar na mesma mesa quando você tem duas mesas não dá pra deixar seu trabalho no canto da mesa pra voltar pra ela rápido na próxima rodada necessariamente você pode ter que ficar transportando suas coisas de um lado pro outro e obviamente isso é lento e se você não tomar cuidado e seu esquerdo léo foi meio burrinho ele vai dando vez para atletas que não precisam ou deixar fred com pouco trabalho ocupando o tempo demais na sua vez o pior cortando no meio trabalho de quem realmente precisa rodar e por isso no começo dos anos 2000 um linux era ruim pra coisas com o tocar um vídeo um vídeo ficava engasgando mesma coisa com áudio foi só em 2007 qualquer no 2. 6 que ganhamos o complexo de féris que adorou cfs que implementa um algoritmo melhor de autoria do embu monark já mencionei antes que se inspirou nas idéias de como olivas em resumo esse ser fiéis maximiza uso da cpu e 80 da preferência para programas interativos com aplicativos desktop que diferente de processamento intensivo tende a ficar ocioso por p os de tempo e de repente precisa de prioridade para coisas como tocar um vídeo cada sistema operacional implementa estratégias diferentes de esquiador neckel é windows bs 10 minutos e outros priorizam coisas diferentes e usam algoritmos diferentes o próprio windows demorou anos para chegar no nível de granularidade no mac wes que sempre foi considerado melhor principalmente em criação multimídia porque ele não engasgava no gerenciamento de travis por isso músicos de jazz sempre preferiram mex especialmente em apresentações ao vivo porque eles sabiam que o áudio por exemplo não engasgado nada porque o esquiador resolveu do nada da vez pra outra tragédia à toa isso acontecia com windows e com linux e por isso eles eram bem lutas em situações assim de novo entenda que traz também têm comportamentos diferentes em diferentes sistemas operacionais quem saiu na frente na estratégia de tradings foram os macs no começo dos anos 2000 com o s10 windows era o segundo melhor mais ou menos e foi passado pelos livros com o cf é só depois de 2007 ou seja o linux um moderno que conhecemos hoje só tomou forma de verdade a partir de 2007 em termos de engasgos você vai notar que o windows ainda é menos polido que michael s e também desktop linux e esse fator no esquerdo durante jogo foi mais um motivo de porque no mundo linux processos continuarão sendo importantes de 2007 agora vamos voltar quase uma década em 99 quando surge um paper que começou a ajudar forma como pensamos sobre concorrência no mundo de rede web estamos falando lendário paper sobre o problema dos e 10k didã kagan do antigo site sem rompimento com discutindo quando os servidores de ftp da cintel conseguiram servir até 10 mil conexões simultâneas sobre uma internet de um gigabit começamos a usar esse termo para discutir como servir grandes quantidades de conexões simultaneamente 10 mil parece muita coisa mais um só servidor do whatsapp hoje serve mais de 2 milhões de conexões simultâneas o problema existem diversas estratégias para fazer isso eu já mencionei aí ou mas agora vou definir um pouco melhor aí é qualquer entrada e saída do sistema arquivos rede sbt claro o monitor agora pense nos nem frames antigos que usavam dispositivos de fita como os do ibm 701 que eu falei que gravavam dados a fantástico 5.
6 kilobytes por segundo se tivesse que ficar esperando a operação toda acabar o computador não ia fazer mais nada a não ser esperar por isso nem frames lendariamente tem milhares de canais paralelos deaai ou mas o mesmo não acontece no barramento de computadores comuns como que usamos ou seja mesmo que você consiga ter paralelismo disponível na sua cpu e sistema operacional se você só tem um hd não tem como milhares de 3 descreverem ao mesmo tempo o barramento de ouvir um gargalo é como se você dividir o trabalho de escrever um livro entre 500 pessoas onde cada um escreve uma página então você vai acabar o livro o tempo que leva para escrever uma única página porém se todo mundo tivesse que escrever no mesmo livro não adiantou nada só dá para escrever uma página de cada vez lembra quando eu falei de locke sem memória global do processo compartilhado entre múltiplas travis algo semelhante acontece quando o trânsito tentam acessar recursos restritos do sistema é o que chamamos de operações que bloqueiam ou são boca que antes então se uma tragédia e resolve escrever alguns gigabytes no arquivo essa tragédia fica bloqueada até terminar nesse caso outra tragédia pode executar outra coisa que não depende do hd enquanto a primeira fica bloqueada conexões de rede também são boa que antes imagina uma tragédia fazendo o download de alguma coisa ou algum cliente de rede pendurado numa tragédia essas operações são boca que antes ea sequência de instruções da trade vai esperar até a operação terminar e desbloquear o processamento com o tempo os sistemas operacionais passaram implementar algo chamado aí ou assíncrono ou seja em vez de bloquear o processamento hatred pode pedir pra escrever alguma um arquivo mas o sistema operacional não vai bloquear essa tragédia em vez disso hatred pede pra escrever indica na função do sistema para quando ele terminar enviar um evento de término daí essa tragédia pode configurar pra quando receber esse evento daí executar alguma outra sequência de instruções ou seja a programação fica dependente do evento de término da operação de haia ou seja a operação de leitura ou escrita e é isso que muitos chamam de orientação a eventos não é nada novo qualquer linguagem de programação dos anos 90 usado para fazer aplicativos gráficos sempre usou programação orientada a eventos por exemplo o código que é executado quando você tem o evento de clicar no botão ou o evento de arrastar uma janela no linux podemos enviar sinais a um processo que é uma forma rudimentar de comunicação inter processos como os sinais de que o como o sig termiou o seguinte aqui estamos estendendo para eventos de ioiô do sistema operacional mesmo sem aí ou assíncrono podemos atender múltiplas conexões como no problema dos e 10k fazendo cada conexão ao servidor ser servida por fortes do processo o servidor é como a primeira versão de uma paz resolvia isso cada nova requisição era gatilho para um forte do processo principal que gerava um processo filho eu já expliquei que isso é pesado especialmente em windows a segunda alternativa é cada nova conexão recebida no processo o servidor ser servida por uma nova tragédia dentro desse processo também já expliquei como tradição bem mais leves que o processo mas temos o problema de gerenciar o compartilhamento da memória interna do processo entre múltiplas tragédias e os bugs que isso pode causar como race conditions idéia de locks além disso quando estamos falando de 10 mil conexões ou mais seria necessário mais de 10. 000 trades e expliquei com o contex uit entre tradings não é algo tão simples assim nem barato você precisa de um esquerdo ler muito bom e mesmo assim cada tragedy consome recursos do sistema operacional versões subsequentes do apache e outros servidores web como o ie-s no windows se valeram de fred para servir milhares de conexões mas não era o bastante a terceira opção como já imaginaram é usar esse tal recurso de abril a synchro que permite que uma única trad ordene múltiplas operações de aí o faustão operacionado sem que ele fique bloqueado e o sistema operacional se vira para realizar essas operações e vai notificando a tragédia à medida que cada operação vai terminando cada sistema operacional e implementa e sistema de fila de eventos pra e os de formas diferentes sistemas derivados de bsb como free psd o mesmo é que o ess temas skol chamada key que o windows uma coisa chamada aí ou como lixão porte o while city e os linux tinham-se skol chamada select depois foi finalmente é mais usado agora que é pô assim como o gerenciamento de thrash esquiadores cada uma dessas implementações se comporta de formas diferentes estão vendo como os sistemas operacionais são mais diferentes do que só interface gráfica entre elas como resultado de toda a discussão do fim dos anos 90 e começo dos anos 2000 em cima do ppdc 10 cade dan kelso surge um projeto que nasceu com o objetivo de superar o apache em conseguir servir dezenas de milhares de conexões simultâneas usando o mínimo possível de recursos do sistema ou seja sem usar a estratégia de uma conexão por processo outred e sim usando uma combinação de processos e chamadas de aí ou assíncrono é assim que nasce o projeto do servidor web mais rápido escalar o que temos até hoje o indígena ex de igor se zuev que começou a ser desenvolvido a partir de 2002 com o lançamento da versão estável em 2004 o índice ibex tem um processo master que carrega outros processos que chama de workshops e você vai ver que a palavra o work é um termo muito usado em arquiteturas concorrência cada o work consegue gerenciar milhares de sócrates de conexão de navegadores requisitando páginas web por exemplo em vez de gerar um forte ou uma tragédia por conexão ele registra a requisição via e pouco no linux e implementa o lupi de eventos pense que o programa do work é um loop que fica fazendo se escolas não bloquear antes de a apple e cada vez que o loop repete ele checa se vê o evento de término ea executa o que precisa e devolve a página de volta pro e visitante é uma forma de uma única tragédia e consegui servir milhares ou dezenas de milhares de conexões simultaneamente numa metáfora do jeito antigo é como se um restaurante todo cliente pedisse direto para o chefe o prato que quer ele só consegue atender e fazer o prato de cada vez e cada cliente na fila precisaria esperar o prato do cliente anterior fica pronta para pedir o seu ou seja último cliente da fila precisa esperar todos os clientes anteriores têm os pratos prontos antes de poder pedir o seu agora adicione um garçom todos os clientes fazem o pedido por um garçom atrás do outro e podem se sentar agora o último cliente da fila é atendido bem mais rápido eo garçom vai passando os pedidos para o chefe e daí vai devolvendo os pratos à medida que forem ficando prontos é como o evento de terno que eu falei antes de ayew mas os clientes já foram todos atendidos fizeram os pedidos e podem ficar sentados fazendo outra coisa é mais ou menos a diferença entre só tem aí o book ante e tem aí ou não bloquear ad não fica todo mundo bloqueado esperando em seqüência voltando ao indie next como cada workshop é uma única trad o master sobe na média o workshop por cor disponível na cpu então uma cpu quadcore subiremos quatro workshops cada workshop com lupi de eventos que fica esperando os eventos de término de cada requisição de ayew que ele recebe com capacidade de servir dezenas de milhares de conexões simultaneamente e como ele não precisa criar uma trade por conexão ele não perde nem tempo nem recursos fazendo com text suíte então o índice ibex num bom servidor consegue servir até milhões de conexões simultaneamente especialmente se for servir coisas simples como ler uma página html estática e só devolver sem processar lógica nenhuma se você vende java script talvez já tenha ouvido falar desse pattern de arquitetura isso se chama um wii porque dentro do loop ele reage aos eventos de ayew que vão terminando na mesma época por volta de 2002 outro freimark também implementou o mesmo patrão director com um evento em loop e usando ayew assíncrono node js não ainda não esse foi o frei mertl esteja implementado em python em 2002 assim além de servir página html muito rápido a cada look do repto você podia executar processamento escrita em python o twitter já introduziu outro conceito os defende ou filtros mas eu vou explicar isso no próximo episódio dessa primeira parte eu queria deixar bem explícito conceitos que acho que a maioria dos programadores têm problemas em entender logo no começo concorrência e paralelismo e como os sistemas foram evoluindo para resolver esse problema aliás eu expliquei isso antes mas vamos tentar definir agora concorrência e paralelismo simplificando lembra dos computadores até os anos 90 você podia ter tarefas que pausa e deixam outras executarem no seu lugar e ficam trocando de lugar fazendo tal contexo it elas são concorrentes mas não são paralelas quando você tem dois ou mais corda cpu aí sim você realmente tem paralelismo porque duas tarefas concorrentes por exemplo trades podem ser executadas verdadeiramente em paralelo seja em uma cpu com capacidade para somente uma trade ou uma cpu com capacidade para múltiplas fredes ainda assim você precisa de um esquiador por que seu programa pode modelar e gerenciar mais trash concorrentes do que existem cortes físicas para executá las é importante também que todos entendam como os sistemas operacionais são muito diferentes especialmente nesses aspectos de concorrência como implementam fred de maneiras diferentes como existem diferentes credos e no livro você pode inclusive escolher skelos diferentes para cada caso e como aí eu a synchro é outro recurso implementado de formas diferentes sabendo desses conceitos no próximo episódio vamos falar de coisas mais abstratas como rotinas fiber de conceito de de funk soul features esse assunto é bem cabeludo concorrência e paralelismo não tem uma resposta única que resolve todos os problemas cada tipo de problema vai precisar de uma solução diferente fortes de processos funcionam multicred funcionam ayew assíncrono é só mais uma opção nessa caixa de ferramentas e nós vamos explorar outras opções além disso no mundo linux o suporte à trade off foi realmente bom a partir de 2007 por isso você vê tanta coisa interessante no mundo de concorrência dando as caras principalmente na década de 2010 muitos acham que e 20 looks o patrão de um director nasce com node.