2. No contexto da Internet, os navegadores Web são exemplos de programas servidores de páginas HTML.
A interface entre
um programa aplicativo e os protocolos de comunicação em um sitema operacional
é conhecida como Interface de Aplicativos, ou API. A API de sockets é
um padrão de facto.
A comunicação realizada a partir da utilização de sockets é um mecanismo
de comunicação entre processos – Inter Process Comunication (IPC) – através da
rede, que pode ser utilizado em processos na mesma máquina.
Os protocolos de comunicação geralmente não especificam a API que as
aplicações devem utilizar. Ao contrário disso, os protocolos especificam quais
são as operações que devem ser fornecidas e permitem que cada sistema
operacional defina a API específica wur uma aplicação deve usar para executar
suas operações.
A API de sockets originou-se como parte do sistema operacional BSD
UNIX. Tanto neste quanto nos sistemas que dele derivam, as funções de sockets
são parte do próprio sistema operacional.
Para um programador, seu programa chama procedimentos de sockets,
que são, então, providos por procedimentos do sistema operacional ou por
rotinas de biblioteca.
Desse modo, um aplicativo que usa sockets pode ser copiado para um
novo computador compilado, carregado junto com a biblioteca de sockets do
computador, e então, executado.
Originalmente, os sockets foram desenvolvidos como parte do sistema
operacional UNIX e utilizam diversos conceitos que são implementados em outras
partes desse sistema.
Um programa vê os sockets como um mecanismo de entrada e saída de
dados, pois eles seguem o paradigma open-read-write-close, usado pela maioria
das operações de entrada e saída.
Sendo assim, um socket deve ser criado, usado e, só então,
destruído. Por isso, quando uma aplicação se comunica através de uma rotina
similar ao socket, forma um caminho para a aplicação transferir dados a um
arquivo. Dessa forma, a compreensão dos sockets exige o entendimento das
características de entrada e saída do UNIX.
Por exemplo, um aplicativo deve primeiro chamar open para
preparar um arquivo para acesso. O aplicativo chama, então, read ou write para
recuperar ou armazenar dados no arquivo. Finalmente, o aplicativo chama close
para especificar que terminou de usar o arquivo.
A comunicação através de sockets utiliza também a abordagem de
descritor. Quando a aplicação solicitar ao sistema operacional para criar um
socket, o aplicativo passará o descritor como um argumento para a chamada de
procedimentos na transferência de dados através da rede.
O sistema operacional fornece um único conjunto de descritores para
arquivos, dispositivos, comunicação entre processos e comunicação de rede. Como
resultado, procedimentos como read e write são bem gerais - uma aplicação pode
usar o mesmo procedimento para enviar dados para outro programa ou um arquivo
através de uma rede.
Em terminologia corrente, o descritor representa um objeto e o
procedimento write, o método aplicado aquele objeto.
A programação por socket difere da entrada e saida convencional de
dados porque um aplicativo deve especificar diversos detalhes para utilizar um
socket.
Por exemplo, um aplicativo deve escolher um protocolo de transporte
em particular, fornecer o endereço de protocolo de uma máquina remota e
especificar se o aplicativo é cliente ou servidor.
Para acomodar todos os detalhes, cada socket tem diversos parâmetros
e opções - um aplicativo pode fornecer valores para cada um deles.
Para evitar que exista uma única função de socket com argumentos
separados para cada opção, os desenvolvedores das APIs de sockets definiram
diversas funções. Essencialmente, um aplicativo cria um socket e, então, invoca
funções para especificar, em detalhes, como ele será usado
A vantagem da abordagem de sockets respalda-se no fato de que a
maioria das funções tem três ou menos argumentos.
A desvantagem, por sua vez, indica que um programador deve
lembrar-se de chamar múltiplas funções sockets.
Conheça, agora, os procedimentos que implementam a API de sockets:
Procedimento Socket: cria um socket e retorna um descritor inteiro. Conheça o
procedimento socket:
sockfd = socket
(protofamily, type, protocol);
Procedimento bind: Uma vez que tenha um socket, você deve associá-lo a uma porta em
sua máquina. Um servidor usa o procedimento bind para prover um número de porta
de protocolo em que o servidor esperará por contato.
bind (sockfd, localaddr,
addrlen);
Procedimento connect: os clientes usam o procedimento connect para estabelecer uma conexão
com um servidor específico: connect
(sockfd, saddress, saddresslen);
Procedimento Listen: Depois de especificar uma porta de protocolo, o servdor deve
instruir o sitema operacional para colocar um socket em modo passivo, para que
este possa ser usado para esperar pelo contato de clientes: listen(sockfd, backlog);
Procedimento Accept: Os servidores iniciam-se chamando socket (criar) e bind (especificar
número de porta). Após executar as duas chamadas, o servidor que usa um protolo
de transporte sem conexão está pronto para aceitar mensagens. No caso de o servidor utilizar um protocolo
de transporte orientado a conexão, é necessário chamar o procedimento listen
para colocar o socket em modo passivo, para só então aceitar uma conexão.
Accept (sockfd, caddress, caddresslen);
Procedimentos send, sendto
e sendmsg: Os cliente e servidores precisam enviar
informações. Geralmente, um cliente envía uma requisição e um servidor envia
uma resposta. Se o socket está conectado, o procedimento send pode ser usado
para transferir dados: send (sockfd,
data, length, flags);
O procedimento sendto e sendmsg permite que o cliente ou servidor
envie uma mensagem usando um socket não conectado, mas ambos exigem que um
destino especificado. O sendto possui o endereço de destino como argumento.
sendto (sockfd, data, length, flags, destaddress, addresslen);
sendmsg (sockfd,
msgstruct, flags)
Procedimento recv,
recvfrom e recvmsg: O cliente e o servidor precisam
receber dados enviados pelo outro. Para tal, a API de sockets fornece vários
procedimentos que podem ser usados. Por exemplo, um aplicativo pode chamar recv
para receber dados de um socket conectado.
recv (sockfd, buffer, length, flags)
recvfrom (sockfd, buffer, length, flags, sndraddr, sddrlen)
recvmsg (sockfd,
msgstruct, flags)
Procedimento close: informa ao sistema para finalizar o uso do socket:
close (sockfd);
Comunicação UDP: socket, bind, recvfrom, sendto, close.
Comunicação TCP: socket, bind, listen, accept, recv,
send, close.
Chamada de Procedimento
Remoto (RPC): Além das tarefas habituais, o
programador que constrói qualquer aplicação cliente-servidor deve, também,
lidar com os detalhes complexos de comunicação.
Mesmo que muitas das funções necessárias sejam fornecidas por uma
API padrão (como a interface de socket, por exemplo), é necessário que sejam
especificados os nomes, os endereços, os protocolos e as portas, entre outros
detalhes.
O ponto positivo é que muitos sistemas cliente-servidor seguem uma
mesma lógica de arquitetura básica e usam a API de sockets para comunicação.
As similaridades entre as aplicações permitiram que um
conjunto de ferramentas de software fosse criado para gerar, automaticamente, o
código para muitas das tarefas de comunicação, deixando o programador livre para
se concentrar em partes da programação que não podem ser automatizadas.
Paradigma de chamada
remota de procedimento – Remote Procedure Call (RPC)
Muitos sistemas distribuídos são baseados em troca explícita de
mensagens entre processos. Contudo, os procedimentos send e receive não
escondem absolutamente nada da comunicação, o que é importante para obter
transparência de acesso em sistemas distribuídos.
Esse problema é conhecido há muito tempo, mas pouco tinha sido feito
para resolvê-lo, até que um artigo de autoria de Birrell e Nelson (1984)
propôs um modo completamente diferente de manipular a comunicação. A proposta
foi permitir que programas fossem capazes de chamar procedimentos localizados
em outras CPUs.
Quando um processo em uma máquina chama um procedimento em uma
máquina remota, o processo chamador (cliente) é suspenso, e a execução do
procedimento chamado (servidor) ocorre na máquina remota.
A informação pode ser transportada, nos parâmetros, do cliente
para o servidor e pode voltar no resultado do procedimento. Nenhuma troca de
mensagem ou entrada e saída é visível ao programador e tem servido de base a
muitos softwares para multicomputadores.
Em sua forma mais simples, para chamar um procedimento remoto, o
programa cliente deve ser ligado a um pequeno procedimento de biblioteca
chamado de stub do cliente, que representa o procedimento servidor no espaço de
endereçamento do cliente. Da mesma maneira, o servidor é ligado a um
procedimento denominado stub do servidor.
Esses procedimentos escondem o fato de uma chamada de procedimento
do cliente para o servidor não ser local.
São componentes da RPC:
CLIENTE: Faz a chamada com o sistema
remoto
STUB DO CLIENTE: Faz a
interface com o runtime system (esconde chamadas de baixo nível da aplicação)
RPC RUNTIME: Comunicação entre dois computadores, que esconde os detalhes da
comunicação de rede, retransmissões e comunicações, etc.
SERVIDOR: Faz o atendimento a requisição
STUB DO SERVIDOR: Faz o mesmo que o stub do cliente.
Tratamento de falhas com RPC:
O cliente não é capaz de
localizar o servidor: isso ocorre devido a uma falha de hardware e em função de o servidor
não estar efetivamente disponível. O tratamento específico desse erro elimina a
transparência;
Perda de mensagem
solicitando serviço: nesse caso, devemos usar um contador
de tempo; se o tempo expirar e a resposta não chegar, retransmita a mensagem
Perda de mensagem com
resposta: o que torna a mensagem idempotente
Quedas do servidor: definir semântica
- mínimo uma vez que garante que a chamada remota ao procedimento será
executada no mínimo uma vez ou no máximo uma vez que garante que a chamada
remota foi executada no máximo uma única vez.
Queda do cliente: trata-se da situação em que o cliente manda uma requisição e, antes
de receber a resposta, sai do ar. Essa situação causa dois problemas: a geração
de processos órfãos (zombie) e o tempo de CPU gasto desnecessariamente pelo
servidor.
Em relação à RPC, a localização física e a arquitetura do servidor
são TRANSPARENTES.
1. Em relação à comunicação utilizando RPC, podemos afirmar que:
Assinale a opção CORRETA.
Assinale a opção CORRETA.
I – A troca de informações é realizada
através de parâmetros da chamada.
III – Clientes chamam procedimentos remotos
como se fossem locais.
IV – A localização física e a arquitetura do
servidor são transparentes.
2. De acordo com a nossa aula, quando tratamos da comunicação utilizando
sockets, qual é o procedimento que associa uma porta ao socket?
Assinale a opção CORRETA
Assinale a opção CORRETA
4) Bind
3. Em relação à comunicação por sockets o procedimento close possui a seguinte
função:
2)
Encerra o socket ou a conexão
O modelo de comunicação
Peer-to-Peer (P2P) é implementado em uma rede de computadores cuja comunicação
não está baseada em servidores dedicados – como no modelo cliente-servidor –, e
sim na comunicação direta entre cada nó da rede (peers).
Cada computador conectado tem a
capacidade de atuar como servidor – realizando tarefas para outros usuários da
rede – ou como cliente – requisitando a realização dessas tarefas.
Na comunicação P2P,
indivíduos que constituem um grupo livre podem comunicar-se com outros
participantes do grupo. Em princípio, toda pessoa pode se comunicar com uma ou
mais pessoas – não existe qualquer divisão estrita entre clientes e servidores.
Diversos sistemas P2P –
como o BitTorrent (COHEN, 2003) – não possuem qualquer informação centralizada.
Ao contrário, esses sistemas mantêm suas informações locais e compartilham uma
lista dos peers vizinhos que os compõem.
Quando uma nova consulta é
realizada a um membro do sistema, é possível retornar com os nomes de seus
outros membros, para que a busca por mais conteúdo e mais nomes seja possível.
Esse processo de pesquisa pode ser repetido indefinidamente, até que se crie um
grande banco de dados.
Normalmente, a comunicação P2P é
usada para compartilhar diferentes tipos de arquivos. Essa comunicação alcançou
o auge por volta do ano 2000, com a criação do Napster por Shawn Fanning para o
compartilhamento de músicas entre amigos da faculdade.
Esse serviço foi encerrado depois
daquilo que, provavelmente, foi a maior exposição sobre a violação de direitos
autorais em toda a história da tecnologia.
REDES P2P: Há uma grande dificuldade em
montar uma rede de entrega de conteúdo – Content Delivery Networks (CDN) – de
1000 nós no mundo inteiro para distribui-lo.
Na verdade, não é difícil alugar
1000 máquinas virtuais no mundo inteiro, devido à indústria de hospedagem bem
desenvolvida e altamente competitiva. Entretanto, conseguir os nós é só o
início da montagem de uma CDN.
Mas, felizmente, existe uma
alternativa para o restante de nós, que é simples de usar e pode distribuir uma
quantidade tremenda de conteúdo com uma rede P2P.
A tecnologia P2P pode ser usada de diversas maneiras. Com seu
desenvolvimento e grande interesse por parte dos usuários, o tráfego P2P
tornou-se, rapidamente, responsável por uma grande fração de todo o tráfego na
internet.
Comunicação P2P: As redes P2P são autoescaláveis, e sua capacidade de upload útil
cresce em conjunto com as demandas de download que podem ser feitas por seus
usuários. Em certo sentido, essas redes sempre são grandes o suficiente, sem a
necessidade de alguma infraestrutura dedicada. Ao contrário disso, a capacidade
até mesmo de um site Web grande é fixa e será ora muito grande ora muito
pequena.
Considere, por exemplo, um site com apenas 100 clusters, cada um
capaz de trabalhar a 10 Gbps. Essa capacidade enorme não ajuda quando existe um
pequeno número de usuários. O site não pode receber informações de N usuários
em uma taxa mais rápida que N Mbps, pois o limite está nos usuários, e NÃO no
site.
Quando existe mais de 1.000.000 de usuários a 1 Mbps, o site Web não
pode bombear dados com rapidez suficiente para manter todos ocupados fazendo
download. Esse pode parecer um número considerável de usuários, mas grandes
redes BitTorrent (como, por exemplo, o Pirate Bay) afirmam ter mais de 10
milhões de usuários. De acordo com essa abordagem, isso significa algo em torno
de 10 terabits/s.
Bittorrent: O protocolo BitTorrent foi desenvolvido por Brahm Cohen, em 2001,
para permitir que um conjunto de peers compartilhasse arquivos rápida e
facilmente. Existem dezenas de clientes disponíveis gratuitamente que entendem
esse protocolo.
Em um sistema P2P típico, como o BitTorrent, cada um dos
usuários tem a mesma informação, que pode ser de interesse de outros usuários.
Essa informação pode ser um software gratuito, uma música, vídeos, fotografias
etc.
Existem três problemas que precisam ser resolvidos para
compartilhar o conteúdo nesse ambiente. Veja, a seguir, cada um deles.
O surgimento dos sistemas P2P: O surgimento das redes de compartilhamento
de arquivos P2P motivou a comunidade de pesquisa. A essência dos sistemas P2P
está no fato de que evitam as estruturas gerenciadas, de forma central, das
CDNs e de outros sistemas. Essa pode ser uma vantagem significativa.
Quando o sistema fica muito grande, os componentes gerenciados
de forma central tornam-se um gargalo e correspondem a um ponto de falha
isolado. Contudo, os primeiros sistemas P2P eram apenas parcialmente
descentralizados – se fossem totalmente descentralizados, seriam ineficazes.
Distributed Hash Tables
(DHTs): Criar um índice de posse de cada um é
simples, mas é centralizado. Fazer com que cada par mantenha seu próprio índice
também não soluciona o problema. Entretanto, exige bastante trabalho para
manter atualizados os índices de todos os peers – pois o conteúdo é movimentado
pelo sistema –, o que não compensa o esforço.
A principal questão a ser respondida pela comunidade de
pesquisa foi: seria possível criar índices P2P que fossem totalmente
distribuídos, mas que possibilitassem um bom desempenho?
O bom desempenho pode ser interpretado da seguinte forma: Cada
nó mantém apenas uma pequena quantidade de informação sobre outros nós, o que
significa que não será caro manter o índice atualizado.
Cada nó pode pesquisar, rapidamente, entradas no índice. Caso
contrário, esse não será um índice muito útil.
Cada nó pode usar o índice ao mesmo tempo, ainda que outros
nós apareçam e desapareçam. Essa propriedade indica que o desempenho do índice
aumenta com o número de nós.
A resposta para essa pergunta foi SIM. Para tal, foram
desenvolvidas, em 2001, quatro soluções. São elas:
Chord (STOICA et al., 2001);
Can (RATNASAMY et al., 2001);
Pastry (ROWSTRON; DRUSCHEL, 2001);
Tapestry (ZHAO et al., 2004).
Essas soluções são conhecidas como Distributed Hash Tables
(DHTs), pois a funcionalidade básica de um índice é mapear uma chave a um
valor. Isso representa uma tabela de hash, e, naturalmente, as soluções são
versões distribuídas.
As DHTs realizam seu
trabalho impondo uma estrutura regular sobre a comunicação entre os nós. Esse
comportamento é muito diferente daquele das redes P2P tradicionais, que usam
quaisquer conexões que os peers façam.
Por esse motivo, as DHTs são chamadas de redes P2P estruturadas. Os
protocolos P2P tradicionais montam redes P2P desestruturadas (ou não
estruturadas).
Como exemplo, utilizaremos a solução DHT Chord. Vamos conhecê-la?
Pensando em um cenário, considere como substituir o tracker
centralizado tradicionalmente – usado no BitTorrent – por um tracker totalmente
distribuído. A solução DHT Chord pode ser usada para resolver esse problema.
Nesse cenário, o índice geral é uma listagem de todos os swarms aos
quais o computador pode-se juntar para baixar conteúdo. A chave usada para
pesquisar o índice é a descrição do conteúdo pela torrent. Ela identifica um
swarm exclusivamente, do qual o conteúdo pode ser baixado como os hashes de
todos os chunks de conteúdo.
O valor armazenado no índice para cada chave é a lista de peers que
compreendem o swarm. Esses peers são os computadores que entram em contato para
baixar o conteúdo. Uma pessoa que espera baixar conteúdo (como um filme, por
exemplo) tem apenas a descrição da torrent.
A pergunta que a DHT precisa responder é: como, sem um banco de
dados central, uma pessoa descobre de quais peers (entre os milhões de nós
BitTorrent) ela deve copiar o conteúdo?
Uma DHT Chord consiste em
N nós participantes. Eles são nós que executam BitTorrent em nosso cenário.
Cada nó tem um endereço IP pelo qual pode ser comunicado.
O índice geral está espalhado pelos nós. Isso significa que cada um
armazena bits e pedaços do índice para uso por outros. A parte central da Chord
navega pelo índice usando identificadores em um espaço virtual, e não os
endereços IP dos nós ou os nomes de conteúdo.
Para transformar um endereço de nó em um identificador, ele é
mapeado para um número de M bits, usando uma função de hash. Sendo assim,
podemos usá-lo para converter qualquer endereço IP em um número de 160 bits –
chamado de identificador de nó.
Solução DHT Chord - Chave
Uma chave também é produzida pela execução do hashing de um nome de
conteúdo com hash para gerar um número de 160 bits (nome = torrent). Sendo
assim, para converter o arquivo de descrição de torrent para sua chave,
calculamos: chave = hash(torrent).
Para iniciar um novo swarm,
um nó precisa inserir um novo par chave-valor, que consiste no índice (torrent,
meu-endereço-IP). Para conseguir isso, o nó pede ao sucessor – hash(torrent) –
para armazenar meu-endereço-IP. Desse modo, o índice é distribuído pelos nós
aleatoriamente.
Com a DHT construída, quando outro nó desejar encontrar uma torrent
de modo a se juntar ao swarm e baixar o conteúdo, um nó pesquisará a torrent
primeiro, calculando seu hash para obter a chave. Depois, esse nó usará o
sucessor(chave) para encontrar o endereço IP do nó que armazena o valor
correspondente.
Solução DHT Chord IP: Para possibilitar a localização do endereço IP do nó correspondente
a certa chave, cada nó precisa manter determinadas estruturas de dados
administrativas. Uma delas é o endereço IP de seu nó sucessor junto ao anel
identificador de nó. Por exemplo, na apresentada anteriormente, o sucessor do
nó 4 é 7, e o sucessor do nó 7 é 12.
Agora, a pesquisa pode prosseguir da
seguinte forma:
O nó solicitante envia um pacote a seu sucessor, contendo seu
endereço IP e a chave que está procurando. O pacote é propagado pelo anel até
que localize o sucessor do identificador de nó procurado. Esse nó verifica se
possui qualquer informação que combine com a chave; caso haja, ele retorna a
informação diretamente ao nó solicitante, cujo endereço IP possui.
Entretanto, a busca linear de todos os nós é ineficaz com um
grande sistema P2P, pois o número médio de nós exigido por consulta é N/2. Para
agilizar a busca, cada nó também mantém o que a Chord chama de tabela de
fingers, que contém M entradas, indexadas de 0 até M - l, cada uma apontando
para um nó real diferente.
Visto que os nós entram e saem o tempo todo, o DHT Chord precisa de
uma forma de lidar com essas operações. Assumimos que, quando o sistema iniciou
sua operação, ele era pequeno o suficiente para que os nós pudessem apenas
trocar informações diretamente para criar o primeiro anel e tabelas de fingers.
Depois disso, um procedimento automatizado é necessário.
Quando um novo nó (r) deseja-se conectar, ele precisa entrar em
contato com um nó existente e pedir que este pesquise o endereço IP do
sucessor(r) para ele. Em seguida, o novo nó pede o predecessor do sucessor(r).
Por fim, o novo nó pede a ambos para inserir r entre eles e o anel.
Contudo, muitas tabelas de fingers podem estar erradas. Para
corrigi-las, cada nó executa um processo em segundo plano que recalcula,
periodicamente, cada finger, chamando o sucessor. Quando uma dessas consultas
alcança um novo nó, a entrada de finger correspondente é atualizada.
Quando um nó sai de modo controlado, ele entrega suas chaves a seu
sucessor e informa a seu predecessor sobre sua saída, para que ele possa se
vincular ao sucessor do nó que está saindo.
Quando um nó falha, surge um problema, pois seu predecessor não tem
mais um sucessor válido. Para aliviar esse problema, cada nó registra não
apenas seu sucessor direto mas também seus sucessores diretos, para permitir
que ele pule até s - l nós consecutivos (com falhas) e reconecte o anel – em caso
de queda
Alguns clientes BitTorrent utilizam DHTs para fornecer um tracker
totalmente distribuído do tipo que descrevemos. Grandes serviços de computação
em nuvem, como o Dynamo da Amazon, por exemplo, também incorporam técnicas de
DHT
1. O arquivo torrent possui os seguintes
tipos de informação:
5) Tracker e chunks
2. O servidor que auxilia a comunicação
entre dois computadores que utilizam o protocolo P2P BitTorrent é:
3) Tracker
3. A aplicação P2P que utiliza
servidores centrais para a indexação de arquivos é:
1) Emule
Os sistemas de
arquivos distribuidos (DFS) sao a vase para muitas aplicações distribuidas,
já que permitem que vários processos compartilhem dados, de modo seguro e
confiável, por longos pedíodos.
Um sistema de arquivos fornece serviços de arquivo para
clientes. O componente primário de hardware que um servidor de arquivos
controla é um conjunto de dispositivos locais de armazenamento secundário
(geralmente, dicos magnéticos), nos quais arquivos são armazenados e
recuperados, de acordo com as solicitações dos clientes. Em um DFS, a atividade
de serviço deve ser realizada através da rede-
Esse sistema pode ser implementado como parte de um sistema
operacional distribuido ou alternativamente por uma camada de software, cua
tarefa é gerenciar a comunicação entre sistemas operacioais e convencionais e
sistemas de arquivo.
As características que diferenciam um DFS são a
multiplicidade e a autonomia de clientes e servidores no sistema.
Funções DFS: O DFS deve aparecer para seus clientes como um sistema de arquivos
convencional centralizado. Portanto, é de sua responsabilidade localizar os
arquivos e providenciar o transporte dos dados.
Essa transparência facilita a mobilidade do usuário, trazendo
seu ambiente para onde quer que ele se conecte.
O referido sistema também possui, como importante medida de
desempenho, a quantidade de tempo necessária para o atendimento das requisições
de serviço.
Em sistemas convencionais, esse tempo consiste no tempo de
acesso ao disco e em um pequeno intervalo de tempo de processamento da CPU.
Entretanto, em um DFS, um acesso remoto possui o overhead
adicional atribuído à estrutura distribuída.
Por fim, o DFS gerencia um conjunto de dispositivos de
armazenamento dispersos.
Um DFS fornece os seguintes serviços:
Serviço de Armazenamento: Serviço relacionado à alocação e ao gerenciamento de espaço e operações
para armazenamento e recuperação de dados.
Serviço de Arquivo: Serviço que trata das operações com arquivos independentes, incluindo:
- Modos de acesso;
- Políticas de caching;
- Semântica de compartilhamento;
- Replicação;
- Controle de concorrência;
- Consistência dos dados etc.
Serviço de Nomeação: Serviço que fornece mapeamento entre nomes de arquivos e seus
identificadores.
Nomeação e transparência
Em DFS, a nomeação é um mapeamento entre objetos lógicos e
físicos. Já a transparência oculta o local em que o arquivo está localizado na
rede.
Dado um nome de arquivo, o mapeamento retorna um conjunto de
localizações dessas réplicas do arquivo.
Nessa abstração, ficam ocultas tanto a existência de
múltiplas cópias quanto sua localização.
Estruturas de Nomeação
Veja, a seguir, as noções relacionadas aos mapeamentos de
nomes em um DFS:
Transparência de localização
– nesse caso, o nome de um arquivo não
revela qualquer indicação de sua localização física de armazenamento;
Independência de localização
– nesse caso, o nome de um arquivo não
precisa ser alterado quando da mudança de sua localização física de
armazenamento.
Um esquema de nomeação independente de localização é um mapeamento
dinâmico, já que se pode mapear o mesmo nome de arquivo para diferentes locais
em dois momentos distintos.
Portanto, a independência de localização é uma propriedade
mais forte do que a transparência de localização.
Na prática, a maioria dos DFS
atuais fornece um mapeamento estático e transparente de localização para nomes
no nível do usuário. Entretanto, esses sistemas não suportam a migração de
arquivos. Em outras palavras, a mudança automática da localização de um arquivo
é impossível. Portanto, a noção de independência de localização é irrelevante
para esses sistemas.
Os arquivos são associados
permanentemente a um conjunto específico de blocos de disco. Arquivos e discos
podem ser manualmente movimentados entre máquinas, mas a migração de arquivos
implica uma ação automática iniciada pelo sistema operacional.
Esquemas de Nomeação
Abordagem mais simples
Nesse tipo de abordagem, o
arquivo é identificado com alguma combinação de seu nome de host e seu nome
local, o que garante um nome exclusivo em todo o sistema.
Esse esquema de nomeação não é
transparente quanto à localização nem independente de localização. Entretanto,
as mesmas operações de arquivo podem ser utilizadas tanto para arquivos locais
quanto para arquivos remotos.
Abordagem popularizada pelo Network File System (NFS)
O NFS fornece um meio de anexar
diretórios remotos a diretórios locais, dando, assim, a aparência de uma árvore
de diretórios coerente.
Abordagem de única estrutura global de nomes
Nesta abordagem, uma única
estrutura global de nomes abrange todos os arquivos do sistema.
A estrutura de sistema de
arquivos composta é igual à estrutura de um sistema de arquivos convencional.
Entretanto, na prática, os diversos arquivos especiais tornam esse objetivo
difícil de ser atingido.
Modelos de acesso
A forma como uma requisição será tratada
dependerá do modelo de acesso do sistema de arquivos que será dado aos
arquivos.
Em um DFS, dois modelos de acesso podem ser
utilizados:
Modelo de serviço remoto: um usuário solicira acesso a um arquivo remoto, o servidor armazena
o arquivo será localizado pelo esquema de nomeação, e então, realizará a
transferência dos dados. Uma das maneiras mais comuns para implementar o
serviço remoto é o paradihma da RPC.
Modelo de Caching: Se os dados necessários para atender à solicitação de acesso ainda
não estiverem armazenados em cache, uma cópia desses dados do servidor será
trazida para o sistema cliente. Dessa forma, seus acessos serão executados na
cópia do cache. A ideia é reter no cache blocos de disco recentemente
acessados, de modo que acessos repetidos às mesmas informações possam ser
manipulados localmente, sem tráfego de rede adicional.
Os arquivos ainda são identificados com uma cópia-mestra –
residindo na máquina do servidor e mais cópias (ou partes) do arquivo
disseminadas em diferentes caches. Quando uma cópia do cache for modificada, as
mudanças precisarão se refletir na cópia-mestra para preservar a semântica de
consistência relevante.
A granularidade dos dados do cache de um DFS pode variar de blocos
de um arquivo a um arquivo inteiro.
Comparação entre
armazenamento em cache e serviço remoto
Quando o armazenamento em cache é utilizado, o cache local pode
manipular eficientemente um número substancial dos acessos remotos.
O aproveitamento da localidade nos padrões do acesso a arquivos
torna o armazenamento em cache ainda mais atraente.
A maioria dos acessos remotos será atendida tão rapidamente quanto
os acessos locais. Além disso, os servidores são contatados apenas
ocasionalmente. Consequentemente, a carga no servidor e o tráfego na rede são
reduzidos, e a possibilidade para a escalabilidade aumenta.
Por outro lado, quando o método de serviço remoto é utilizado, cada
acesso remoto é manipulado através da rede. O prejuízo é associado ao aumento
de tráfego na rede, à carga no servidor e à redução no desempenho.
Quando transmitimos grandes porções de dados (conforme é feito no
armazenamento em cache), o overhead total da rede é mais baixo do que quando
transmitimos séries de respostas a solicitações específicas (como no método de
serviço remoto).
Além disso, as rotinas de acesso a disco no servidor podem ser mais
otimizadas quando sabemos que as solicitações envolverão sempre grandes
segmentos de dados contíguos – em vez de blocos aleatórios de disco.
O problema da consistência do cache é a principal desvantagem do
armazenamento em cache. Quando os padrões de acesso exibem gravações não
frequentes, o armazenamento em cache é superior.
Entretanto, quando as gravações são frequentes, os mecanismos
empregados para resolver o problema da consistência incorrem em overhead
significativo em termos de desempenho, tráfego na rede e carga no servidor.
Para que o armazenamento em cache traga benefícios, a execução deve
ser levada a efeito em máquinas que tenham discos locais ou memórias principais
de grande capacidade. O acesso remoto em máquinas com memória de pouca
capacidade e sem discos deve ser realizado por meio do método de serviço
remoto.
No armazenamento em cache, como os dados são transferidos em massa
entre o servidor e o cliente – em vez de em resposta às necessidades
específicas de uma operação de arquivo -, a interface de mais baixo nível entre
máquinas é diferente da interface de mais alto nível do usuário.
Por outro lado, o modelo do serviço remoto é apenas uma extensão da
interface local do sistema de arquivos através da rede. Sendo assim, a
interface entre máquinas espelha a interface do usuário.
Stateful (serviço com
estado) versus stateless (serviço sem estado)
Existem duas abordagens para o armazenamento de informações no lado
do servidor, quando um cliente acessa arquivos remotos, quais sejam:
·
O servidor busca cada arquivo
que estiver sendo acessado pelo cliente; ou
·
O servidor simplesmente fornece
blocos conforme são solicitados pelo cliente, sem saber como esses blocos estão
sendo utilizados.
No primeiro caso, o serviço fornecido tem estado (stateful); no
outro, o serviço não tem estado (stateless).
Stateful (serviço com
estado): No serviço de arquivos com estado, um
cliente deve executar uma operação open () sobre um arquivo antes de acessá-lo.
O servidor, então, extrai informações sobre o arquivo em seu disco, armazena
essas informações em memória e fornece ao cliente um identificador de conexão
único para o cliente e o arquivo aberto.
Em termos do UNIX, o servidor extrai o I-node e fornece ao cliente
um descritor de arquivo, que serve como um índice para a tabela de inodes em
memória.
No stateful, o servidor deve reclamar o espaço de memória principal
utilizado pelos clientes que não estão mais ativos.
O ponto chave relacionado à tolerância a falhas em uma abordagem de
serviço com estado é que o servidor mantém informações sobre seus clientes na
memória principal.
Stateless (serviço sem
estado): O serviço de arquivos sem estado evita
informações de estado, tornando cada solicitação autossuficiente. Em outras
palavras, cada solicitação identifica completamente o arquivo e sua posição no
arquivo (para acessos de leitura e gravação).
No stateless, o servidor não precisa manter uma tabela de arquivos
abertos na memória principal. Além disso, não há necessidade de estabelecer e
terminar uma conexão por operações open () e close ().
Um processo-cliente abre um arquivo, e essa abertura não resulta no
envio de uma mensagem remota.
Leituras e gravações são realizadas como mensagens remotas (ou
consultas ao cache). O fechamento final pelo cliente, por sua vez, resulta
novamente em apenas uma operação local.
Vantagens e distinção
entre satateful e stateless
VANTAGENS: A vantagem de um serviço com estado sobre um serviço sem estado é o
aumento do desempenho. Informações de arquivo são armazenadas em cache na
memória principal e podem ser facilmente acessadas via identificador de
conexão, evitando, assim, acessos ao disco.
Além disso, um servidor com estado sabe se um arquivo está aberto
para acesso sequencial e pode, portanto, ler os próximos blocos à frente.
Servidores sem estado não podem fazer isso, pois não conhecem o objetivo das
solicitações do cliente.
DISTINÇÃO: distinção entre stateful e stateless torna-se mais evidente quando
consideramos os efeitos de uma queda durante uma atividade de serviço. Nessa
situação, um servidor com estado perde todos os seus estados voláteis.
A garantia de recuperação sem prejuízo desse servidor implica a
restauração de seu estado, normalmente realizada por um protocolo de
recuperação baseado em um diálogo com os clientes.
STATEFULL: Do ponto de vista do cliente, não há diferença entre um servidor
lento e um servidor em recuperação. Se não receber resposta, o cliente
continuará a retransmitir sua solicitação.
Em alguns ambientes, o stateful é uma necessidade. Se o servidor
empregar o método iniciado para validação do cache, não poderá oferecer serviço
sem estado, pois deverá manter um registro dos arquivos que foram armazenados
em cache e dos clientes que os armazenaram.
STATELESS: Um problema diferente é causado por falhas dos clientes. O servidor
precisa tornar-se consciente dessas falhas, de modo que possa reclamar o espaço
alocado para registrar o estado dos processos-clientes que falharam.
O stateless evita esses problemas, pois um servidor recentemente
recuperado pode responder a uma solicitação autossuficiente sem qualquer
dificuldade. Portanto, os efeitos de falhas e de recuperações do servidor são
quase imperceptíveis.
Replicação de arquivos
Replicação Explícita: Quando a responsabilidade fica a cargo do programador. Nesse caso, o
serviço de diretórios pode permitir diversos índices de arquivos para cada
arquivo.
Esse tipo de replicação é de difícil implementação e não permite a
aplicação da transparência.
Replicação Atrasada (lasy):
Quando apenas uma cópia é realizada em um servidor.
Nesse caso, o servidor possui a responsabilidade de propagar as atualizações e
de garantir que outro servidor responda no caso de sua impossibilidade.
Replicação em grupos: Quando a operação de escrita é realizada em todos os arquivos ao
mesmo tempo (multicast atômico).
SEMÂNTICA DE
COMPARTILHAMENTO
Na semântica Unix, as alterações são visíveis instantaneamente.
Em sistemas de um único processador, normalmente, a semântica
declara que, quando uma operação read vem depois de uma operação write, aquela
retorna o valor que acabou de ser escrito. Veja, a seguir, uma figura que
representa uma semântica Unix:
De maneira semelhante, quando duas operações write ocorrem em rápida
sucessão, seguidas por uma read, o valor lido é o valor armazenado pela última
write. Na verdade, o sistema impõe uma ordenação de tempo absoluto a todas as
operações e sempre retorna o valor mais recente.
Em um sistema distribuído, a semântica Unix pode ser alcançada com
facilidade, contanto que haja somente um servidor de arquivos e que os clientes
não os armazenem.
Todas as operações read e write vão diretamente para o servidor de
arquivos, que as processa estritamente em sequência. Essa abordagem gera a
semântica Unix, exceto pelo pequeno problema de que atrasos de rede podem fazer
com que uma read que ocorreu em um microssegundo após uma write chegue antes ao
servidor e, por isso, obtenha o valor antigo.
SEMÂNTICA DE SESSÃO: Em vez de requerer que uma read veja os efeitos de todas as
operações write anteriores, podemos estabelecer uma nova regra em que: As
alterações em um arquivo aberto sejam incialmente visíveis apenas para o
processo, que modificou a maquina. As alterações devem ficar visíveis para
outros processos ou máquinas, somente quando o arquivo for fechado.
Arquivos Imutáveis:
Um um sistema distribuído, uma abordagem completamente diferente da
semântica de compartilhamento de arquivos é tornar imutáveis todos eles.
Dessa forma, não existe nenhum modo de abrir um arquivo para
escrita. Na verdade, as únicas operações em arquivos são create e read.
O que se permite é criar um arquivo inteiramente novo e
passá-lo para o sistema de diretório sob o nome de um arquivo previamente
existente, que, agora, se tornará inacessível (ao menos sob esse nome).
Por isso, embora seja impossível modificar o arquivo
específico, continua possível substituir, atomicamente, esse arquivo por um
novo. Em outras palavras, embora arquivos não possam ser atualizados, os
diretórios podem.
Uma vez decidido que os arquivos não podem ser alterados de jeito
algum, o problema de como lidar com dois processos – como escrever em um
arquivo e ler esse arquivo – simplesmente desaparece, o que simplifica,
consideravelmente, o projeto.
Resta, então, o problema que ocorre quando dois processos tentam
substituir o mesmo arquivo simultaneamente. Como acontece com a semântica de
sessão, a melhor solução para esse caso seria permitir que um dos novos
arquivos substituísse o antigo – seja este o último, seja a substituição não
determinística.
Um problema um pouco mais desagradável diz respeito a como
prosseguir se um arquivo for substituído enquanto outro processo estiver ocupado,
lendo esse mesmo arquivo.
Uma solução é dar um jeito de o processo leitor continuar usando o
arquivo antigo, mesmo que este não esteja mais em nenhum diretório, comparado
ao modo como o Unix permite a um processo que tenha um arquivo aberto continuar
a usá-lo, mesmo depois de esse arquivo ter sido apagado de todos os diretórios.
Outra solução é detectar se o arquivo foi alterado e fazer com que
as tentativas subsequentes de ler esse arquivo falhem.
Network File System (NFS)
: O padrão NFS mais recente é a Versão 4 que difere
fundamentalmente das versões anteriores. Essa versão apresenta uma mudança
significativa, em que o protocolo tem estado, o que significa que o servidor
mantém o estado da sessão do cliente do momento em que o arquivo remoto é
aberto até que ele seja fechado.
Sendo assim, o protocolo NFS fornece operações open() e close(). As
versões anteriores do NFS – que não têm estado – não fornecem tais operações.
Além disso, as versões anteriores especificam protocolos separados
para a montagem de sistemas de arquivos remotos e para o trancamento (lookup)
desses arquivos. Em particular, o protocolo de montagem foi eliminado,
permitindo que o NFS funcionasse com firewalls de rede.
A Versão 4 do NFS aprimorou a capacidade de os clientes armazenarem
em cache local os dados dos arquivos, melhorando o desempenho do DFS, já que os
clientes são capazes de resolver mais acessos a arquivos a partir do cache local
do que passando pelo servidor.
Outro benefício dessa versão permite que os clientes solicitem locks
de arquivos aos servidores. Se o servidor atender à solicitação, o cliente
manterá o lock até que ele seja liberado ou que sua concessão expire.
Tradicionalmente, os sistemas baseados no Unix oferecem trancamento
aconselhável de arquivos, enquanto os sistemas operacionais Windows utilizam o
trancamento obrigatório.
Para permitir que o NFS funcione bem com sistemas não Unix, ele
também fornece trancamento obrigatório.
Os novos mecanismos de trancamento e armazenamento em cache são
baseados no conceito de delegação. O cliente delegado mantém em cache a versão
corrente do arquivo, e outros clientes podem solicitar a ele o acesso ao lock e
o conteúdo do arquivo, até que o cliente delegado desista do lock e da
delegação.
Finalmente, enquanto as versões anteriores do NFS são baseadas no
protocolo de rede UDP, a Versão 4 é baseada no TCP, que permite melhor
adaptação a cargas variadas de tráfego na rede. A delegação dessas
responsabilidades aos clientes reduz a carga no servidor e melhora a coerência
do cache.
É desejável ocultar os detalhes de replicação dos usuários. O
mapeamento de um nome de arquivo copiado em uma réplica específica é tarefa do esquema
de nomeação.
A existência de réplicas deve ser invisível aos níveis mais altos.
Nos níveis mais baixos, entretanto, as réplicas devem ser diferenciadas umas
das outras por distintos nomes de mais baixo nível.
Outro requisito de transparência é fornecer controle de replicação
nos níveis mais altos.
1. O armazenamento em cache com gravação direta é denominado:
R) Write-through
2. Quando o nome de um arquivo não revela qualquer indicação de sua
localização física de armazena¬mento, podemos afirmar que o DFS implementa:
R) Transparência de
localização
3. Com relação aos serviços com estado e os serviços sem estado,
indique, dentre as afirmativas a seguir, quais são verdadeiras (V) e quais são
falsas (F), assinalando a opção CORRETA:
I. No serviço com estado, o servidor fornece ao cliente um
identificador de conexão utilizado para acessos subsequentes até que a sessão
termine.
III. No serviço sem estado, o servidor não precisa man¬ter uma
tabela de arquivos abertos na memória principal.
Os serviços web (web services) abrangem um conjunto de padrões
relacionados que podem habilitar quaisquer duas aplicações de computador a se
comunicarem e a trocarem dados, via internet, por meio de protocolos padrões.
Para um sistema distribuído funcionar corretamente, componentes de
aplicações que executam em computadores diferentes por toda a rede devem poder
comunicar-se.
Tecnologias como DCOM e CORBA habilitam a comunicação entre
componentes distribuídos. Entretanto, impõem um custo para viabilizar essa comunicação.
Muitas vezes, seus componentes se comunicam via uma ponte entre COM e CORBA.
Funcionamento: Os serviços web funcionam a partir do uso de padrões
abertos (não proprietários).
Em outras palavras, teoricamente, esses serviços podem habilitar a
comunicação entre quaisquer dois componentes de software – independentemente
das tecnologias utilizadas para criar os componentes ou as plataformas nas
quais residem (interoperabilidade).
Os web services fornecem, de forma mais genérica, uma interface de
serviços para a interação com os servidores.
Sendo assim, as aplicações podem utilizar sua própria linguagem, que
será traduzida para uma linguagem comum: o formato XML.
Os serviços web melhoram o desenvolvimento de software colaborativo,
permitindo que desenvolvedores criem aplicações combinando códigos escritos em
qualquer linguagem de qualquer plataforma.
Esses serviços também promovem programação modular. Cada função
específica de uma aplicação pode ser apresentada como um serviço web separado.
Indivíduos ou empresas podem criar suas próprias aplicações
exclusivas, mesclando e compatibilizando os web services que fornecem a
funcionalidade de que precisam.
Arquitetura (SOA), caracterízada pela as seguintes propriedades: Visão Lógica,
Orientação à mensagem, orientação à descrição, Granularidade, orientação à
rede, plataforma neutra.
Componentes da arquitetura SOA
Os componentes da arquitetura SOA representam uma coleção de
serviços que se comunicam da troca de mensagens XML:
Provedor de Serviço WEB: Responsável pela descrição das informações de conexão na chamada ao
serviço e pela publicação e descrição do web service no registro dos serviços.
Registros de Serviços: Manutenção de diretório com as informações sobre os serviços. Na
SOA, o padrão adotado para registro é o Universal Description, Discovery and
Integration (UDDI).
Consumidor de Serviço: Responsável pela descoberta de um serviço, pelo recebimento de sua
descrição e por sua utilização para a conexão a um provedor. Seu objetivo é
chamar um serviço web.
Plataforma .NET da
Microsoft
A iniciativa .NET inclui o ambiente de desenvolvimento integrado
Visual Studio .NET, que habilita programadores a desenvolverem serviços web em
uma variedade de linguagens – incluindo C++, C# e Visual Basic .NET.
Os serviços web .NET – fundamentais da iniciativa .NET – estendem o
conceito de reutilização de software à internet, permitindo que desenvolvedores
reutilizem componentes de software que residam em outras máquinas ou
plataformas.
Empregando serviços web como blocos de construção reutilizáveis, os
programadores podem-se concentrar em suas especialidades, sem ter de
implementar cada componente de uma aplicação.
Por exemplo, uma empresa que está desenvolvendo uma aplicação de
e-commerce pode assinar serviços web que processam pagamentos e autenticam
usuários, o que habilita o programador a se concentrar em outros aspectos mais
exclusivos daquela aplicação.
Em .NET, um serviço web é uma aplicação armazenada em uma máquina
que pode ser acessada por uma outra através de uma rede.
Em sua forma mais simples, um serviço web criado em .NET é uma
classe – ou um agrupamento lógico – de métodos de dados que simplificam a
organização do programa.
As classes de serviço web da .NET contêm certos métodos –
denominados métodos de serviços web – que são especificados como parte do web
service. Esses métodos podem ser invocados remotamente, usando RPC.
O web service é definido pela W3C como um sistema de software
projetado para fornecer INTEROPERABILIDADE entre máquinas em determinada rede.
1. A linguagem baseada em XML que
descreve o que um web service pode fazer, onde ele reside e como chamá-lo é
denominada:
R) WSDL
2. O protocolo baseado em XML para troca
de informação estruturada com web services em redes de computadores é chamado
de:
R) SOAP
3. A especificação para publicar e
localizar informações sobre web services denomina-se:
R) UDDI
Computação ubiqua, que tem como
foco operações voltadas para a tarefa, e não para a ferramenta. Nesse caso, a
computação está embutida em nosso dia a dia.
De acordo com Loureiro: A
computação ubiqua é um novo paradigma no qual dispositivos com capacidade de
processamento e comunicação são embutidos nos elementos do dia a dia, provendo
serviços de forma transparente aos usuários.
A computação ubíqua está
posicionada entre a computação móvel e a computação pervasiva, conforme
apresenta a figura ao lado:
Nesse tipo de computação,
há:
Integração entre mobilidade
e presença distribuída;
Inovação em interfaces –
tendência para as interfaces naturais;
Determinados problemas, tais
como de segurança, complexidade e
privacidade.
A computação ubíqua pode
ser aplicada nos seguintes sistemas:
·
Ambientes inteligentes;
·
nterfaces hands-free (sem as mãos) – reconhecimento de voz, liveboards,
pads e tabs;
·
Consciência de contexto – além da interação física do usuário a partir
da utilização de sensores;
·
Computação de vestir (wearable) – tecnologia que utiliza acessórios como
interfaces;
·
Computação sensível à posição;
·
Computação desagregada – reconfiguração automática;
·
Realidade aumentada – combinação de computadores wearable com
informações de sensores de posição;
·
Interfaces sensíveis a objeto – Radio-Frequency IDentification (RFID).
Exemplos
Veja um exemplo de
aplicação da computação ubíqua:
A computação em nuvens
consiste na utilização de recursos de processamento e armazenamento de
computadores compartilhados e interligados por meio da internet.
A cloud computing segue os
moldes da computação em grid. Nesse caso, o acesso aos dados e às aplicações é
permitido a partir de qualquer computador que tenha conexão com a internet,
independente de sua plataforma.
Clique aqui para ver uma
figura que apresenta as vantagens da computação em nuvem.
Serviços da computação em
Nuvens
Os tipos de serviços em
cloud computing podem ser classificados nos seguintes modelos:
Software as a Service
(SaaS) – Software como Serviço
Trata-se do uso de um
software através da internet. Em outras palavras, o usuário utiliza o software
como serviço sem a necessidade de aquisição ou instalação local.
São exemplos do modelo
SaaS:
Google
Docs;
HP
SaaS;
Microsoft
Sharepoint Online; IBM
SaaS.
Os tipos de serviços em
cloud computing podem ser classificados nos seguintes modelos:
Platform as a Service
(PaaS) – Plataforma como Serviço
Trata-se da utilização
apenas da plataforma como:
Um banco de
dados;
Um web service;
Serviços para
desenvolvimento, testes etc.
Normalmente, as aplicações
desenvolvidas em uma PaaS ficam vinculadas ao fornecedor.
São exemplos do modelo
PaaS: Windows Azure e Google App Engine.
Os tipos de serviços em
cloud computing podem ser classificados nos seguintes modelos:
Trata-se de ferramentas de
desenvolvimento utilizadas como:
Ferramentas
compartilhadas;
Ferramentas de
desenvolvimento web-based;
Serviços
baseados em mashup.
Os tipos de serviços em
cloud computing podem ser classificados nos seguintes modelos:
Infrastructure as a Service
(IaaS) – Infraestrutura como Serviço
Trata-se da entrega de
infraestrutura como serviço.
Em outras palavras, o foco
está na estrutura do hardware ou de máquinas virtuais, no armazenamento, o que
permite uma ampla diversidade de softwares.
São exemplos do modelo
IaaS:
Amazon EC2;
GoGrid.
Os tipos de serviços em
cloud computing podem ser classificados nos seguintes modelos:
Trata-se da solução
terceirizada em comunicação.
Os fornecedores desse tipo
de serviço são responsáveis pelo gerenciamento de hardwares e softwares,
entregando serviços como VoIP e serviços de mensagens instantâneas, além
da capacidade de gerenciar videoconferências.
Um exemplo do modelo CaaS é
o Microsoft Lync.
Existem quatro tipos de implementação em cloud computing,
quais sejam:
De acordo com o artigo da
Computeworld (2008), há sete princípios de segurança em uma rede em nuvem. São
eles:
Acesso privilegiado de usuários : A sensibilidade de
informações confidenciais nas empresas as obriga a controlar o acesso dos
usuários e a informação bem específica de quem terá privilégio de
administrador.
O objetivo é que esse
administrador possa controlar os referidos acessos.
Compliance com regulamentação: As empresas são
responsáveis pela segurança, pela integridade e pela confidencialidade de seus
próprios dados.
Sendo assim, os
fornecedores de cloud computing devem estar preparados para auditorias externas
e certificações de segurança.
Localização dos dados: A empresa que usa cloud provavelmente
não sabe onde os dados estão, de fato, armazenados – talvez nem o país no qual
as informações estejam guardadas.
Portanto, o fornecedor deve
estar disposto a se comprometer a armazenar e a processar dados em jurisdições
específicas, assumindo um compromisso – em contrato – de obedecer aos requerimentos
de privacidade que o país de origem da empresa exige.
Segregação dos dados: Geralmente, uma empresa divide um
ambiente com dados de diversos clientes.
Nesse caso, precisamos
entender o que é feito para a separação de dados e que tipo de criptografia é
seguro o suficiente para o funcionamento correto da aplicação.
Recuperação dos dados: O fornecedor em cloud deve saber onde
estão os dados da empresa e o que é preciso para recuperá-los em caso de
catástrofe.
Qualquer aplicação
que não faça réplica dos dados e da infraestrutura em diversas localidades
estará vulnerável à falha completa. Por
isso, é importante ter um plano de recuperação completo e um tempo estimado
para esse plano.
Apoio à investigação: A auditabilidade de atividades ilegais
pode-se tornar impossível em cloud computing, uma vez que há uma variação de
servidores em função do tempo em que estão localizados os acessos e os dados
dos usuários.
Diante disso, é importante
obter um compromisso contratual com a empresa fornecedora do serviço e uma
evidência de sucesso no passado para esse tipo de investigação.
Viabilidade em longo prazo: No mundo ideal, o fornecedor de cloud
computing jamais vai falir ou ser adquirido por uma empresa maior.
Por isso, a empresa
precisa garantir que seus dados estarão disponíveis caso o fornecedor de cloud
computing deixe de existir, ou seja, caso seja migrado para uma empresa maior.
Nesse sentido, é
importante haver um plano de recuperação de dados e um formato específico para
que esse plano possa ser utilizado em uma aplicação substituta.
1.São características da computação em
nuvem, EXCETO:
R) Baixa escalabilidade
2. O uso de um software através da
internet pode ser classificado como:
R) SaaS
O primeiro problema existe porque
nem todos os peers terão todo o conteúdo, pelo
menos inicialmente.
A técnica usada no BitTorrent é a
de que cada provedor de conteúdo possa criar uma
descrição de conteúdo – chamada
torrent.
A torrent é muito menor que o
conteúdo e é usada por um peer para verificar a
integridade dos dados que ele
baixa de outros peers. Outros usuários que querem
baixar o conteúdo precisam
primeiro obter a torrent, encontrando-a, digamos, em
uma página Web que anuncia o
conteúdo.
A torrent é apenas um arquivo, em
formato especificado, que contém dois tipos de
informação: o nome de um tracker e
os chuncks
O arquivo de torrent contém o
nome de cada chunk, dado como um hash
SHA-1 de 160 bits do chunk. Dado o tamanho dos chunks
e dos hashes, o arquivo de torrent é,
pelo menos, três ordens de
grandeza menor que o conteúdo, de modo que pode ser
transferido rapidamente.
Para realizar o download do
conteúdo descrito em uma torrent, primeiramente, um
peer entra em contato com o
tracker para a torrent. O tracker é um servidor que
mantém uma lista de todos os
outros peers que estão ativamente fazendo download
e upload do conteúdo. Esse
conjunto de peers é chamado de swarm.
Os membros do swarm entram
em contato com o tracker regularmente para
informar que ainda estão
ativos, bem como ao saírem do swarm. Quando um novo
peer entra em contato com o
tracker para se juntar ao swarm, o tracker lhe informa
sobre outros peers no
swarm.
Modelo de caching: esquema
básico de armazenamento em cache
O armazenamento em cache do
DFS poderia ser facilmente chamado de
memória virtual de rede.
Isso porque esse
armazenamento atua de modo semelhante à memória virtual
paginada por demanda,
exceto pelo fato de a memória de retaguarda não ser,
normalmente, um disco
local, e sim um servidor remoto.
O NFS permite que o espaço
de permuta seja montado remotamente. Dessa
forma, ele pode
implementar, realmente, a memória virtual sobre uma rede,
apesar da perda em
desempenho.
Caches em disco possuem uma
clara vantagem sobre os caches na memória
principal: eles são
confiáveis.
Se o cache for mantido em
memória volátil, em caso de queda do sistema,
modificações nos dados do
cache serão perdidas. Se os dados do cache forem
mantidos em disco, eles
ainda estarão ali durante a recuperação, e não será
preciso extraí-los
novamente.
Muitas implementações de
acesso remoto podem ser pensadas como híbridos
de armazenamento em cache e
serviço remoto.
No NFS, por exemplo, a
implementação é baseada em serviço remoto, mas é
ampliada, por razões de
desempenho, com o armazenamento em cache de
memória para clientes e
servidores.
O protocolo NFS e a maioria
das implementações não oferecem
armazenamento em cache de
disco. Implementações recentes do NFS no Solaris (a partir do Solaris 2.6)
incluem uma opção de armazenamento em
cache de disco no lado do
cliente: o sistema de arquivos cachefs.
Tão logo o cliente NFS leia
os blocos de um arquivo a partir do servidor, ele os
armazenará em cache na
memória, assim como em disco. Se a cópia da
memória for removida ou
mesmo se o sistema for reinicializado, o cache em
disco será referenciado.
Se um bloco requerido não
estiver em memória nem no cachefs em disco, uma
RPC será enviada ao
servidor para recuperar o bloco, que será gravado no
cache em disco e armazenado
no cache da memória para utilização por parte
do cliente.
Modelo de caching: política
de atualização de cache
A forma utilizada para
gravar blocos de dados modificados na cópia-mestra do
servidor tem implicação
direta sobre o desempenho e a confiabilidade do
sistema.
Conheça, a seguir, algumas
maneiras de gravar blocos de dados:
Write-through (gravação
direta)
A write-through (gravação
direta) é a forma mais simples de gravar os dados
diretamente no disco tão
logo sejam colocados em algum cache.
Sua vantagem é a
confiabilidade: poucas informações são perdidas quando um
sistema-cliente cai.
É necessário que cada
acesso de gravação espere até que as informações
sejam enviadas ao servidor,
o que provoca um fraco desempenho de gravação.
O armazenamento em cache
com gravação direta é equivalente ao uso do
serviço remoto para acessos
de gravação e à exploração do cache somente
para acessos de leitura.
Write-back (gravação
retardada)
Na write-back (gravação
retardada), as atualizações na cópia-mestra são
adiadas.
As modificações são
gravadas no cache para, então, serem gravadas no
servidor, em um momento
posterior.
Essa política tem duas
vantagens sobre a gravação direta, quais sejam:
Em primeiro lugar, como
as gravações são feitas no cache, os
acessos
de gravação completam-se
muito mais rapidamente;
Em segundo lugar, os
dados podem ser sobrepostos antes de serem
gravados de volta no
servidor – caso em que apenas a última
atualização precisa ser
completamente gravada.
Os esquemas de gravação
retardada introduzem problemas de confiabilidade,
pois dados não gravados são
perdidos sempre que uma máquina de usuário
cai.
As variações da política de
gravação retardada diferem quanto ao momento
em que os blocos de dados
modificados são descarregados para o servidor.
No NFS com cachefs, quando
as gravações são executadas no servidor, elas
também são executadas na
área de cache do disco local, para manter todas as
cópias consistentes.
Sendo assim, o NFS com
cachefs melhora o desempenho em relação ao NFS
padrão em uma solicitação
de leitura bem-sucedida do cache do cachefs, mas
diminui o desempenho para
solicitações de leitura ou gravação, com uma
falha no cache.
Write on close (gravação ao
encerrar a sessão)
Outra variação da gravação
retardada é gravar os dados de volta no servidor
quando o arquivo é fechado.
Essa política de gravação
ao encerrar a sessão (write on close) é utilizada no
Andrew File System (AFS).
Em caso de arquivos que
sejam abertos por curtos períodos ou raramente
modificados, a referida
política não reduz, de modo significativo, o tráfego na
rede.
A write on close requer que
o processo de fechamento aguarde enquanto o
arquivo está sendo gravado
por uma operação de gravação direta, o que reduz
as vantagens de desempenho
das gravações retardadas.
Para arquivos que fiquem
abertos por longos períodos e sejam modificados
com frequência, são claras
as vantagens de desempenho dessa política em
relação à gravação
retardada – com descargas mais frequentes.
Modelo de caching:
consistências
Uma máquina-cliente
enfrenta o problema de decidir se uma cópia dos dados
armazenada em cache local é
consistente com a cópia-mestra.
Se a máquina-cliente
determinar que seus dados no cache estejam
desatualizados, os acessos
não poderão mais ser atendidos para esses dados.
Sendo assim, uma cópia
atualizada dos dados precisará ser armazenada no
cache.
Existem duas abordagens
para verificar a validade de dados no cache, quais
sejam:
Abordagem iniciada pelo
cliente
Nesta abordagem, o cliente
inicia uma verificação de validade, na qual
contata o servidor, e
observa se os dados locais estão consistentes com a
cópia-mestra.
A frequência da verificação
de validade é o ponto-chave dessa abordagem e
determina a semântica de
consistência resultante.
Essa frequência pode variar
de uma verificação antes de cada acesso a uma
verificação somente no
primeiro acesso a um arquivo.
Dependendo de sua
frequência, a verificação de validade pode sobrecarregar
tanto a rede quanto o
servidor.
Abordagem iniciada pelo
servidor
Nesta abordagem, o servidor
registra, para cada cliente, os arquivos (ou
partes dos arquivos)
armazenados em seu cache. Quando o servidor detectar
uma inconsistência, ele
deverá reagir.
A ocorrência da
inconsistência pode ser causada quando dois clientes
diferentes, em modalidades
conflitantes, armazenam um arquivo em cache.
Se a semântica do UNIX for
implementada, poderemos resolver a
inconsistência fazendo o
servidor desempenhar um papel ativo.
O servidor deve ser
notificado sempre que um arquivo for aberto, e a
modalidade pretendida
(leitura ou gravação) deverá ser indicada para cada
abertura.
O servidor poderá agir,
então, quando detectar que um arquivo foi aberto
simultaneamente em modalidades
conflitantes, desabilitando o
armazenamento em cache para
esse arquivo em particular
Como os peers encorajam uns
aos outros para que façam upload do conteúdo
para outros, além do
download de conteúdo para eles mesmos?
No terceiro problema, os
nós da CDN são preparados exclusivamente para fornecer
conteúdo aos usuários. Os
nós P2P, por sua vez, não o são. Esses nós são os
computadores dos usuários,
que podem estar mais interessados em conseguir um
conteúdo específico do que
em ajudar outros usuários com seus downloads.
Os nós que capturam
recursos de um sistema sem contribuir com nada em troca são
chamados de free-riders ou
leechers. Se houver muitos deles, o sistema não
funcionará bem. Os
primeiros sistemas P2P eram conhecidos por hospedar os freeriders, de modo que
o BitTorrent procurou minimizá-los (SAROIU et al., 2003).
A técnica usada nos
clientes BitTorrent é recompensar os peers que mostram bom
comportamento de upload.
Cada peer seleciona aleatoriamente os outros,
capturando seus chunks
enquanto faz o upload de chunks para eles.
O peer continua a trocar
chunks apenas com um pequeno número de peers que
oferecem o desempenho de
download mais alto, embora também experimentem
aleatoriamente outros peers
para encontrar bons parceiros. Esse experimento
aleatório também permite
que os novos usuários obtenham chunks iniciais que
podem trocar com outros
peers. Os peers com os quais um nó está trocando chunks
são considerados como
unchoked.
Com o tempo, esse algoritmo
deverá combinar peers, uns com os outros, com upload
comparável e taxas de
download. Quanto mais um peer estiver contribuindo com os
outros, mais ele poderá
esperar em retorno.
Usar um conjunto de peers
também ajuda a saturar a largura de banda de um peer
para aumentar o desempenho.
Ao contrário, se um peer não estiver fazendo upload
de chunck para outros peers
ou se estiver fazendo isso muito lentamente, ele será,
mais cedo ou mais tarde,
cortado ou choked.
Evolução:
Primeiros computadores: grandes e caros.
Anos 50-60:
spooling, multiprogramação.
Início dos anos 60: sistemas time sharing.
Final dos anos 60 e início dos anos 70: surgimento de redes de computadores.
A partir dos anos 70: inicia-se a pesquisa em sistemas distribuídos.
Sistemas podem ser divididos em:
·
Fortemente acoplados - quando os processadores
compartilham uma mesma memória principal.
·
Fracamente acoplados – os diversos
processadores/estações presentes no sistema utilizam sua memória local
individualmente.
·
Sistemas centralizados - Multiprocessador de memória
compartilhada é um sistema de computador no qual duas ou mais CPUs compartilham
acesso total a uma memória principal comum. Multiprocessadores são populares e
atrativos, porque oferecem um modelo de comunicação simples, e a sincronização
é possível mediante o emprego de diversas técnicas bem definidas. Uma
desvantagem é que os multiprocessadores de grande porte são difíceis de
construir e, por isso, são caros.
·
Sistemas distribuídos - Uma solução alternativa que tem
sido empregada com sucesso para solucionar esse problema é a utilização de
multicomputadores, que são CPUs que não compartilham memória principal. Cada
CPU tem sua própria memória e é gerenciada por um sistema operacional
individualmente. Esses sistemas também são conhecidos como cluster – COWS
(cluster of workstations - aglomerados de estações de trabalho).
• Sistema distribuído permite uma
nova forma de fazer ciência
–Teoria -> experimentos
–Teoria -> simulações
•Vantagens
–Possibilidade de repetição de
eventos
–Manipulação de parâmetros
–Estudo de sistemas onde não há
teorias exatas
•Problemas
–Muito grandes: modelagem da
terra/clima, simulações de reservatórios de petróleo, problemas com grandes
escalas (cosmologia).
–Muito pequenos: projeto de
remédios, projetos de chips, biologia estrutural, física de partículas.
–Muito complexos: física de
partículas, dinâmica de fluidos, modelagem de comportamento de pessoas.
–Muito caros: produção e exploração
de petróleo, simulação de acidentes.
–Muito perigosos: tolerância a
falhas em aviões, teste de dispositivos nucleares, simulação de estratégias de
defesa.
PARALELISMO X COMPUTAÇÃO PARALELA
·
Paralelismo
ü Projeto de uma CPU
ü Projeto de uma arquitetura paralela
ü E/S sobreposta ao processamento
·
Computação paralela
ü Coleção de elementos de processamento
ü Trabalhando em conjunto para a realização de uma tarefa
Paralelismo
Dentro de um processador
1. Busca a informação
2. Decodifica Instrução
3. Busca Operandos
4. Executa Instrução
Clusters
Ø Definição:
Conjunto de computadores independentes conectados, usados como recurso
unificado para computação. Sistema com imagem única (SSI).
Ø Benefícios
o
Custo/benefício:
redução de custo para se obter processamento de alto desempenho.
o
Escalabilidade:
possibilidade de adição de novos computadores, sendo adicionados a medida que
cresça a carga.
o
Alto
Desempenho: possibilidade de resolver
problemas complexos através de programação e processamento paralelo.
o
Independência
de Fornecedores: utilização de hardware aberto, livre de uso de licenças.
o
Tolerância
a Falha: o aumento da confiabilidade do sistema como um todo, caso alguma parte
falhe.
Computação centralizada
·
Mainframe
Termo
utilizado para se referenciar a um grande computador, normalmente produzido por
uma grande empresa. O nome tem origem na forma com que estes computadores eram
construídos. Todos os componentes (processador, memória...) do computador
principal (main) são colocados em uma única estrutura (frame).
o
Características
ü Sistemas multiusuários
ü Sistemas proprietários ->
hardware, software, rede
ü Instalação e manutenção feita pelo
fabricante -> confiabilidade X custo
·
Microcomputadores e redes de
computadores
Ampliação
do parque computacional, em função de:
o
Processadores
mais rápidos e mais baratos.
o
Redes
mais rápidas e acessíveis.
o
Liberdade
de escolha.
o
Menor
custo de manutenção.
o
Necessidade
inerente de conectividade.
o
Aplicação
básica: compartilhamento de recursos.
Evolução: Os terminais foram sendo substituídos pelos primeiros
microcomputadores que começavam a ficar obsoletos. Em geral, o uso de um
programa emulador de terminais e de uma unidade de disquete era suficiente para
que um simples PC-XT executasse essa tarefa, uma vez que só precisaria executar
o emulador. A partir deste ponto, o micro passaria a se comportar como um
terminal. Em alguns casos, era necessário o uso de uma placa que
compatibilizasse a forma de comunicação serial entre os dois computadores.
·
Sistemas Distribuidos
Utilização
das redes de computadores para execução colaborativa e cooperativa de
aplicações e não somente para compartilhamento de recursos.
Sistemas Distribuidos = computadores
+ rede + aplicação
o
Conceito:
É um sistema em que os computadores estão conectados em rede e coordenam
suas ações através de troca de mensagens.
o
Denifição de sistema distribuido:
Ø Colouris: Um sistema no qual os componentes de hardware
ou software, localizados em computadores interligados em rede, se comunicam e
coordenam suas ações apenas enviado mensagens entre sí.
Ø Tanenbaum: Um sistema distribuido é
um conjundo de computadores independetes que se apresenta a seus usuários como
um sistema único e coerente.
Ø Siberschatz: Coleção de
processadores que não compartilham memória ou relógio.
o
Principais motivações: necessidade pelo compartilhamento
de recursos e
o
Características de um sistema
distribuído:
Ø baixo acoplamento e atrasos na
comunicação;
Ø processos em sistemas computacionais
distintos com probabilidade de falhas
Ø Comunicação geralmente não
confiável, onde existem atrasos, variação de atrasos, perdas e, em alguns
casos, baixas larguras de banda
Ø dificuldade em definir a ordem dos
eventos e estado global do sistema, uma vez que a comunicação acontece pela
troca de mensagens
Ø Ambiente geralmente marcado pela heterogeneidade
o
Comparação com sistemas
centralizados
Ø Vantagens
ü Melhor relação preço/desempenho
ü Capacidade de crescimento
incremental (escalabilidade)
ü T olerância a falhas
Ø Desvantagens
ü Falta de padronização para
desenvolvimento de software
ü Falta de uma divisão clara entre
sistema/aplicação
ü Latência e possibilidade de
congestionamento na rede
ü Redução da segurança
o
Desafios
da computação distribuida
Ø Ausência de fonte comum de tempo
(relógio global)
Ø Ausência de memória compartilhada
Ø Compartilhamento de recursos
Surgimento de Sistemas distribuidos: A medida que a velocidade e a confidencialidade
das redes de computadores aumentam, computadores do mundo inteiro estão cada
vez mais conectados.
A comunicação remota via rede,
originalmente reservada para grandes instalações de computadoes e ambientes
acadêmicos, tem sido amplamente empregada. Em sistemas distribuidos,
computadores remotos trabalham cooperativamente por meio da rede, de modo que
seja visto como única maquina local.
Embora ofereçam muitas vantagens em
relação a sistemas centralizados, os sistemas distribuidos podem ser complexos
e de difícil implementação e gerenciamento. Por exmplo, os sistemas
distribuidos tem de manipular atrados de comunicação e problemas de
confiabilidade. É muito difícil gerenciar falhas
de máquinas.
Desafios da Computação Distribuida
·
Concorrência: A execução
concorrente é uma característica intrínseca de um sistema distribuído, na qual
os processos disputam pelos recursos compartilhados.
·
Inexistência de
relógio global: A coordenação dos processos depende de uma noção
compartilhada do tempo em que as ações dos programas ocorrem.
·
Falhas
Independentes: Falhas na rede, nos sistemas ou nos processos demoram a ser
percebidas nos sistemas distribuídos.
Falácia da computação distribuida: Os sistemas
distribuidos são diferentes dos softwares tradicionais, porque seus componentes
estão dispersos em uma rede.
Peter Deustch
formulou esses erros como as seguintes
premissas falsas adotadas em aplicação distribuida:
ü A rede é confiável
ü A rede é segura
ü A rede é homogênia
ü A topología não
muda
ü A latência é zero
ü A largura de banda
é infinita
ü O custo de
transporte é zero
ü Há somente um
administrador
Atributos dos sistemas distribuidos
·
Latência: Tempo decorrido
entre o início de uma operação e seu término. O termo latência é usado,
normalmente, para comunicações entre partes de um sistema.
·
Taxa de
transmissão: Taxa que mede a capacidade de transmissão/recepção de
informações por unidade de tempo.
·
Speedup: Termo que significa
ganho relativo de velocidade ou desempenho. Como exemplo de speedup podemos
citar a razão dos tempos de execução sequencial e o paralelo.
·
Boottleneck: Gargalo de
rede.
·
Escalabilidade: Capacidade
de melhoria do desempenho do sistema distribuido conforme cresce o número de elementos processadores.
·
Balanceamento de
Carga: Característica que permite ao sistema distribuido dividir, adequadamente
suas tarefas de modo que um elemento processador não fique mais sobrecarregado
que os outros.
·
Migração de dados: Medida de produtifidade de um
sistema. Essa medida exprime, por unidade de tempo, a produção efetiva do
sistema em termos de tarefas, transações, operações.
·
Replicação:
Característica do sistema que dá maior ou menor certeza de que vai
funcionar a contento.
·
Transparência: capacidade de o sistema sobreviver
à falha de alguns de seus elementos.
·
Disponibilidade: Característica que indica quanto
tempo o sistema funcionará ininterruptamente sem ser afetado por falhas,
manutenção preventiva ou corretiva, etc.
·
Segurança: Garantia de o sistema fazer, de
maneira correta e para os usuários corretos, aquilo para o qual foi projetado.
·
Migração de tarefas: Transferencia da responsabilidade
de execução de uma tarefa de um elemento para outro.
·
Throughput: Transferência de dados de um elemento
processador para outro
·
Confiabilidade: Duplicação de recursos de um
elemento processador em outro.
·
Tolerância a falhas: Característica que esconde de
usuário ou aplicativos detalhes de funcionamento do sistema distribuido, de tal
forma que se tenha a impressào de que o sistema é centralizado.
Imagem única do sitema (SSI): É a propriedade de se ocultar a complexidade
envolvida em uma natureza distribuida e heterogência de recursos disponíveis
para os usuários e aplicações, de tal forma que estes visualizem o sistema como
um recurso único.
·
Benefícios:
Ø Os serviços podem ser requisitados a
partir de qualquer nó do sistema
Ø A localização de dispositivos
físicos pode ser totalmente transparente para o usuário
Ø O sitema apresenta disponibilidade
em seus serviços
Ø O sistema permite ao usuário
trabalhar com uma interface simplificada, com comandos que ajudem a administrar
o cluster por inteiro, como se fosse uma única máquina.
Ø O sistema reduz rescos em erros
operacionais e apresenta maior disponibilidade
Ø O sistema permite um modelo de
processos com espaço globalizado para balanceamento de carga
Ø O sistema permite que diversos
componentes de uma aplicação trabalhem, de forma cooperativa, para criar a
imagem de uma única aplicaçao no sistema
Ø Quanto a concorrencia, os usuário
não devem notar que existem outras pessoas utilizando o sistema.
O Brasil tem dois supercomputadores
na lista do ranking dos computadores mais velozes do mundo: TUPI, GALILEU
Intranet: Redes
corporativas que utilizam da tecnología e de infraestrutura de comunicação de
dados da internet. Essa são utilizadas
na comunicação interna da própria empresa e também na comunicação com outras
empresas.
Computação em grade: A tecnologia por trás da computação em grade é um conjunto de softwares
middleware que gerenciam recursos distribuidos e espalhados pela organização,
disponibilizando os servidores e eventualmente, os desktops da empresa. A idéia
básica é combinar os recursos disponíveis com as demandas computacionais das
empresas. Computação em grade é uma maneira bastante eficiente de maximinizar
recursos computacionais. Trata-se de uma consolidaçao virtual de servidores.
Computação Oportunista: Consiste em usar redes de
computadores para resolver problemas computacionais. Popularizou com o projeto
SET. Outro projeto é o BOINC.
Sistemas distribuídos e TI verde: A virtualização é a camada de abstração entre
sistemas de hardware de computador e do software que roda nesses sistemas,
proporcionando uma visão lógica dos recursos de computação. Trata-se de uma das formas de economizar
recursos e praticar TI verde! A virtualização trata de estender ou substituir
uma interface existente, de modo a imitar o comportamento de outro sistema. Uma
das razões mais importantes para introduzir a virtualização na década de 1970
foi permitir que softwares herdados (aplicações e sistemas operacionais)
executassem em hardwares de mainframe.
Virtualização e o sistema de conectividade: Essa conectividade exige dos administradores
que um conjunto grande e heterogêneo de computadores servidores execute (cada
um) diferentes aplicações utilizando diferentes recursos, que podem ser
acessadas por diversos clientes.
A virtualização pode contribuir
muito nesse sentido!
Em primeiro lugar, porque a
diversidade de plataformas e máquinas pode ser reduzida.
Em segundo lugar, porque cada
aplicação pode executar em sua própria máquina virtual, incluindo,
possivelmente, suas bibliotecas e o sistema operacional (ambos relacionados),
que estariam executando em uma plataforma comum
Supercomputadores e TI verde: Por décadas, a noção de performance tem sido
sinônimo de velocidade. Esse enfoque especial levou ao surgimento de
supercomputadores que consomem grandes quantidades de energia elétrica e
produzem tanto calor que exigem enormes instalações de refrigeração.
Falha Parcial: É uma das características do sistema
distribuido que distingue dos centralizados. Falha parcial pode acontecer
quando um componente em um sistema distribuido não funciona. Essa falha pode
afetar a operação adequada de outros componentes e, ao mesmo tempo, deixar
totalmente ilesos. A falha em sistemas não distribuidos quase sempre é total,
no sentido de que afeta todos os componentes e pode, facilmente, fazer o
sistema inteiro cair. O sistema distribuido deve tolerar falhas e continuar a
funcionar até certo ponto, mesmo na presença dessas falhas.
Tolerância a falhas: De acordo com Kopetz e Veríssimo, a confiabilidade abrange uma série de
requisitos úteis para sistemas distribuidos:
·
Disponibilidade: Consiste na propriedade de um
sistema estar pronto para ser usado imediatamente. Trata-se da probabilidade de
o sistema funcionar corretamente em qualquer momento determinado e estar
disponivel para executar suas funções. Ex: se um sistema é desligado duas
semanas em um mes tem alta confiabilidade, mas somente 96% de disponibilidade.
·
Confiabilidade:
Consiste na propriedade de um sistema poder funcionar continuamente sem
falhas. Essa confiabilidade é definida em termos de um intervalo de tempo, e
não de uma instante de tempo. Ex: se um sistema fica fora um milissegundo a cada
hora, terá disponibilidade de 99,99%, mas sua confiabilidade ainda será muito
baixa.
·
Segurança: Se um sistema deixar de funcionar
corretamente durante certo tempo, nada de catastrófico acontecerá. E o que acontece
com sistemas de controle de processos usados em usinas de energia nuclear ou
sistemas ara enviar pessoas ao espaço.
·
Capacidade de Manutenção: Consiste na facilidade com que um
sistema que falhou pode ser consertado. Com alta capacidade de manutenção podemos
também ter alta disponibilidade.
O defeito acontece quando o sistema não pode cumprir o que foi
especificado ou prometido.
O erro, por sua vez, representa o estado de um sistema que pode levar
a uma falha.
Tipos de Falhas
As falhas são classificadas como:
·
Transientes: As falhas transientes ocorrem uma
vez, depois, desaparecem. Se a operação for repetida, a falha não acontecerá
novamente. Por exemplo, um pássaro voando pelo feixe de um transmissor de
microondas pode causar perda de bits em alguma rede.
·
Intermitentes: As falhas intermitentes ocorrem e
desaparecem por sua própria vontade. Depois, essas falhas reaparecem e assim
por diante. Por exemplo, um conector com um contato frouxo causará, muitas
vezes, uma falha intermitente.
·
Permanentes: As falhas permanentes continuarão a
existir até que o componente faltoso seja substituído. É o caso dos chips
queimados e dos bugs de software.
Modelos de falhas
Diferentes tipos de
falhas
|
|
Tipo de falha
|
Descrição
|
Falha por queda
|
O
servidor para de funcionar, mas estava funcionando corretamente
|
Falha
por omissão:
Omissão de recebimento; Omissão de envio |
O
servidor não consegue responder a requisições que chegam
|
Falha de temporização
|
A
resposta do servidor encontra-se for a do intervalo de tempo
|
Falha
de Resposta:
Falha de valor Falha de transição de estado |
A
resposta do servidor está incorreta
O valor da resposta está errado. |
Falha Arbitrária
|
Um
servidor pode produzir resposas arbitrárias em momentos arbitrários.
|
Modelo de falhas em sistemas distribuidos
·
Falha por queda: Um aspecto importante desta falha
está baseado de que, uma vez que o servidor para, nada mais se ouve dele. Por
exemplo quando o sistema operacional trava e para de funcionar.
·
Falha por omissão: Várias são as possibilidade de erro
na falha por omissão. Podemos indentificá-la, por exemplo, no caso em que a
conexão entre um cliente e um servidor foi estabelecida corretamente, mas não
havia nenhum thread ouvindo as requisições que chegavam. Falha por omissão de
recebimento, em geral, não afeta o estado corrente do servidor, porque este não
fica ciente de que qualquer mensagem foi enviada a ele/ Por exemplo quando o
buffer de envio transborda e o servidor não está preparado para tal situação.
·
Falha de temporização: A resposta do servidor se encontra for a do intervalo
de tempo. Pois, se o fornecimento de daods for realizado muito cedo, poderá
causar problemas para um receptor se não houver espaço de buffer suficiente
para armazenar todos os dados que estão sendo recebidos.
·
Falhas Arbitrárias: Conhecidas também como bizantinas, são falhas mais sérias. Em
particular, um servidor pode estar produzindo saidas que nunca deveria ter
produzido, mas que não podem ser detectadas como incorretas. Requisito importante quando se trata de
sistemas confiáveis.
·
Falha de Resposta: É um tipo sério de falha. Ela pode ocorrer de
duas maneiras sejam:
o
Falha de Valor: quando falha um mecanismo de busca
que retorna sistematicamente páginas da web não relacionadas com qualquer uma
das palavras de busca usadas.
o
Falha de transição de estado: Quando um servidor recebe uma
mensagem que não pode reconhecer, se não for tomada nenhuma providência para
manipular tal mensagem, acontecerá uma galha de transição de estado.
Procedência do Compilador
Veja, a seguir, algumas técnicas de
tratamento:
1. Mascaramento de falhas por redundância: Se um sistema deve ser tolerante a falhas, o
melhor que ele pode fazer é tentar ocultar de outros processos a ocorrência de
falhas. A tecnica fundamental para mascarar falhas é usar redundância. Os três
tipos de redundância são:
Ø Redundância de Informação: Os bits extra são adicionados para permitir a recuperação de bits
deteriorados. Por exemplo, codigo de Hamming pode ser adicionado a dados
transmitidos para recuperá-los de ruido na linha de transmissão.
Ø Redundância de Tempo: Uma ação é realizada, e se for preciso, essa ação será executada
novamente. Transações (banco de dados) usam essa abordagem. Se uma transação
for abortada, ela pode ser refeita sem causar nenhum dano. Ë util para falhas
transientes ou intermitentes.
Ø Redundância Física: São adicionados equipamentos ou
processoas extras para possibilitar que o sistema como um todo tolere a perda
ou o mau funcionamento de alguns componentes. A redundância física pode ser
feita em hardware ou em software.
2.
Mascaramento de falhas e replicação:
Grupos de processos
fazem parte da solução para contruir sistemas tolerantes a falha. Em
particular, ter um grupo de processos idênticos permite-nos mascarar um ou mais
processos faltosos àquele grupo. Podemos replicar processos e organizá-lo em um
grupo para substituir um único processo (vulnerável) por um grupo (tolerante à
falha).
De
modo geral, em casos de tolerância a falha, a replicação ;e baseada na forma de
um protocolo de primário e backup. Quando um servidor primário cai, os backups
executam algúm algoritmo de eleição para escolher o novo primário.
3.
Acordo em sistemas com falha: Organizar processos replicados em um
grupo, ajuda a aumentar a tolerância à falha. Em geral, as coisas tornam-se
mais complicadas se exigimos que um grupo de processos chegue a um acordo, o
que é necessário em muitos casos.
O
objetivo feral de algoritmos de acordo distribuidos é que todos os processos
que não apresentam falha cheguem a um consenso sobre alguma questão e
estabeleçam esse consenso dentro de um número finito de etapas.
4. Detecção de falha: A detecção de falhas é uma das bases da tolerância à falha em sistemas
distribuídos.
No
caso de um grupo de processos, os sistemas devem ser capazes de decidir quem ainda
é um membro e quem não é, isto é, o sistema deve ser capaz de detectar quando
um membro de um grupo falhou. Quando se trata de detectar falhas de processos,
há, essencialmente, dois mecanismos:
ü Os processos enviam as mensagens
ativamente uns aos outros;
ü Os processos esperam passivamente
pela entrada de mensagens de processos diferentes.
5.
Recuperação: Uma
vez ocorrida a falha, é essencial que o processo em que a mesma aconteceu se
possa recuperar para um estado correto. A recuperação de um erro é fundamental
para a tolerância à falha! É bom lembrar que um erro é parte de um sistema que
pode levar a falha. A idéria geral de recuperação de erro é substituir um
estado errônio para um estado livre de erros.
Formas de recuperação de erro: Existem
duas formas de recuperação de erro, quais sejam:
·
Recuperação
Retroativa: É trazer o sistema de seu estado com o erro
presente para um estado anterior, que estava correto.
Para fazer isso, é necessário
registrar o estado do sistema de tempos em tempos e restaurar tal estado
registado quando ocorrer o erro.
·
Recuperação
para a frente: Quando o sistema entra em um estado de erro, em
vez de retroagir para estado anterior correspondente a um ponto de verificação,
realizá-se uma tentativa para levar o sistema a um novo estado correto, a
partir do qual ele possa continuar a executar.
O principal problema dos mecanismos de recuperação
para frente é que precisamos saber, de antemão, quais erros podem ocorrer. Só
assim, é possível corrigir esses erros e passar para um novo estado.
A detecção de falha é uma base da
tolerância a falha em sistemas distribuidos.
Taxonomia de Flynn: O
esque consistia de quatro categorias baseadas em tipos diferentes de fluxos
usados por processadores. Um processador
aceita dois fluxos: um fluxo de instruções e um fluxo de dados.
Monoprocessador (SISD) – Único
fluxo de dados e instrução. Trata-se da classificação do tipo mais simples: são
monoprocessadores tradicionais, nos quis um único processador busca uma
instrução por vez e a executa sobre um único item de dado. Podemos citar a
arquitetura sequencial e a maquina de von-neumann.
Máquina Teórica (MISD) – Multiplo
fluxo de instrução e único de dados. Esses tipos de computadores não são
usados. Uma arquitetura MISD teria várias unidades de processamento que agiriam
sobre um fluxo único de dados. Cada unidade executaria uma instrução diferente
nos dados e passaria o resultado para a próxima unidade.
Máquinas Setorias (SIMD) – Único fluxo de instrução e multiplo fluxo de dados. Esse computadores emitem instruções que agem
sobre vários itens de dados. Um computador SIMD consiste em uma ou mais
unidades de processamento.
Sistemas Distribuidos (MIMD) – Múltiplos fluxos de dados e instrução. Trata-se de multiprocessadores, nos
quais as unidades processadoras são completamente independetes e operam sobre
fluxo de instruções separados. Entretando, esses sistemas normalmente contêm
hardware que permite que os processadores se sincronizem uns com os outros
quando necessário, como no caso de acessarem um dispositivo periférico
compartilhado. Subdividido em fortemenet
acoplado e fracamente acoplado.
Programação distribuida pode ser :
·
Sequencial: composta por um conjunto de
instruções que são executadas sequencialmente
·
Concorrente: Permite execução concorrente de
tarefas dentro de um mesmo processo ou entre processos que compartilham
recursos.
·
Paralela: Pressupõe a existencia de mais de
uma CPU, pois é destinada à execução simultânea de tarefas de um mesmo
processo.
Execução de uma tarefa: Existem
3 maneiras de executar uma tarefa de forma mais rápida, quais sejam:
·
Aumento
da velocidade da CPU: Algumas limitações estão
associadas à aquisição de CPUs com maior poder de processamento, como o aumento
de seu custo e a previsão para a velocidade dos processadores duplicarem a cada
18 meses (Lei de Moore), que tem sido mantida até os dias atuais. Mesmo com o aumento da frequência das CPUs, há
a possibilidade de essas não atenderem à solução de alguns problemas.
·
Otimização
do Algoritmo: Geralmente, conseguimos aumentar o desempenho de
um sistema com a melhora do algoritmo. Entretanto, esse sistema pode ser
comprometido quando não há uma solução determinística para o problema.
·
Colaboração:
Quando pensamos em trabalhar com colaboração, devemos atentar para a
diferença entre paralelismo e concorrência. Veja:
Ø
Paralelismo - Execução de uma tarefa em mais de
uma CPU (os processadores colaboram para execução dessa tarefa);
Ø
Concorrência – Os processos disputam CPUs (uma
ou mais).
Aspectos técnicos da programação
distribuida
1.
Interação da aplicação e do usuário com o
ambiente distribuído em níveis diferentes
2.
Suporte a plataforma heterogêneas através de uma
camada de software entre kernel e a aplicação (middleware)
3.
Problemas como custo e carência de produtos de
software adequados
4.
Programação paralela, utilizando bibliotecas de
troca de mensagem (como, por exemplo, o MPI e o PVM) ou bibliotecas baseadas em
memória compartilhada (como, por exemplo, Pthreads).
Os
modelos de sistemas distribuidos podem ser classificados como:
·
Arquiteturais:
Aqueles que definem a forma como os componentes dos sistemas interagem.
·
Fundamentais:
Aqueles que definem o comportamento e as propriedades dos componentes.
Modelos de Arquitetura de
Sistemas Distribuídos
A
maior preocupação é tornar o sistema:
·
Confiável
·
Gerenciável
·
Adptável
·
Rentável
Em
seguida, o referido modelo considera:
·
O posicionamento dos componentes em uma rede de
computadores, buscando definir padrões para a distribuição de dados e da carga
de trabalho.
·
Os inter-relacionamentos entre os componentes,
isto é, seus papéis funcionais e os padrões de comunicação entre eles.
Características dos modelos de
arquitetura:
Os
modelos de arquitetura de um sistema distribuído apresentam estrutura em
camadas de software de diferentes níveis de abstração, quais sejam: plataforma
e middleware.
Os
modelos de arquitetura classificam-se como:
• Cliente/servidor;
• Peer-to-peer;
• De variações.
Requisitos de projetos dos modelos de arquitetura
·
Desempenho:
Os desafios decorrentes da distribuição de recursos excedem a
necessidade de gerenciamento das atualizações concorrentes. Os principais
problemas associados a limitação finita da capacidade de recursos de
processamento e de comunicação são: reatividade, throughput e balanceamento de
carga.
·
Qualidade
de serviço: As principais propriedades não funcionais dos
sistemas que afetam a qualidade dos serviços fornecidos aos clientes são:
o
Confiabilidade
o
Segurança
o
Desempenho
o
Adaptalidade
o
Disponibilidade
·
Replicação:
os problemas de desempenho podem ser (em parte) solucionados através do
uso de replicação de dados.
·
Dependabilidade:
Pode ser definida como correção, segurança e confiabilidade. Trata-se de
um requisito necessário a maior parte dos domínios da aplicação.
1. É uma desvantagem dos
sistemas distribuídos quando comparado aos sistemas centralizados:
R) Possibilidade de congestionamento
na rede
2. É uma vantagem dos
sistemas distribuídos quando comparado aos sistemas centralizados:
R) Relação custo/benefício
3. O termo
escalabilidade por ser definido como:
R) Possibilidade de inclusão de novos
componentes, que sejam adicionados à medida que cresça a carga de trabalho.
4. Dentre os vários
tipos de transparência tratados na nossa aula, qual delas oculta a diferença na
representação de dados e no modo de acesso a um recurso:
R)
De acesso
5.
Indique,
a seguir, qual é a característica que permite ao sistema distribuído dividir,
adequadamente, suas tarefas, de modo que um elemento processador não fique mais
sobrecarregado que os outros:
R) Balanceamento de Carga
6.
Assinale,
a seguir, a opção que apresenta uma das oito falácias formuladas por Peter
Deustch:
R) A topologia é estática.
7.
Não
é considerado como uma falha de resposta:
R) O servidor não responde às requisições.
8.
É
considerada uma redundância física para o tratamento de falhas:
R) Adição de equipamentos extras
9.
A
transmissão de mensagem multicast é considerada:
R) ordenada, assíncrona e com atraso limitado.
10. As formas de executar
mais rapidamente uma tarefa são:
I.
Trabalhar mais
rápido.
II.
Trabalhar de forma
otimizada.
III.
IV. Trabalhar com
colaboração.
11. De acordo com a classificação
de arquiteturas de acesso à memória, assinale a opção que indica a sigla
INCORRETA:
R) Acesso não
uniforme à memória com cache coerente – NUMA.
12. De acordo com a
classificação de Flynn, assinale a opção que indica a sigla CORRETA:
R) Computadores de
fluxo múltiplo de instruções e fluxo múltiplo de dados – MIMD.
13. Classificação de
Flynn para os computadores de fluxo único de instruções e fluxo único de dados:
R) SISD
14. Arquitetura de
multiprocessadores com acesso não uniforme à memória.
R) NUMA
15. Classificação de
Flynn para os computadores de fluxo único de instruções e fluxo multiplo de
dados
R) SIMD
16. O aplicativo que começa ativamente o contato é
chamado de cliente, enquanto o
aplicativo que espera passivamente por contato é denominado servidor.
17. Em
geral, a interação cliente-servidor tem as mesmas características. Entretanto o
software cliente:
R) É
uma aplicação qualquer que se tornará um cliente temporariamente, quando o
acesso remoto for necessário.
Executa
localmente no computador pessoal de um usuário.
É
diretamente invocado por um usuário e executa somente para uma sessão.
18. Quando
um sistema permite que múltiplos aplicativos estejam ativos ao mesmo tempo,
podemos afirmar que suporta:
R)
Concorrência
19. Quando
os desafios decorrentes da distribuição de recursos excedem a necessidade de
gerenciamento das atualizações concorrentes, os principais problemas associados
à limitação finita da capacidade de recursos de processamento e de comunicação
são:
R) Reatividade,
throughput e balanceamento de carga.
No hay comentarios:
Publicar un comentario