Buscar

UNIDADE 3 - Sistemas Distribuidos AMPLI

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 85 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 85 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 85 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Introdução da Unidade
Objetivos da Unidade
Ao longo desta Unidade, você irá:
· examinar o conceito e os objetivos dos sistemas distribuídas;
· analisar o processo de comunicação dos sistemas distribuídos;
· discutir aspectos de projetos dos sistemas distribuídos. 
Introdução da Unidade
Olá, estudante. Você sabia que entender os conceitos de sistemas distribuídos é de extrema importância atualmente? Grande parte das aplicações mais populares utilizam esse modelo, em que várias máquinas são interligadas por meio de redes de computadores. Você já parou para pensar como os sistemas computacionais evoluíram até os dias atuais?
Nesta unidade, vamos compreender essa evolução, passando por todas as suas etapas até chegar nos sistemas distribuídos. Você sabe classificar os diferentes sistemas computacionais e distinguir suas características? Após completar esta Unidade, você será capaz de realizar essa tarefa, utilizando seu raciocínio crítico e criatividade para resolução dos problemas propostos. É fato que a demanda por profissionais com conhecimento em implantação de sistemas distribuídos tem aumentado principalmente em consultorias de TI que prestam serviços especializados para seus clientes nos mais diversos segmentos.
Iniciaremos agora os estudos sobre os sistemas distribuídos, o que lhe proporcionará um leque de oportunidades no mercado de trabalho, assim como conhecimentos importantes em relação a tecnologias atuais. Importante frisar que quanto mais você se dedicar, mais poderá aproveitar os ensinamentos transmitidos neste material.
Introdução da aula
Qual é o foco da aula?
Nesta aula, trabalharemos conceitos e definições de sistemas distribuídos e veremos as diferenças entre clusters e grids, além de exemplos de sistemas distribuídos e de sincronização de relógios no sistema operacional Windows.
Objetivos gerais de aprendizagem
Ao longo desta aula, você irá:
· interpretar o conceito e exemplos de sistemas distribuídos;
· examinar as diferenças entre cluster e grid;
· analisar o papel da virtualização em sistemas distribuídos.
Introdução da aula
Você sabia que, para o funcionamento correto de uma aplicação distribuída, os relógios de todas as máquinas devem estar sincronizados? Além disso, já ouviu falar em um servidor NTP, o qual serve como base para sincronizar os relógios das máquinas?
Imagine que você foi contratado por uma startup de desenvolvimento de sistemas bem-sucedida nos negócios, a qual iniciou projetos de sistemas para grandes empresas. Em seu primeiro dia, você recebeu um e-mail para uma reunião on-line de boas-vindas, mas percebeu que, ao responder e confirmar a reunião, ocorreu a indicação de horário equivocada, ou seja, o horário de recebimento do e-mail original apareceu como posterior ao horário do e-mail de resposta, conforme mostrado na figura a seguir.
Exemplo de problema em uma caixa de e-mails. Fonte: captura de tela do Microsoft Outlook.
Essa figura ilustra um problema de sincronização de relógios nos sistemas computacionais que se comunicam em rede.
Sua primeira missão como analista na startup é reportar um erro de sincronização de aplicações que rodam em diferentes máquinas de um cliente de lojas de varejo. Assim que começou sua análise, você percebeu que os relógios das máquinas que rodam a aplicação não estão sincronizados, então, para resolver isso, você deverá preparar um relatório mencionando o problema e como resolver esse ajuste de horas, para que um técnico de campo seja enviado até o local.
Após seus relatórios e apresentações entregues ao dono das lojas, este percebe que você sabe do que está falando e confessa que não entende como os computadores podem conversar entre si. Entre outras coisas, você fala da importância do sincronismo entre as máquinas e decide mostrar que sistemas em rede não são tão complicados assim.
Você já parou para pensar quais são as configurações e os comandos necessários para que essa sincronização funcione adequadamente? Qualquer computador pode ser usado para realizar a configuração ou é necessário um servidor específico para essa tarefa? Se for necessário um servidor, qual é o mais utilizado? 
Para esclarecer essas dúvidas, você decide exemplificar o funcionamento de um sistema em rede de maneira simples e prática, acessando remotamente e sincronizando o relógio local dos computadores das três lojas com a internet, por meio do seu notebook, fazendo, assim, um acesso remoto, utilizando comandos específicos, relacionados aos servidores NTP. Para que o proprietário consiga fazer o procedimento quando a sua loja adquirir uma nova máquina, crie um relatório técnico com os comandos necessários, passo a passo, para que ele mesmo sincronize a nova máquina com as demais.
Para completar esse desafio, nesta aula, você verá em detalhes o funcionamento desse processo de sincronização de relógios, incluindo comandos específicos a serem utilizados tanto para a configuração como para a constatação de que o serviço de sincronização está funcionando de maneira adequada. Ficou curioso? Espero que você se sinta motivado a dedicar seu tempo e seus esforços a um estudo que lhe proporcionará chances reais de assimilar os conceitos e as práticas que você utilizará na sua vida profissional.
Definição e exemplos de sistemas distribuídos
Mesmo que não saiba, hoje mesmo você já deve ter acessado um sistema distribuído. Ao abrir o navegador de sua preferência e acessar uma página de internet, você está usando um sistema distribuído. Essa simples ação rotineira em nosso dia a dia, por meio de um smartphone ou computador, utiliza um sistema distribuído. Mas, afinal, o que é um sistema distribuído?
Um sistema distribuído é um conjunto de computadores que são interligados via rede, porém, para o usuário final das aplicações que são executadas através deles, aparenta ser um sistema único, como uma única máquina ou um único software (TANENBAUM; STEEN, 2017).
Um de seus principais aspectos é que os computadores que fazem parte de sistemas distribuídos têm o funcionamento independente, ou seja, cada um age por si próprio e, muitas vezes, os sistemas e hardwares dessas máquinas são totalmente diferentes, mas aparentam ser uma coisa só para o usuário. Esses computadores estão ligados por meio de uma rede, e só assim é possível seu funcionamento de forma distribuída.
______
🔁Assimile
As principais aplicações e sistemas da atualidade utilizam modelos distribuídos. Esse conceito faz com que o sistema não dependa apenas de uma máquina, pois toda a carga do ambiente estará distribuída entre várias máquinas. Assim, os sistemas distribuídos ocultam o conjunto de máquinas que o fazem funcionar, aparentando ser algo único.
______
 💭Reflita
Você conheceu alguns conceitos de sistemas distribuídos e percebeu o quanto eles são utilizados em aplicações modernas. Agora que você já os conhece, consegue identificar quais seguem esse modelo dentre os serviços que mais utiliza? Além disso, será que algum serviço que você utiliza pode ser otimizado aplicando esses conceitos? Reflita!
______
📝Exemplificando
Imaginaremos que queremos ver a página de notícias esportivas do nosso time do coração em um portal de notícias X, o qual segue o modelo de sistemas distribuídos. Sendo assim, a página acessada está sendo fornecida por um conjunto de quatro servidores, os quais, para o usuário final, aparentarão ser algo único. Pensando nisso, uma das funções dos sistemas distribuídos é que, mesmo que algum dos quatro servidores que estão mantendo essa página no ar esteja desligado, os outros devem assumir sua função, dividindo a carga, e o conteúdo deve estar no ar, assim como o sistema precisa estar em funcionamento.
______
A principal motivação para construir e utilizar sistemas distribuídos é proveniente do desejo de compartilhar recursos. O termo “recurso” é bastante abstrato, mas caracteriza o conjunto de elementos que podem ser compartilhados de maneira útil em um sistema de computadores interligados em rede. Ele abrange desde componentes de hardware, como discos e impressoras, até entidadesdefinidas pelo software, como arquivos, bancos de dados e objetos de dados de todos os tipos, conforme indica Coulouris et al. (2013).
______
🔁Assimile
Um sistema distribuído é formado por vários nós/máquinas que executam uma função dentro do sistema distribuído, de modo que, para o usuário final, aparentam ser uma única máquina.
______
Segundo Tanenbaum e Steen (2017), os sistemas distribuídos possuem três objetivos principais: compartilhamento de recursos, confiabilidade e desempenho, conforme ilustra a figura a seguir.
Exemplos dos principais objetivos de um sistema distribuído. Fonte: elaborada pelo autor.
Compartilhamento de recursos, confiabilidade e desempenho
O compartilhamento de recursos refere-se à capacidade do sistema em compartilhar o acesso a quaisquer recursos utilizados por ele entre as máquinas que fazem parte da arquitetura (também chamadas de nós). Esses recursos são, na maioria das vezes, bancos de dados, links de rede que se conectam à internet, serviços de autenticação, entre outros. Apesar de não ser um objetivo exclusivo dos sistemas distribuídos – uma vez que também é um objetivo dos sistemas de rede –, é uma característica muito importante.
A vantagem de compartilhar recursos está na economia financeira, uma vez que, caso não haja tal possibilidade de compartilhamento, mais réplicas de um determinado recurso devem estar presentes em cada nó do sistema, o que impacta direta e indiretamente no custo. Entretanto, como aspecto negativo associado a esse compartilhamento de recursos, temos a questão da segurança, uma vez que o fato de mais máquinas terem acesso ao recurso implica que o sistema possui mais pontos de acesso, os quais podem ser explorados por hackers, tanto no sentido de rastreamento da comunicação quanto na própria questão de invasão de privacidade e integridade dos dados (COULOURIS et al., 2013).
Confiabilidade
A análise morfológica da palavra confiabilidade nos mostra que ela se refere à probabilidade de um produto executar a sua função prevista de forma que atenda ou exceda às expectativas, ou seja, está relacionada ao funcionamento adequado, conforme foi planejado. Podemos confundir a confiabilidade como algo relacionado à segurança do sistema, porém não tem relação alguma, conforme observam Colouris et al. (2013).
A confiabilidade nos sistemas distribuídos é maior que nos sistemas centralizados, no entanto qualquer problema relacionado aos processos ou ao canal de comunicação/transmissão pode surtir efeitos diretos sobre a execução do sistema. Podemos observar, na figura abaixo, como ocorre a comunicação entre processos nos sistemas distribuídos, nos quais são aplicados os conceitos de confiabilidade:
Comunicação entre processos em um sistema distribuído. Fonte: elaborada pelo autor.
Podemos observar, na figura acima, que, se ocorrer algum problema no canal de comunicação, isso será refletido em todo o processo de comunicação e funcionamento do sistema. A confiabilidade de um sistema é baseada em três pilares: consistência, disponibilidade e resiliência (tolerância a falhas), conforme o Teorema CAP. Esse teorema é baseado nesses pilares, e sua sigla vem das palavras consistência (consistency), disponibilidade (availability) e tolerância a falhas (partition tolerance) (GREINER, 2014). Podemos observar, na figura abaixo, a representação desse teorema.
Representação do Teorema CAP. Fonte: adaptada de Greiner (2014, [s.p.]).
Uma das características importantes do Teorema CAP, a qual pode ser observada na representação da figura acima, é que nunca podemos atingir os três pilares em sua totalidade dentro de um sistema. A forma como foi elaborado permite que você tenha apenas dois dos pilares em evidência em seu sistema, ou seja, caso selecione dois pilares em seu sistema, o terceiro ficará enfraquecido.
Disponibilidade e tolerância de partição. Fonte: elaborada pelo autor.
______
🔁Assimile
O Teorema CAP consiste em três pilares: consistência, disponibilidade e resiliência (tolerância a falhas). Seu sistema só poderá ter foco em dois deles, e o terceiro será enfraquecido. Por exemplo: se optar por consistência e disponibilidade, seu sistema terá menor resiliência. E assim ocorre em todas as suas combinações e possibilidades.
______
Desempenho
Aumentar o desempenho de um sistema também é um objetivo dos sistemas distribuídos. Se fizermos uma comparação, os sistemas distribuídos, na maioria dos casos, apresentam melhor desempenho do que os sistemas centralizados. Isto ocorre porque, em um sistema distribuído, temos múltiplas instâncias, tanto de hardware quanto de software, para realizar o processamento necessário. Como podemos medir esse desempenho?
Conforme Coulouris et al. (2013, p. 83), podemos utilizar como parâmetros:
· Tempo de resposta do servidor.
· Throughput (taxa de transferência).
· Quantidade de recursos consumidos pela rede.
· Resultados de benchmarks (execução do sistema).
· Tempo de transmissão dos dados.
Com os resultados das medições dos parâmetros listados, podemos identificar se o sistema distribuído é satisfatório.
Importa destacar que os sistemas distribuídos são mais utilizados em arquiteturas do tipo cliente-servidor, as quais apresentam recursos compartilhados (tanto a nível de hardware quanto a nível de software), a fim de permitir que milhares de clientes tenham acesso a esses recursos e possam utilizá-los como se houvesse uma comunicação direta entre as máquinas e o cliente.
______
📝Exemplificando
A maioria dos jogos multijogadores on-line atuais utiliza a arquitetura cliente-servidor para seu funcionamento. Esse tipo de jogo também é um exemplo de sistema distribuído.
Imagine um jogo on-line de guerra em que você é o jogador X e está enfrentando seu amigo, que é o jogador Y. Você, na verdade, tem três avatares dentro de uma sessão de jogo: o primeiro é o avatar que você está controlando e visualizando em seu dispositivo; o segundo é chamado de imagem autoritária, isto é, a cópia de seu avatar feita pelo servidor do jogo, a qual será enviada para que os outros jogadores possam te “enxergar” dentro do jogo; esse segundo avatar, ao ser enviado aos outros jogadores, funciona como o terceiro avatar, que será visualizado, por exemplo, no jogo do seu amigo. Logo, você movimenta o seu avatar e a sua posição é enviada ao servidor, o qual gera uma cópia com seu posicionamento e transfere-a para o jogador Y. Com isso, temos a arquitetura cliente-servidor em funcionamento.
Exemplo de jogo multijogador on-line. Fonte: Shutterstock.
Middleware, computação em cluster e computação em grid
As redes estão por toda parte e servem de base para muitos serviços cotidianos que agora consideramos naturais, por exemplo, a internet e a World Wide Web associada a ela, a pesquisa na web, os jogos on-line, os e-mails, as redes sociais, o e-commerce, etc. (COULOURIS et al., 2013). Os sistemas distribuídos podem ser considerados como uma solução mais robusta em resposta aos sistemas puramente de rede, isso graças ao componente conhecido como middleware. Ele é um dos fatores principais para o bom funcionamento de aplicações distribuídas.
Middleware é uma camada oculta, um software, o qual se encontra entre os sistemas operacionais e os aplicativos (programas criados) que são executados neles. Portanto, é uma camada central, que permite o gerenciamento e a comunicação de dados para o funcionamento de aplicativos distribuídos. O middleware funciona como uma camada de tradução para interligar o sistema operacional com os programas (COULOURIS et al., 2013).
A figura abaixo ilustra as camadas que compõem um sistema distribuído.
Camadas que compõem um sistema distribuído. Fonte: elaborada pelo autor.
Alguns exemplos são: middlewares de banco de dados e servidores WEB e ferramentas de mensageria. As mais diversas redes sociais que utilizamos hoje em dia, com conteúdos multimídias, são exemplos de sistemas distribuídos, assim como sites de pesquisas e plataformas de vídeos on line.
A figura abaixo ilustra um exemplo da atuação da camada middleware perante diferentescomputadores (máquinas), aplicações e sistemas operacionais. Podemos observar que ela liga aplicações A, B e C com os sistemas operacionais 1, 2, 3 e 4. Essas aplicações e sistemas operacionais estão em diferentes computadores (1, 2, 3 e 4). Eles interagirão entre si para a execução de um sistema distribuído, e isso só é possível devido à camada do sistema distribuído, chamada middleware.
Middleware e sistemas distribuídos. Fonte: elaborada pelo autor.
______
🔁Assimile
Em uma aplicação escrita em diferentes máquinas, com sistemas operacionais diferentes, é necessária a comunicação entre essas máquinas. Cada uma delas fornece a própria representação de dados e formas de comunicação e, nesse caso, o middleware atua como uma camada de tradução para que seja possível a comunicação correta entre as máquinas para o funcionamento do sistema.
______
Computação em cluster e computação em grid
Os sistemas distribuídos podem ser classificados em diferentes categorias, de acordo com sua arquitetura e finalidade, sendo os mais comuns: computação em cluster e computação em grid.
Cluster
Agora, falaremos um pouco sobre algumas características da computação em cluster. Esse tipo de computação é formado por um conjunto de máquinas com hardwares semelhantes, ou seja, as máquinas que compõem o cluster possuem características homogêneas (TANENBAUM; STEEN, 2017). O conjunto de máquinas que compõem o cluster são ligadas por rede local (LAN).
Quando falamos da parte de software da computação em cluster, temos algumas características importantes. Na maioria das vezes, o sistema operacional entre as máquinas que formam o cluster é equivalente. Além disso, é frequente que um único programa funcione de forma paralela, ou seja, um programa é subdividido em partes menores, e cada parte é executada em uma máquina (ou nó) desse cluster, de forma distribuída, a fim de obter um aumento significativo de desempenho e, consequentemente, executar determinada tarefa em menos tempo. Geralmente, as máquinas desse tipo de sistema são fortemente acopladas em suas ligações e, muitas vezes, podem até compartilhar a mesma memória RAM entre várias máquinas.
Há sempre uma das máquinas que chamamos de nó mestre, isto é, a máquina principal que gerencia o funcionamento da aplicação entre todos os nós. O nó mestre faz a interface com o usuário, aloca tarefas e administra a fila de tarefas. A figura abaixo ilustra um cluster, que se encontra dentro do círculo pontilhado.
Exemplo de cluster. Fonte: elaborada pelo autor.
Grid
Agora que já conhecemos a computação em cluster, falaremos da computação em grid, ou grades, e apontaremos algumas características. Conforme Tanenbaum e Steen (2008), esse tipo de computação é formado por um conjunto de máquinas com características diferentes, podendo o hardware e os sistemas operacionais serem de fabricantes diferentes. Com isso, temos uma característica heterogênea na computação em grid: essencialmente, um sistema de computação em grid interliga vários clusters. Um exemplo de grid é o CINEGRID, que trabalha no desenvolvimento de ferramentas colaborativas multimídia (CINEGRID BRASIL, [s.d.]). Na Figura 3.10, vemos uma parte desse grid, com as ligações entre clusters no Brasil; mas saiba que o CINEGRID interliga outros centros de pesquisa, em várias partes do mundo.
Exemplo de grid - CINEGRID. Fonte: CINEGRID BRASIL ([s.d.], [s.p.]).
Diferenças entre clusters e grids
Muitas vezes, pode parecer que clusters e grids são a mesma coisa, mas existe uma característica fundamental que difere esses dois tipos de sistemas distribuídos. Para facilitar o entendimento das diferenças entre eles, podemos pensar que clusters são sistemas homogêneos, ou seja, são criados para executarem alguma tarefa específica que, em geral, necessita de um alto poder de processamento e, portanto, levaria muito tempo para ser executada em um computador convencional.
______
📝Exemplificando
Um exemplo de tarefa que leva muito tempo para ser executada é o treinamento de redes neurais artificiais de aprendizagem profunda (deep learning) para uso em ferramentas de chat on-line. Nesse tipo de aplicação, os chamados bots – que, nesse caso, são o resultado da rede neural treinada – conversam com e respondem a questionamentos dos clientes (usuários) do serviço de chat on-line de uma determinada empresa. Recentemente, muitos sistemas bancários têm utilizado esse tipo de recurso. Supondo que para executar o treinamento desse tipo de rede em computador convencional seriam necessários dois dias, ao executarmos essa tarefa em um cluster, esse treinamento poderia ser realizado em questão de minutos. 
______
Para diminuirmos o tempo de processamento, poderíamos executar esse tipo de tarefa (treinamento de redes neurais artificiais de aprendizagem profunda) em um computador com alto poder de processamento, porém o custo desse tipo de computador pode tornar essa opção inviável. Segundo o Lawrence Livermore National Laboratory (2018), o sequoia é utilizado para realizar simulações numéricas referentes à física de armas nucleares. Assim sendo, este computador é um cluster homogêneo, visto que executa uma pesquisa de finalidade específica.
Por sua vez, podemos pensar que os grids têm uma abordagem heterogênea, ou seja, são criados para executarem diferentes tarefas, de certa maneira relacionadas entre si, formando um centro de pesquisas de caráter multidisciplinar. Uma maneira ainda mais simples de entender essa característica é “pensar” em um grid como um conjunto de dois ou mais clusters, cada um deles responsável por um certo tipo de pesquisa.
Arquitetura descentralizada
Na arquitetura descentralizada, os computadores são os próprios servidores da aplicação (serviço ou recurso a ser compartilhado), o que se assemelha à arquitetura ponto a ponto. Entretanto, diferentemente do que ocorre na arquitetura ponto a ponto, o estado da aplicação (por exemplo, os valores atuais das variáveis utilizadas na tal aplicação) é replicado entre todos os computadores na rede, de maneira que exista um chamado consenso entre os computadores nessa rede.
Arquitetura descentralizada. Fonte: elaborada pelo autor.
Há, ainda, a possibilidade de que alguns computadores simplesmente utilizem a aplicação (em vez de serem servidores desta), tendo o papel puramente de “clientes” nesse caso, o que remete à arquitetura cliente-servidor.
Essa é a arquitetura utilizada pelas plataformas baseadas em blockchain, e tem se tornado mais popular após a advento do bitcoin. Aplicações que funcionam sobre esse tipo de plataforma são chamadas de dApps (do inglês, decentralized application). Uma das principais vantagens ao utilizar esse tipo de arquitetura é a de que não há uma entidade que controle sua aplicação, como tipicamente ocorre nas arquiteturas cliente-servidor. 
Por exemplo, seus e-mails do Gmail são controlados pelo Google, que armazena os dados e poderia, hipoteticamente, acessar dados privados ou decidir encerrar seus serviços – situação na qual você estaria impossibilitado de optar por decisão contrária, caso não seja um acionista da empresa. Na arquitetura descentralizada, há uma garantia de transparência aos usuários de uma determinada aplicação, uma vez que a aplicação e seus dados são armazenados por computadores dos próprios usuários que participam da rede, e não por uma empresa somente.
Exemplos desse tipo de arquitetura podem ser vistos em qualquer sistema de transações financeiras das chamadas criptomoedas (como o próprio bitcoin), mas não se limita apenas a esse tipo de aplicação. Um exemplo é a Steemit, aplicação de rede social similar ao Twitter, porém faz uso da arquitetura descentralizada.
______
📝Exemplificando
Como funciona a BlockChain. Fonte: Shutterstock.
Conforme podemos observar na figura acima, a BlockChain validadora de transações é a principal tecnologia por trás do universo das criptomoedas, que tem o bitcoin como sua principal moeda. De uma maneira simples, a BlockChain pode ser considerada um livro compartilhado e distribuído, no qual todos os usuários dessarede mantém uma cópia e todas as transações de moedas ficam registradas nessa rede. Portanto, esses registros são imutáveis e confiáveis.
A BlockChain armazena essas informações, esse conjunto de transações, em blocos, carimbando cada um deles com um registro de tempo e data. A cada período de 10 minutos é formado um novo bloco de transações, o qual se liga ao bloco anterior. Os blocos são dependentes uns dos outros e formam uma cadeia de blocos. Isso torna a tecnologia perfeita para o registro de informações que necessitam de confiança, como no caso de uma transação de moeda.
A rede do BlockChain é formada por mineradores que verificam e registram as transações no bloco.
Ao invés dessas informações ficarem armazenadas em um computador central, no BlockChain, essa mesma informação fica armazenada em milhares de computadores espalhados pelo mundo inteiro, um claro exemplo de aplicação distribuída.
Cada computador da rede fica com uma cópia integral do banco de dados, o que torna as informações inseridas nele extremamente seguras e confiáveis, porque não há um ponto único de ataque. Logo, não podemos ir a um computador central do BlockChain e roubar os registros de transações e modificá-los, porque cada computador dessa rede possui um registro dessas informações. Se você tentar modificar o banco de dados de um computador, ele será expulso pelo restante da rede (BASSOTTO, 2018).
Computação em nuvem e o papel da virtualização em sistemas distribuídos
O termo computação em nuvem (do inglês, cloud computing) se refere a uma tecnologia que possibilita acessar recursos e serviços via internet, sem a necessidade de instalações de softwares em seu computador. Dessa forma, é permitido que os usuários façam acessos por meio de qualquer dispositivo, seja ele um computador ou telefone celular.
______
📝Exemplificando
Um exemplo de utilização de serviços em nuvem é quando você edita um trabalho da universidade utilizando o Google Docs e esse trabalho fica armazenado na nuvem. Outro exemplo é quando você escuta uma música no Spotify, ou até mesmo assiste a um filme no Netflix. Todas essas situações trazem um contato com a computação em nuvem. Elas têm em comum o fato de não exigirem nenhuma instalação nem consumirem recursos do seu dispositivo, todas são serviços on-line. Para acessá-los, só precisamos de um navegador e ter conexão com a internet.
______
A figura abaixo ilustra múltiplos dispositivos acessando a nuvem, a qual contém diversos tipos de dados.
Cloud computing. Fonte: Shutterstock.
O papel da virtualização em sistemas distribuídos
Dois tipos de virtualização são muito úteis no contexto de sistemas distribuídos, conforme Coulouris et al. (2013):
· Virtualização de redes.
· Virtualização de sistemas.
Os autores observam, muito adequadamente, que a vantagem da criação e utilização de redes virtuais advém do fato de que uma rede virtual específica para um determinado tipo de aplicação pode ser criada sobre uma rede física real, de forma que a rede virtual possa ser otimizada para aquela aplicação em particular, sem a necessidade de alterar as características da rede física.
_______
📝Exemplificando
Imagine que você está desenvolvendo um sistema distribuído de um serviço de streaming de vídeo que, obviamente, é composto por vários elementos, como banco de dados, servidor web, servidor de e-mail, servidor de autenticação, etc. Supondo que o arquiteto de sistemas da empresa optou por utilizar dois bancos de dados diferentes: um para armazenar informações gerais, como dados dos assinantes, datas de vencimento de assinaturas, etc., do tipo SQL; e outro para armazenar os vídeos em si, com características mais adequadas para otimizar a troca de informações, do tipo NoSQL. Esses dois bancos de dados não precisam (e, por questões de segurança, nem devem) saber da existência um do outro. Para atingir esse objetivo, tipicamente as empresas criam duas redes virtuais dedicadas, de forma que, além de estarem isoladas entre si, podem ser otimizadas de acordo com a natureza do banco de dados, prevalecendo a comunicação de segmentos UDP para o banco de dados NoSQL, por exemplo, em detrimento aos segmentos TCP.
_______
Para Coulouris et al. (2013), a virtualização de sistemas é uma alternativa interessante por permitir emular o hardware de uma máquina física, permitindo que várias máquinas virtuais, cada uma com um sistema operacional, possam coexistir e se comunicar. Os autores ainda salientam que a principal vantagem da virtualização de sistemas está no fato de que aplicações já escritas e validadas, as quais dependem de um sistema operacional em específico, que necessitam se comunicar e interagir com outra aplicação em um sistema operacional diferente, podem assim fazê-lo através da virtualização dos sistemas operacionais, sem a necessidade de que a aplicação seja reescrita novamente ou recompilada.
_______
 💭Reflita
Pense na seguinte situação: na empresa que você trabalha, o sistema de planejamento de recursos, conhecido simplesmente por ERP (do inglês, Enterprise Resource Planning), utiliza um módulo de controle de estoque escrito pelo próprio time de desenvolvedores de sua empresa, na linguagem Asp.NET, que, por sua vez, utiliza funcionalidades específicas da plataforma Windows, não sendo 100% compatível com alternativas, como o .NET Core (recentemente aberto para a comunidade). Para economizar os gastos e, principalmente, aumentar a disponibilidade do sistema ERP utilizado pelos colaboradores da empresa, suas filiais e seus representantes comerciais, o Diretor Executivo, ou CEO (do inglês, Chief Executive Officer), decide migrar para uma solução em nuvem, de algum provedor de cloud computing de mercado. Por questões financeiras, o Diretor de TI, ou CIO (do inglês, Chief Information Officer), opta por utilizar um sistema operacional GNU/Linux. Como fazer para adaptar o módulo de controle de estoque? Reescrever o código seria uma opção, mas os desenvolvedores que fizeram esse módulo já não trabalham mais na empresa, e o código é muito extenso e complexo, o que significa que sua reescrita impactaria em um aumento significativo de tempo até que o “novo” ERP esteja disponível. Qual seria sua solução para esse problema?
_______
Se você já utilizou ou leu a respeito de computação em nuvem, deve saber que, independentemente do tipo de serviço que você contrata e do provedor desse serviço, você já estará utilizando a virtualização em algum nível. Esses serviços são tipicamente categorizados como IaaS (do inglês, Infrastructure as a Service), PaaS (do inglês, Platform as a Service) e SaaS (do inglês, Software as a Service). Para entender melhor essa ideia, veja figura a seguir.
Serviços em nuvem e níveis de virtualização. Fonte: elaborada pelo autor.
Sincronização de relógios
Sistemas formados por múltiplos computadores necessitam sincronizar suas ações entre si, e uma das maneiras mais utilizadas, dada sua simplicidade e popularidade, é A sincronização horária, por meio do protocolo conhecido como Network Time Protocol (NTP) (NTP, 2018). Esse protocolo, por sua vez, utiliza o protocolo de transporte de dados User Datagram Protocol (UDP), operando na porta 123. Essencialmente, esse protocolo é utilizado para sincronização do relógio das máquinas locais (desktops, notebooks, servidores) e demais dispositivos de rede.
A referência horária é dada por sistemas de altíssima precisão, como os relógios atômicos (NTP, 2018). Dada a precisão desses sistemas, computadores conectados a eles pertencem a uma camada de servidores chamada de estrato 1 (os sistemas de alta precisão em si pertencem a uma camada topológica chamada de estrato 0).
Segundo NTP (2018), como não existem muitos servidores no mundo conectados diretamente a relógios atômicos, outros servidores são conectados aos de estrato 1, os quais, por sua vez, formam uma segunda camada de servidores de horário, chamada de estrato 2, e essa hierarquia se estende até os servidores de estrato 15, conforme podemos ver na figura abaixo. Os computadores dos usuários são configuradospara atualizarem a informação horária por meio da rede, consultando servidores de estratos com valores mais altos.
Sistema de servidores NTP. Fonte: elaborada pelo autor.
Aqui no Brasil, por exemplo, temos o Observatório Nacional (ON), que é o órgão oficial responsável pela geração, conservação e disseminação da Hora Legal Brasileira.
Um aspecto muito interessante do protocolo NTP é que ele é projetado para verificar a latência (atraso, delay) entre a máquina cliente e a máquina servidora, e a implementação disso é muito simples: essencialmente, de tempos em tempos, a máquina cliente faz uma consulta a um servidor NTP para verificar em quanto seu relógio está atrasado (ou adiantado) em relação ao servidor horário de referência, processando a seguinte operação:
(t4 - t1) - (t3 - t2) em que t1 é a hora, minuto, segundo e milésimos de segundo (também chamada de timestamp) da máquina cliente ao enviar uma requisição (através de um pacote, no contexto de redes de computadores) para o servidor NTP; t2 é o timestamp do servidor ao receber essa requisição; t3 refere-se ao timestamp em que um pacote de resposta a essa requisição é enviado ao cliente; e t4 é o timestamp em que o cliente recebe a resposta do servidor NTP. Esse cálculo, portanto, resulta em quanto o sistema operacional deverá atrasar (ou adiantar) o relógio da máquina local para que ela esteja sincronizada com a referência horária em questão, por exemplo, a Hora Legal Brasileira, em nosso caso. Um exemplo desse processo é ilustrado na figura a seguir.
Exemplo de sincronização através do protocolo NTP. Fonte: elaborada pelo autor.
Alguns serviços, como os de acesso remoto e de autenticação de usuários, podem não funcionar adequadamente, caso haja uma diferença muito grande no horário da máquina cliente (solicitante) em relação à máquina servidora (que roda e disponibiliza o serviço). Por esse motivo, é muito importante saber como habilitar a sincronização horária das máquinas utilizando o NTP. A configuração, bem como suas etapas, varia entre os sistemas operacionais e entre suas versões.
______
📝Exemplificando
Um exemplo utilizando um sistema operacional Windows 10 a partir do procedimento a seguir:
1. Abra o Prompt de Comando (CMD), que pode ser acessado pelo menu iniciar, ou pelo campo de busca, digitando prompt ou cmd.
2. Na janela do CMD, insira o código a seguir e pressione a tecla “Enter”:
w32tm /config /syncfromflags:manual /manualpeerlist:0.pool.ntp.org
Apontando para o servidor NTP. Fonte: captura de tela do Prompt de Comando do Windows 10.
Na figura abaixo, podemos observar que, ao final do comando, aparece a mensagem “O comando foi concluído com êxito”. Lembre-se: para executar os comandos, você deve estar como um usuário Administrador ou executar o CMD como Administrador. Agora que fizemos o apontamento para o servidor NTP que utilizaremos, devemos reiniciar o serviço de data e hora para aplicar as alterações.
3. Utilize os comandos net stop w32time e net start w32time para parar o serviço e iniciar, reiniciando-o, conforme podemos observar na figura a seguir:
Reiniciando o serviço de data e hora. Fonte: captura de tela do Prompt de Comando do Windows 10.
Após isso, forçaremos uma sincronização de data e hora para verificarmos se está tudo funcionando corretamente.
Force uma sincronização por meio do comando w32tm /resync /rediscover, conforme observamos na figura a seguir:
Sincronizando data e hora. Fonte: captura de tela do Prompt de Comando do Windows 10.
Por meio da saída da figura acima, podemos observar a mensagem que será dada, informando que nossa configuração foi feita com sucesso.
Conclusão
Um dos clientes da startup de tecnologia que você trabalha mostrou que a aplicação desenvolvida por sua empresa não está funcionando corretamente, porém você notou que isso ocorre pela falta de sincronismo entre os relógios de duas máquinas do cliente. Para que o cliente consiga fazer o procedimento nas máquinas que não estão sincronizadas, seu chefe solicitou a criação de um relatório técnico com os comandos necessários, passo a passo, para que o próprio cliente sincronize a máquina com as demais.
Para ajudá-lo, ele informou que o sistema operacional da nova máquina é Windows. A primeira informação relevante para o relatório é o sistema operacional, pois, dependendo da escolha, o processo de configuração se difere. Nesse caso, você deixará registrado como configurar para o sistema Windows.
A segunda informação importante no seu relatório é o conceito de servidor NTP, portanto, usando suas palavras e ilustrações, inclua esse item no documento.
Agora vem a parte mais desafiadora para quem não tem familiaridade com o mundo da tecnologia: realizar a configuração da data e hora por meio dos comandos necessários. Para que tudo funcione corretamente, é preciso que o servidor NTP esteja instalado em todos os equipamentos, inclusive naquele que fará a configuração. Faça a configuração da seguinte forma:
Abra o Prompt de Comando (CMD).
Na janela do CMD, insira o código a seguir e pressione a tecla “Enter”: w32tm /config /syncfromflags:manual /manualpeerlist:0.pool.ntp.org.
Utilize os comandos net stop w32time e net start w32time para parar o serviço e iniciar, reiniciando-o.
Force uma sincronização através do comando w32tm /resync /rediscover.
Com isso, fizemos o apontamento, reiniciamos o serviço e verificamos se a data e a hora estão sincronizadas. Que tal impressionar seu cliente e complementar seu relatório realizando uma pesquisa sobre a configuração para o sistema operacional Linux?
Continue firme em seus estudos, pois ainda vem muita coisa interessante e útil pela frente. Assim finalizamos esta aula. Esperamos que o conhecimento adquirido seja de importância para seu crescimento profissional. Bons estudos e até a próxima!
Introdução da aula
Qual é o foco da aula?
Nesta aula, você aprenderá conceitos importantes, os quais permitirão a construção de sistemas distribuídos eficientes.
Objetivos gerais de aprendizagem
Ao longo desta aula, você irá:
· identificar o conceito de processos threads e processos cliente-servidor;
· examinar as características de comunicação entre processos e em grupos;
· analisar os conceitos de sockets.
 
Introdução da aula
O avanço da tecnologia utilizada em processadores tem permitido a geração de processadores para dispositivos cada vez menores, como smartwatches. Os smartphones possuem uma grande capacidade de processamento, permitem o acesso à internet e a execução de jogos e de vários outros aplicativos que demandam uso de processamento. Os notebooks e desktops também possuem processadores com múltiplos núcleos de processamento.
Os sistemas operacionais são adaptados e atualizados periodicamente, para adquirir a capacidade de gerenciar essas alterações nos processadores. E quanto aos sistemas web, você sabe como devem ser implementados para utilizar essa capacidade de processamento? O processamento sequencial é suficiente para utilizar mais de um núcleo de processamento?
Esta aula nos leva a refletir sobre como os sistemas distribuídos estão inseridos neste contexto de avanço das tecnologias e como os sistemas web são desenvolvidos. Os conceitos de processos e threads são utilizados para permitir a implementação de sistemas que melhor utilizem o processamento dos núcleos de processamento, que podem estar em uma mesma máquina ou em máquinas remotas. Quando os processos são executados em máquinas remotas, a comunicação torna-se necessária para realizar a troca de informação entre eles. Essa comunicação pode ocorrer somente entre dois processados ou entre todos os processos de um grupo.
Sistemas web, como comércio eletrônico, correio eletrônico, máquinas de busca, entre outros, são exemplos de sistemas distribuídos. Eles possuem o lado do cliente (o usuário), que requisita um serviço, e o lado do servidor, que processa a requisição e devolve a resposta para o cliente. Mas, você sabe como ocorre essa “conversa” entre cliente e servidor em termos de sistema web? Será que cliente e servidor estão executandona mesma máquina ou em máquinas diferentes? O cliente é um processo, e o servidor, outro processo. Eles podem executar em uma mesma máquina ou em máquinas remotas.
Considerando o exemplo de um sistema de máquina de busca, por exemplo, o buscador Google, você pode se interessar pela busca na internet por páginas com ocorrências do termo “pulseira inteligente”. Ao abrir um navegador na sua máquina (smartphone, notebook, desktop, servidor, entre outros), iniciará a execução de um processo. Ao digitar o termo e pedir para buscar, esse processo comunica-se via rede com um processo servidor, que estará em uma máquina remota e fará a busca de todos os endereços de páginas na internet onde o termo está ocorrendo. Em seguida, a resposta da busca retornará para o cliente (sua máquina). Para que todo o processamento seja realizado de forma rápida, várias máquinas são consultadas, as quais guardam informações e possuem processos executando para recuperar a informação.
A comunicação entre dois processos (cliente e servidor) via rede ocorre através de uma interface de software denominada socket, que é uma interface entre a camada de aplicação e a de transporte. Um processo envia uma mensagem, a qual é empurrada via socket pela rede e chega ao outro processo, que a lê e realiza alguma ação. Para saber o caminho a ser percorrido na rede, o socket leva ao endereço do processo destino. Após a troca de várias mensagens, os sistemas web conseguem atender o usuário, gerando a informação solicitada, permitindo concluir uma compra on-line, realizar uma conversa entre duas ou mais pessoas, entre outras ações.
Imagine que você foi contratado como trainee de uma empresa de transportes de mercadorias que atua em todo o Brasil. Essa empresa possui mais de 200 colaboradores, sendo 100 deles motoristas de caminhão. Foi atribuída a você a tarefa de auxiliar a equipe de desenvolvimento na elaboração de uma solução utilizando os conceitos de processos, threads e sockets, a fim de implementar um chat (aplicação de conversação) que permita que os motoristas troquem mensagens de texto. Neste contexto, elabore um relatório que responda a todas as questões a seguir e, após isso, crie uma apresentação da solução do problema:
1. Como você implementaria o chat no modelo cliente-servidor?
2. Para qual tipo de dispositivo deve ser implementada a parte da aplicação que tem o processo cliente? E para o processo servidor?
3. Como poderá ser implementada a comunicação realizada entre os colaboradores? Pense na linguagem de programação, na biblioteca ou API e como coordenar a troca das mensagens.
Como o servidor poderá ser implementado para atender a um número maior de conexões?
O entendimento sobre o funcionamento dos sistemas web, como os processos se comunicam e como implementar sistemas mais eficientes utilizando esses conhecimentos é de fundamental importância na formação do analista de sistemas. Portanto, vamos nos aprofundar um pouco mais nesses conceitos. Bons estudos!
Processos e threads
Os processadores atuais possuem mais de um núcleo de processamento e estão presentes em smartphones, notebooks, desktops, servidores, pulseiras inteligentes, entre outros. A utilização dos núcleos de processamento depende de como o sistema operacional escalona os programas para utilizá-los. Desta forma, a elaboração dos algoritmos precisa ser adaptada de forma que o sistema operacional consiga escalonar parte das computações para mais de um núcleo de processamento ao mesmo tempo e use os recursos de forma mais eficiente. Portanto, os conceitos de processos e threads são importantes para permitir a descrição de algoritmos que funcionem de forma eficiente.
Em sistemas operacionais, um conceito muito importante é o de processo, o qual é definido como um programa em execução, e threads que são fluxos ou linhas de execução dentro de um processo (TANENBAUM; BOS, 2016). Como exemplo de processo, podemos considerar um editor de texto executando em um desktop ou um aplicativo de calendário executado em um smartphone.
Um processo possui um espaço de endereçamento de memória que armazena o código executável, os dados referentes ao programa, a pilha de execução, o valor do contador de programa, o valor do apontador de pilha, os valores dos demais registradores do hardware e outros recursos, como informações sobre processos filhos, arquivos abertos, alarmes pendentes, tratadores de sinais, entre outras informações necessárias para a execução do programa.
Muitas vezes, a construção de software usando um único processo pode não ser eficiente na utilização dos núcleos de processamento disponíveis nos processadores atuais, pois apenas um núcleo de processamento é utilizado. Por isso, existe a necessidade de construir aplicações paralelas e distribuídas, que permitam a execução simultânea de processos e/ou threads, deixando o software com execução mais rápida. 
O ato de gerenciar e executar múltiplas computações ao mesmo tempo, seja por troca de contexto no uso do núcleo de processamento ou pelo uso de diferentes núcleos de processamento é denominado concorrência. Por exemplo, uma máquina com processador contendo quatro núcleos de processamento executando dez programas diferentes necessita que o sistema operacional escalone fatias de tempo para que todos os programas consigam utilizar os núcleos de processamento por meio de revezamento. 
Estes programas estarão executando de forma concorrente, dando ao usuário a impressão de que cada programa está utilizando os recursos do computador de forma dedicada. Quando há execução de computações simultaneamente em diferentes núcleos de processamento, tem-se paralelismo. Assim, processos e threads podem ser executados de forma concorrente e paralela. Por exemplo, um navegador com duas abas abertas, cada aba sendo um thread executado em um núcleo de processamento diferente, representa uma situação de execução paralela.
Um processo pode possuir um ou mais threads, permitindo que um programa execute mais de um trecho de código simultaneamente. Cada thread é um fluxo de controle sequencial isolado dentro de um programa capaz de utilizar CPU (Central Processing Unit). É composto de identificador (ID) de thread, contador de programa, conjunto de registradores e uma pilha de execução. Cada thread pode compartilhar com outros threads pertencentes ao mesmo processo a sua seção de código, seção de dados e outros recursos do sistema operacional, arquivos abertos e sinais.
A figura abaixo ilustra cinco possíveis situações em que existem processos e threads sendo executados em um notebook.
(A) Notebook executando um processo com um thread; (B) Notebook executando quatro processos com um thread cada; (C) Notebook executando um processo com quatro threads; (D) Notebook executando quatro processos com dois threads por processo; (E) Sistema distribuído com dois notebooks executando vários processos e threads. Fonte: elaborada pelo autor.
Na imagem (A), há um processo com um único thread executado. O conjunto de instruções desse processo é executado de forma sequencial. Por exemplo, um programa que calcula a soma das notas inseridas pelo professor.
A imagem (B) apresenta quatro processos, cada um com um único thread, e os processos podem executar simultaneamente em núcleos de processamento, de acordo com escalonamento do sistema operacional.
Já na imagem (C), há um processo com quatro threads, e cada thread possui seu fluxo de controle, que pode ser executado concorrentemente a outros threads, pois há um único núcleo de processamento. Por exemplo, um programa que realiza a soma de um conjunto de dados, distribuindo os dados entre cada thread para que haja a soma parcial simultânea da porção de dados recebido e, por fim, realiza a soma total.
Vários processos com vários threads por processo são ilustrados na imagem (D), gerando a execução de vários fluxos de controle ao mesmo tempo e executando em núcleos de processamento diferentes. Por exemplo, vários programas, como navegador e editor de texto, , executando em um computador com quatro núcleosde processamento.
Por último, na imagem (E), tem-se um sistema distribuído composto por máquinas interligadas via um switch. Cada máquina pode ter mais de um processo executando mais de um thread. Os sistemas distribuídos são construídos sobre sistemas operacionais e utilizam processos e threads para realizar a execução de um programa. 
A comunicação entre os processos e/ou threads precisa ser realizada de forma especial, usando bibliotecas específicas. Na paralelização de um programa utilizando threads que executam em uma mesma máquina, podem ser utilizadas bibliotecas, como OpenMP (OPENMP, 2021) ou Pthreads (Posix Threads) (BARNEY, 2021). Os programas podem ser desenvolvidos para serem executados utilizando mais de um processo e em máquinas remotas. A comunicação entre os processos deve utilizar bibliotecas de troca de mensagens, como Message Passing Interface (MPI) (OPENMPI, 2021) e de sockets, assunto que será abordado posteriormente.
Você sabia que os programas que coloca para executar no seu notebook, no seu desktop ou mesmo no seu smartphone são processos? Mas, como pode-se criar um novo processo e finalizar (término de um processo)?
A criação de processos pode ocorrer em uma das seguintes situações:
· Pelo usuário, para iniciar a execução de um programa (via linha de comando ou duplo clique no mouse).
· Por funções específicas que independem do usuário (chamadas de serviços (daemons) ou executando em background sem intervenção do usuário), por exemplo, na recepção e no envio de e-mails, serviços de impressão, etc.
· Usando chamadas de sistema dentro de um programa.
Nos sistemas operacionais UNIX e Unix-like (como o Linux), os processos são criados utilizando a chamada de sistema fork(). No sistema operacional Windows, a criação ocorre pela chamada CreateProcess() (TANENBAUM; STEEN, 2007).
O término de processos pode ocorrer de algumas formas. Uma delas é quando o programa termina sua execução pela chamada exit no sistema operacional Unix-like, e ExitProcess no sistema operacional Windows; por algum erro ocorrido que não permitiu que o processo pudesse ser finalizado ou por um erro fatal; causado por algum erro no programa (bug), como divisão por 0 (zero), referência à memória inexistente ou não pertencente ao processo e execução de uma instrução ilegal (TANENBAUM; STEEN, 2007).
Dentro de um processo, poderá existir tarefas que podem ser executadas de forma concorrente utilizando melhor os núcleos de processamento. A execução dessas tarefas pode ser realizada utilizando threads, que são escalonadas pelo sistema operacional para utilizarem os núcleos de processamento.
A decisão de quando criar threads dentro de um processo depende de quais características o problema que está sendo resolvido possui, ou seja, suas subtarefas. Assim, podem ser criadas quando há subtarefas que possuem potencial de ficarem bloqueadas por um longo tempo; usam muitos ciclos de CPU; devem responder a eventos assíncronos; tenham importância maior ou menor do que outras tarefas e podem ser executadas em paralelo com outras tarefas.
______
📝Exemplificando
A criação de processo nas linguagens C/C++ é realizada no Linux com a chamada de sistema fork, utilizando duas bibliotecas: sys/types.h e unistd.h. Essa chamada de sistema deve ser inserida no código implementado pelo usuário, que, ao ser compilado e executado, gera uma chamada ao sistema operacional, o qual cria um processo filho com um número identificador único. O processo que gerou a execução do programa é denominado processo pai, e o processo criado com a chamada fork() é denominado processo filho.
No momento da criação, o processo filho é uma cópia do pai e possui os mesmos atributos dele (variáveis, descritores de arquivos, dados, etc.). Após a criação do processo filho, ele é executado, e o que acontece em um processo não ocorre no outro, são processos distintos agora, cada um seguindo seu rumo, tornando-se possível mudar o valor de uma variável em um e isso não alterará o valor desta variável no outro processo.
A função fork( ) retorna um número identificador do processo (PID – Process Identification). No trecho de código executado pelo processo filho, PID tem valor igual a 0 (zero). Dentro do processo pai, PID tem valor igual ao identificador do processo filho, retornado pelo sistema operacional. A função fork( ) retorna valor menor do que 0, caso ocorra algum erro na criação do processo.
A função getpid( ) retorna o valor do identificador do processo em execução.
A seguir, apresenta-se um código, no qual é criado um processo filho com a chamada fork( ):
Processos cliente-servidor
O modelo cliente-servidor é o modelo de computação distribuída em que um programa é dividido em duas partes: servidor e cliente (COULOURIS et al., 2013.; KUROSE; ROSS, 2013). O servidor é executado em um processo, e o cliente, em outro processo diferente, que pode estar na mesma máquina ou em uma máquina remota. O servidor tem acesso direto ao recurso de hardware ou software que o cliente quer usar. Na maioria dos casos, o cliente está localizado em diferentes máquinas clientes. 
Tipicamente, há um relacionamento muitos-para-um entre o servidor e os clientes, isto é, há, geralmente, um servidor atendendo às requisições de muitos clientes. O servidor é o mediador do acesso a grandes bases de dados, a um recurso de hardware caro ou a uma coleção importante de aplicações. O cliente faz requisições para ter acesso a dados e obter o resultado de um cálculo e outros tipos de processamento. A figura a seguir ilustra o funcionamento de um sistema cliente-servidor, no qual há um conjunto de processos cliente enviando requisições para o processo servidor, que é o responsável por realizar as computações necessárias e responder aos clientes.
Supondo que o servidor implementa a soma de dois valores, um cliente envia dois valores, e o servidor realiza a soma e retorna o valor resultante.
Modelo cliente-servidor. Fonte: elaborada pela autora.
Outro exemplo é uma máquina de busca no modelo cliente-servidor, que é usada para localizar informação na internet ou em intranets corporativas e organizacionais. Neste caso, o processo cliente é executado no navegador para obter a palavra-chave ou frase sobre o tema que o usuário está interessado. O processo cliente envia a requisição para o servidor. 
O processo servidor, por sua vez, realiza uma ampla busca pela palavra-chave ou frase do usuário, pois este tem acesso direto à informação ou a outros servidores que têm acesso à informação. Posteriormente, o servidor retorna as informações ao cliente. Embora os processos cliente e servidor sejam programas separados em computadores diferentes, eles trabalham em uma única aplicação. Quando o processo pode funcionar como cliente e servidor ao mesmo tempo, temos um sistema Peer-to-Peer (P2P).
______
🔁Assimile
No contexto de comunicação entre um par de processos, o processo que inicia a comunicação é o cliente, e o processo que espera pela requisição é o servidor. Na web, o navegador é o processo cliente, e o servidor web é o processo servidor (KUROSE; ROSS, 2013).
Comunicação entre processos e em um grupo
Após a criação dos processos, eles são executados de forma independente e possuem regiões de memória independentes. Entretanto, há aplicações que necessitam trocar dados (comunicação) entre processos ou entre threads. Para haver comunicação entre processos, é necessária a utilização de mecanismos específicos. O sistema operacional implementa “canais” de comunicação entre processos em um mesmo computador (tais canais podem ser implícitos ou explícitos) ou em computadores diferentes.
A figura abaixo ilustra a comunicação entre dois processos, que estão em uma mesma máquina, gerenciados pelo mesmo sistema operacional. A comunicação entre processos através de chamadas de sistema pode ocorrer com o uso de pipes ou alocação de memória compartilhada.
Canal de comunicação entre dois processos. Fonte: elaborada pela autora.
A próxima figura ilustra o processo 1 na máquina 1 se comunicando com o processo 2 na máquina2 através de chamadas a funções de uma biblioteca de passagem de mensagens, como MPI.
Processos em máquinas diferentes se comunicando por passagem de mensagens. Fonte: elaborada pela autora.
O modelo de passagem de mensagens entre processos possui a operação básica send-receive. Outras operações de comunicação, como broadcast, reduction, scatter e gather, são derivadas da básica.
A operação send-receive ocorre somente entre dois processos (figura abaixo). Um processo envia o dado e o outro processo recebe o dado.
Operação send-receive. Fonte: elaborada pela autora.
A operação de broadcast é uma operação entre um grupo de processos conhecidos. Consiste no envio de um dado presente em um processo para os demais processos do mesmo grupo.
Operação broadcast. Fonte: elaborada pela autora.
Na figura acima, o processo 1 envia o dado para os demais processos do mesmo grupo de processos. Ao final da comunicação, todos os processos do grupo conhecem o dado.
Para implementar aplicações que utilizem a troca de mensagens entre processos, existem bibliotecas, como sockets, sobre as quais trataremos posteriormente, e MPI (Message Passing Interface) (OPENMPI, 2021; TANENBAUM; STEEN, 2007).
MPI é um padrão de comunicação que permite a troca de mensagens entre processos pertencentes a um grupo de processos criado no início da execução do programa. Cada processo recebe um identificador único dentro deste grupo, facilitando a comunicação entre pares de processos ou grupo de processos. É possível identificar qual é o processo emitente e o receptor da mensagem. Dentro de um mesmo processo, é possível criar threads, que podem se comunicar através de troca de mensagens ou acesso à memória compartilhada.
Na figura abaixo, há quatro threads executando em um mesmo processo. Esses threads compartilham memória e trocam informação através do acesso à memória compartilhada. Para gerenciar o acesso à memória compartilhada, são utilizadas bibliotecas, como OpenMP (OPENMP, 2021) e PosixThreads (BARNEY, 2021).
Threads de um mesmo processo acessando a memória compartilhada. Fonte: elaborada pela autora.
Conceitos de sockets
A padronização da interface da camada de transporte permitiu que os protocolos de troca de mensagens sejam utilizados pelos programadores no desenvolvimento de aplicações que envolvam mais de uma máquina. Uma mensagem enviada de um processo para outro deve passar pela rede, e uma forma de realizar a implementação dessa comunicação é utilizando a interface de software denominada socket. É uma interface entre a camada de aplicação e o protocolo da camada de transporte.
“Socket é um terminal de comunicação para o qual uma aplicação pode escrever dados que devem ser enviados pela rede subjacente e do qual pode ler dados que chegam.” (TANENBAUM; STEEN, 2007, p. 85).
Comunicação entre dois processos via socket. Fonte: elaborada pela autora.
A figura acima ilustra a comunicação utilizando socket entre dois processos de máquinas diferentes. A seta vermelha indica a origem e o destino da mensagem. Para que o Processo 2 receba uma mensagem do Processo 1, é necessário que a mensagem trafegue pela rede. Como o Processo 1 é o processo emissor, é necessário que, quando a mensagem for enviada por ele, contenha o dado, o endereço e o identificador do processo receptor da mensagem. 
Na camada de rede da internet, o endereço é fornecido pelo IP (Internet Protocol), que identifica a máquina destino de forma única. O identificador do processo receptor é um número de porta. Aplicações mais utilizadas possuem um número de porta padrão, como é o caso do servidor web, que é identificado pela porta 80, e o servidor de e-mail, pela porta 25.
A interface socket pode utilizar os protocolos de transporte TCP (Transmission Control Protocol) ou UDP (User Datagrama Protocol). Sockets utilizando TCP/IP possuem as primitivas sintetizadas no quadro abaixo.
Primitivas da interface socket para TCP/IP. Fonte: adaptado de Tanenbaum e Steen (2007, p. 85).
· Uma chamada socket retorna um descritor de arquivo que será utilizado em outras chamadas.
· A chamada bind designa um endereço para o socket no servidor.
· A chamada listen aloca espaço para a fila de chamadas recebidas ao mesmo tempo.
· Accept é utilizada para bloquear a espera por uma conexão de entrada.
· Connect bloqueia o responsável pela chamada e inicia o processo de conexão.
· Send e receive são usadas para transmitir e receber dados em uma conexão full-duplex.
· Quando ambos os lados executarem close, a conexão será encerrada.
A implementação de programas no modelo cliente-servidor envolve a implementação de um processo cliente e um processo servidor, que utilizam sockets para comunicação. Os serviços de ssh (secure shell) e ftp (file transfer protocol) são exemplos de implementações que utilizam sockets. O programa ssh é usado para realizar conexão entre duas máquinas e possui um processo cliente denominado ssh e um processo servidor denominado sshd (ssh deamon). O programa ftp é usado para transferência de arquivo entre duas máquinas e possui um processo cliente denominado ftp e um processo servidor denominado ftpd (ftp deamon). 
Os sockets TCP são orientados à conexão e têm um canal exclusivo de comunicação entre cliente e servidor. Uma aplicação que faz transações bancárias é um exemplo de aplicação que pode usar sockets TCP.
Várias linguagens de programação, como Java, PHP e Python, fornecem socket ao desenvolvedor API, para facilitar o desenvolvimento das aplicações.
______
 💭Reflita
Atualmente, existem muitos jogos que você pode jogar com seus amigos, por exemplo, Minecraft, League of Legends e Among Us. Você já pesquisou como são implementados esses jogos? Como um jogador é capaz de visualizar os movimentos do outro jogador? É necessária a criação de processos e threads? Há comunicação entre processos ou compartilhamento de dados entre threads? 
Conclusão
Você se lembra do desafio proposto no início da aula? Agora, acompanhe aqui a resolução.
1. A implementação do chat com mensagens de texto pode ser realizada utilizando sockets e um modelo de comunicação entre processos cliente-servidor. No contexto desta atividade, o cliente e o servidor poderiam ter as seguintes características:
· 
· Servidor: é o processo que centraliza todas as mensagens (requisições) de clientes recebidas via socket. Tem como responsabilidade o envio de mensagem com resposta a cada requisição recebida. Quando uma requisição chega ao servidor, é criado um thread para atender àquela requisição.
· Cliente: o usuário cria uma instância do processo cliente que faz uma requisição ao servidor via socket. Na requisição do cliente, são informados o endereço do servidor e a respectiva porta.
O servidor do chat utiliza sockets e aguarda por conexões de clientes. A cada cliente que requisita uma conexão, é criado um novo thread para controle dele.
O cliente é formado por um processo principal, o qual habilita o console para envio de mensagens, porém há um thread que aguarda por mensagens que venham do servidor, as quais vieram de outros clientes.
2. Para qual tipo de dispositivo deve ser implementada a parte da aplicação que tem o processo cliente? E para o processo servidor?
A parte cliente da aplicação deve ser implementada para smartphone com acesso via navegador ou aplicativo instalado localmente, já que permite acesso mais fácil por motoristas. Para haver conexão com o servidor, o smartphone deverá ter acesso à internet por rede de dados celulares ou rede sem fio.
A parte servidor da aplicação deverá ser implementada para uma máquina que tenha maior capacidade de processamento e que deverá executar em alta disponibilidade (24 horas por dia, 7 dias por semana).
3. Como poderá ser implementada a comunicação realizada entre os colaboradores? Pense na linguagem de programação, na biblioteca ou API e como coordenar a troca das mensagens.
A comunicação poderá ser implementada utilizando API de sockets da linguagem adotada pela empresa para desenvolvimento, como C++, Python ou Java. A troca de mensagens é realizadapassando pelo gerenciamento do servidor que coordena a ordem das mensagens.
4. Como o servidor poderá ser implementado para atender a um número maior de conexões?
O servidor poderá ser implementado usando vários threads de execução para atender às requisições dos clientes.
Nesta aula, você aprendeu sobre a utilização de processos e threads no contexto de sistemas distribuídos, como ocorre a comunicação entre processos, processos cliente e servidor e sockets. Agora, você é capaz de entender melhor as aplicações existentes, identificar quais são cliente-servidor e aplicar estes conceitos em aplicações em desenvolvimento de forma a ter melhor desempenho. Bons estudos!
Introdução da aula
Qual é o foco da aula?
Nesta aula, exploraremos com maior detalhamento alguns dos principais aspectos de projeto em sistemas distribuídos, nomeadamente: segurança, escalabilidade, resiliência e heterogeneidade, que são diferenciais em relação aos sistemas puramente de rede, mas que não sejam sistemas distribuídos.
Objetivos gerais de aprendizagem
Ao longo desta aula, você irá:
· identificar a aplicação em projetos dos sistemas distribuídos;
· examinar aspectos de projetos em sistemas distribuídos;
· definir as diferenças entre sistemas distribuídos e sistemas puramente de rede.
Introdução da aula
Você já pensou em como os serviços de streaming de vídeo mais populares da atualidade conseguem suportar uma quantidade enorme de acessos simultâneos? Ainda, quando não há tanta demanda assim, será que empresas de grande porte mantêm ligados centenas de servidores mesmo que não estejam em uso? Já pensou no consumo de energia dessas máquinas ociosas?
É exatamente nesta aula que você notará que entender sobre escalabilidade, neste caso, ajuda as empresas responsáveis por esses serviços a maximizarem seu faturamento, evitando uso desnecessário de recursos, sem comprometer a usabilidade e a consequente satisfação de seus clientes. Curioso para descobrir como? Então, daremos seguimento aos nossos estudos.
Você esteve no papel de um arquiteto de sistemas de uma empresa que estava desenvolvendo um sistema distribuído para controle de manutenção preventiva de veículos e identificou os principais objetivos que esse sistema deve atingir. Agora, é o momento de avançar no projeto, pesquisando e apresentando frameworks atuais, utilizados por grandes empresas no segmento de serviços em TI, e garantir que o sistema esteja apto a ser comercializado. Prepare um relatório e uma apresentação com exemplos e descrições desses frameworks. É sempre bom unir a teoria estudada com as práticas do mercado de trabalho, para que sua formação seja o mais completa possível e, desta forma, você esteja preparado para pleitear as melhores oportunidades. 
Objetivos dos sistemas distribuídos, Abertura e Concorrência
Os sistemas distribuídos, normalmente, possuem alguns objetivos para atender determinados requisitos. Alguns são considerados desafios importantes que os profissionais da área devem considerar. Segundo Tanenbaum e Steen (2008), esses objetivos são:
· Abertura.
· Concorrência.
· Escalabilidade.
· Heterogeneidade.
· Segurança.
· Tolerância a falhas.
· Transparência.
Entretanto, eles devem ser analisados mais como desafios a serem atingidos, uma vez que nem sempre o sistema distribuído conseguirá atingir todos de maneira integral.
A seguir, descreveremos a que se refere cada uma dessas metas na visão de Tanenbaum e Steen (2008), embora os itens Segurança, Escalabilidade, Tolerância a Falhas e Heterogeneidade mereçam uma atenção especial.
Abertura
No contexto de sistemas distribuídos, refere-se a quanto o sistema é modularizado ou, em outras palavras, quanto é fácil integrar e alterar tecnologias e frameworks sem que o sistema seja comprometido. Você já deve ter ouvido falar em micro serviço, não é verdade? Esse nome é a maneira atual (hype) de dizer que o sistema possui uma grande abertura. Importante observar que, independentemente do que o termo "abertura" possa passar, é uma coisa positiva em sistemas distribuídos. 
É importante ter em mente esse conceito, pois, à primeira vista, um sistema mais "aberto" parece ser uma coisa negativa, no sentido de estar mais vulnerável a falhas e, na verdade, em sistemas distribuídos, isso não é verdade. Segurança não tem relação nenhuma com essa abertura, mas isso é um assunto a ser detalhado em uma próxima oportunidade. Por exemplo, se o sistema utiliza tecnologias não-proprietárias, dizemos que a abertura desse tal sistema é maior.
Concorrência
Refere-se à capacidade de o sistema poder ser acessado e utilizado de maneira simultânea, concorrente (ao mesmo tempo), por vários usuários. Aqui, cabe novamente a ressalva de que, no contexto de sistemas distribuídos, o termo concorrência não tem uma conotação negativa (como ocorre, por exemplo, no comércio), apenas refere-se a um sistema que dá suporte a acessos simultâneos. Por exemplo, várias pessoas podem acessar um website de comércio eletrônico, certo? Pois bem, isso é um acesso concorrente.
Escalabilidade
Escalabilidade é um termo comum em redes de computadores e está relacionado à capacidade de o sistema poder ser escalável, ou seja, ampliado ou reduzido para suportar, por exemplo, uma maior quantidade de acessos simultâneos ou realizar uma tarefa mais rapidamente (ao ampliarmos a capacidade de processamento desse sistema). Perceba como algumas metas podem estar inter-relacionadas nos sistemas distribuídos, como é o caso da escalabilidade e da concorrência. 
Por exemplo, quando uma empresa de games necessita aumentar a quantidade de servidores de um determinado jogo on-line para possibilitar uma maior quantidade de jogadores em uma partida multiplayer, ela está escalando o sistema (nesse exemplo, aumentando a escala dele).
______
📝Exemplificando
Imagine um site de comércio eletrônico no período de promoções, por exemplo, no dia da Black Friday. O sistema deverá ser escalável para permitir picos de acesso simultâneo, dessa forma, uma das maneiras é aumentar a quantidade de nós/servidores, para que não inviabilize o negócio, deixando o sistema indisponível.
______
Segundo Tanenbaum e Steen (2008), um sistema cujo desempenho aumenta com o acréscimo de hardware e software, proporcionalmente à capacidade acrescida, é chamado escalável. 
É importante notar, entretanto, que um sistema dito escalável permite que se aumente ou diminua a quantidade de recursos. Você deve estar se perguntando: por que eu diminuiria a capacidade do meu sistema?
______
📝Exemplificando
Imagine a seguinte situação: você criou uma aplicação web que distribui conteúdo em vídeo para preparar estudantes para fazerem a prova do ENEM. Você roda essa aplicação, de maneira replicada, em um conjunto de servidores em nuvem de algum provedor de cloud computing conhecido do mercado, digamos, com dez nós. Apesar de a ideia ser excelente, você nota que a quantidade de usuários que utiliza sua plataforma cai drasticamente entre os meses de novembro e junho, uma vez que os estudantes, normalmente, começam a se preparar para esse exame – que ocorre anualmente entre outubro e novembro – a partir de julho, quando estão de férias. Supondo que você paga para esse provedor de cloud computing R$ 150,00 mensais, para que este disponibilize os dez nós de maneira contínua. Não seria interessante que, nos meses de menor demanda, você diminuísse a quantidade de servidores pela metade, por exemplo, e pagasse a quantia de R$ 75,00 mensais nesse período? Nesse cenário, sua economia seria de R$ 600,00, que você poderia investir em outros projetos. Esse é um exemplo típico de escalabilidade “para baixo”.
______
Dentre os termos relacionados ao escalonamento, temos dois muito utilizados: escalonamento horizontal e escalonamento vertical.
______
🔁Assimile
O escalonamento horizontal possibilita o aumento de máquinas, tais como servidores, assim há uma divisão da carga de trabalho entre eles, não sobrecarregando um servidor específico. No sistema e-commerce, em que temos os picos de acessos dos clientes simultaneamente,esse tipo de escalonamento é muito utilizado em sistemas distribuídos e em nuvem.
Já o escalonamento vertical permite aumentar recursos de processamento, como CPU e memória em máquinas existentes. Quando se deseja maior desempenho, ou na ocorrência de falhas de uma CPU, essa pode ser uma abordagem importante.
______
Dois aspectos importantes a serem levados em consideração em relação à escalabilidade são em termos geográficos e administrativos.
Escalabilidade em termos geográficos refere-se ao sistema, o qual, apesar de se apresentar como único para o usuário, está rodando em várias réplicas, em dois ou mais data centers geograficamente distintos. Podemos, por exemplo, utilizar um determinado provedor de cloud computing que possua data centers no estado de São Paulo, no Brasil, e no estado do Arizona, nos EUA. A figura abaixo ilustra tal cenário.
Exemplo de escalabilidade geográfica. Fonte: elaborada pelo autor.
O benefício desse tipo de configuração é fornecer uma melhor experiência, em termos de conectividade e latência (atrasos na rede), para os usuários. Aqueles que estão mais próximos do Hemisfério Norte podem acessar a aplicação através dos data centers nos EUA, enquanto os usuários do Hemisfério Sul podem acessar a aplicação através dos data centers no Brasil. 
Outra vantagem é que, na ocorrência de um desastre, por exemplo, um furacão passar pelo Arizona, que comprometa o data center, todos os usuários poderão acessá-lo de outra localidade, incluindo os usuários mais próximos ao data center atingido (ainda que a usabilidade, do ponto de vista desses usuários, seja ligeiramente comprometida, devido a uma maior distância desse data center).
Escalabilidade em termos administrativos, refere-se ao escopo administrativo, que é afetado pela escalabilidade geográfica e é um conceito bastante simples de ser compreendido, embora muitas vezes ignorado. Imagine que, no cenário da figura acima, os links de comunicação do lado dos EUA sejam fornecidos por provedores de internet daquela região, ao passo que os links de comunicação no lado do Brasil sejam fornecidos por provedores de internet daqui. 
Caso o link no lado dos EUA fique indisponível, não adiantará entrar em contato com o provedor de internet daqui do Brasil, pois é uma empresa diferente da que fornece o serviço nos EUA, administrativamente falando. Portanto, o escopo administrativo foi inerentemente ampliado, o que significa que o responsável pelo sistema distribuído terá mais trabalho para administrá-lo, incluindo, por exemplo, a necessidade de abrir um chamado de suporte técnico em outro idioma.
______
📝Exemplificando
A escalabilidade pode ser alterada, isto é, aumentada ou diminuída, de maneira automatizada, sem a intervenção do desenvolvedor, por meio de ferramentas, como Chef e Ansible. Podemos exemplificar a função de ambas as ferramentas em um cenário de um portal de notícias, que tem, durante a madrugada, baixa demanda de acessos. As ferramentas exercem o papel de diminuir automaticamente os recursos utilizados. Em outro exemplo, quando sai uma notícia muito esperada e os acessos ao portal sobem drasticamente, as ferramentas exercem o papel de aumentar os recursos disponibilizados para garantir o bom funcionamento.
Heterogeneidade e Segurança
O termo heterogeneidade vem de heterogêneo, ou seja, algo desigual, que apresenta estrutura, função ou distribuição diferente. Portanto, aplicando isso ao conceito de computação, quando temos heterogeneidade, estamos falando de um sistema que contenha em sua composição máquinas (nós) de sistemas operacionais, recursos (hardware) e até mesmo fabricantes diferentes. Esse é um dos aspectos mais frequentes de um sistema que utiliza arquitetura distribuída. Geralmente, o sistema é composto por máquinas de diversas características diferentes que se comunicam para manter o funcionamento.
Dessa forma, o sistema distribuído é capaz de funcionar em uma arquitetura heterogênea, tanto em termos de hardware quanto de software. Em termos de hardware, significa que o sistema distribuído consegue operar em nós com características de hardware diferentes, por exemplo, entre máquinas com diferentes valores de memória principal (RAM), memória de armazenamento (HD, SSD, etc.) e capacidade de processamento (clock dos processadores). 
Em termos de software, significa que o sistema distribuído suporta, por exemplo, diferentes sistemas operacionais, com alguns nós utilizando MS-Windows, enquanto outros utilizam alguma distribuição GNU/Linux. Isso pode parecer difícil de ser alcançado, mas existe um elemento que facilita nosso trabalho, o middleware, o qual, como o nome sugere, é uma camada de software que fica situada entre a sua aplicação e o sistema operacional. 
Não se preocupe se esse termo e seu papel não estiverem claros ainda, pois detalharemos esse assunto em uma aula posterior. Por exemplo, quando um website roda em máquinas com diferentes sistemas operacionais ou características de hardware (por exemplo, uma máquina do tipo servidor que possui mais memória RAM que outra máquina dentro do mesmo sistema distribuído), dizemos que se trata de um sistema distribuído heterogêneo.
Os protocolos de redes são fundamentais para que essa comunicação entre máquinas diferentes ocorra, porém, na maioria das aplicações distribuídas, precisamos também de um middleware.
O middleware pode ser considerado um conjunto de padrões e funcionalidades que atua como uma camada central entre a nossa plataforma, o sistema operacional e as nossas aplicações. Essa camada central permite que em um sistema distribuído rodem diferentes aplicações em diferentes plataformas e que todas elas consigam se comunicar adequadamente
Existem vários frameworks utilizados para implementação de plataformas de middleware, e os mais conhecidos são:
· CORBA: framework de implementação de middleware baseado na linguagem de programação C++.
· .NET Remoting: framework de implementação de middleware, baseado no ambiente de programação .NET, que pode utilizar várias linguagens diferentes, por exemplo, Visual Basic, C#, entre outras.
· Akka.NET: framework de implementação de middleware, baseado no ambiente de programação .NET, que pode utilizar várias linguagens diferentes, como Visual Basic, C#, entre outras.
·  Java RMI: framework de implementação de middleware, baseado na linguagem de programação JAVA.
·  JAX-WS: framework de implementação de middleware, baseado na linguagem de programação JAVA.
Segurança
Sem dúvida, um dos aspectos mais importantes no projeto de sistemas distribuídos é a segurança. Tipicamente, seja qual for a aplicação desenvolvida, sendo um sistema distribuído, funcionará em uma plataforma com várias máquinas, chamadas de nós, que replicam tal aplicação e, conforme já sabemos, a comunicação entre essas máquinas sempre ocorre por meio de redes de comunicação, tipicamente cabeadas. 
É muito importante sempre considerar aspectos de segurança no projeto de sistemas distribuídos. Segundo Coulouris et al. (2013), em termos de sistemas distribuídos, podemos pensar em dois níveis: o da confidencialidade e o da integridade dos dados. A confidencialidade dos dados refere-se ao acesso ao dado por indivíduos ou sistemas não autorizados, e a integridade dos dados refere-se, além do acesso, à modificação do dado. 
Conforme os autores, os pontos de atenção em relação à segurança no projeto de sistemas distribuídos são:
· Portas são expostas: sistemas distribuídos são construídos com base em um conjunto de processos que oferecem serviços e compartilham informação. As portas de comunicação pelas quais esses serviços se comunicam são, intrinsicamente, abertas (para que clientes possam acessar tais serviços) e, dessa forma, um hacker pode enviar mensagem a qualquer uma delas.
· Redes de computadores não são seguras: remetentes de mensagens podem ser falsificados e endereços IP podem estar duplicados, de forma que alguém malicioso possa receber as mesmas mensagens de um destinatário válido.
· A validade das chaves criptográficas deve ser limitada: quanto mais

Continue navegando

Outros materiais