Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
1
3.3.3 Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3.4 Primitivas de troca de mensagens . . . . . . . . . . . . . . . . 17
3.3.4.1 Síncronas e assíncronas (bloqueadas e não-bloqueadas) 18
3.3.4.2 Uso de buer . . . . . . . . . . . . . . . . . . . . . . 18
3.3.4.3 Conáveis e não-conáveis . . . . . . . . . . . . . . 19
3.4 Chamada remota a procedimento . . . . . . . . . . . . . . . . . . . . 20
3.4.1 Problemas com a chamada remota a procedimento . . . . . . 21
3.4.1.1 Espaços de endereçamento diferentes . . . . . . . . . 21
3.4.1.2 Passagem de ponteiros . . . . . . . . . . . . . . . . . 21
3.4.1.3 Negação de serviço . . . . . . . . . . . . . . . . . . . 21
3.5 Comunicação em Grupo . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5.2 Tipos de grupos . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5.3 Controle dos membros do grupo . . . . . . . . . . . . . . . . 24
3.5.4 Ordenação de mensagens . . . . . . . . . . . . . . . . . . . . 24
3.5.5 Escalabilidade na comunicação grupal . . . . . . . . . . . . . 25
3.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2
6 Sistemas de arquivos distribuídos 38
6.1 O projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.1.1 O serviço de arquivos . . . . . . . . . . . . . . . . . . . . . . 38
6.1.2 O servidor de diretórios . . . . . . . . . . . . . . . . . . . . . 39
6.1.2.1 Identicação transparente . . . . . . . . . . . . . . . 39
6.1.2.2 Identicação em dois níveis . . . . . . . . . . . . . . 39
6.1.3 Compartilhamento de arquivos . . . . . . . . . . . . . . . . . 40
6.2 Implementação de um sistema de arquivos . . . . . . . . . . . . . . . 40
6.2.1 Utilização de arquivos . . . . . . . . . . . . . . . . . . . . . . 40
6.2.2 Estrutura do sistema . . . . . . . . . . . . . . . . . . . . . . . 41
6.2.3 Armazenamento em cache . . . . . . . . . . . . . . . . . . . . 41
6.2.4 Replicação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.3 Tendências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.4 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3
Capítulo 1
4
1.2.1 Multiprocessador
• Sistema fortemente acoplado;
• Memória compartilhada;
• Uso de memórias cache em cada UCP, o que acelera a performance, mas traz
novos problemas, como a coerência do cache.
5
Cruzado comutado:
• Matriz de interconexão;
• Uso de comutadores;
Rede Ômega:
(n . log2 n)
• Menos comutadores: n processadores = 2 comutadores.
6
1.2.2 Multicomputador
Sistema fracamente acoplado;
7
Capítulo 2
• Operações de E/S;
• Comunicação;
• Detecção de erros;
• Alocação de Recursos;
• Proteção.
3. Recursos centralizados
8
2.2.1 Características
• Compartilhamento de recursos
2.2.2 Objetivos
• Virtualizar os recursos do hardware
• Sincronizar atividades
9
2.3.1 Características
• Implementação relativamente simples
2.3.2 Objetivos
• Disponibilidade de recursos através de um meio em comum.
• Economia de gastos.
10
2.4.1 Denições
Tanenbaum: Um sistema distribuído é uma coleção de computadores independen-
tes que parecem ao usuário como um único computador.
Lamport: Um sistema distribuído é aquele em que eu não posso fazer meu traba-
lho, pois uma máquina que eu nem conheço, não sei onde está, e nunca ouvi
falar encontra-se fora do ar.
2.4.2 Características
• Construção de um ambiente computacional virtual
2.4.3 Objetivos
O SO distribuído deve:
2.4.4 Vantagens
1. Economia: Aproveitar recursos ociosos; É mais barato ter vários processa-
dores interconectados do que um supercomputador;
11
3. Tolerância a falhas: em caso de falha de uma máquina, o sistema pode
sobreviver, mesmo com desempenho degradado;
2.4.5 Desvantagens
1. Aplicações mais complexas: Pouco software de alto nível disponível para
sistemas distribuídos;
Paralelismo: atividades podem ocorrer em paralelo sem que o usuário saiba (falta
muito ainda para ser atingido).
2.5.2 Flexibilidade
O sistema é exível quando a inserção de novos módulos é uma tarefa simples. No
caso de sistemas operacionais distribuídos, o kernel deve ser exível a ponto de
tornar essa tarefa o menos custosa. Uma das propostas é o uso de microkernel.
O microkernel implementa poucas funções, fornecendo em princípio quatro serviços
básicos:
O uso de microkernel pode ser uma opção interessante, pois a inserção de módu-
los, no nível do usuário, é uma tarefa mais simples do que em um kernel do tipo
monolítico.
12
2.5.3 Conabilidade
Alguns aspectos da conabilidade são:
2.5.4 Desempenho
Pode-se considerar como se fosse sinônimo de velocidade.
• Utilização do sistema
2.5.5 Escalabilidade
Suporta o aumento dos recursos e usuários mantendo um desempenho satisfatório.
Os sistemas distribuídos precisariam se adaptar a possibilidade de termos ambientes
com centenas ou milhares de processadores. Para isso, deve-se evitar:
Ou seja, tudo que é centralizado deve ser evitado, sob pena de criar uma sobrecarga
desnecessária no sistema.
Deve-se usar algoritmos descentralizados, que possuem as seguintes caracterís-
ticas:
13
Gerência de
Gerência de processos
Centralizado recursos
Memória, Dispositivos
Virtualização
Tipo Serviços Objetivos
14
Capítulo 3
Comunicação em sistemas
distribuídos
3.1 Introdução
A grande diferença entre um sistema distribuído e um sistema tradicional é a
implementação da comunicação entre processos.
15
• Modelo para comunicação num sistema distribuído - baseado num protocolo
não-orientado a conexão: solicitação/resposta. O cliente faz uma solicita-
ção, e o servidor envia uma resposta.
3.3.1 Vantagens
Simplicidade: não há a sobrecarga de informação gerada por várias camadas de
comunicação. A comunicação é direta.
3.3.2 Exemplo
1. Dois processos, um servidor e um cliente.
3. Tipos de operação:
4. Códigos de erro:
(a) Ok
5. Formato da mensagem:
16
(e) Onde começa a mexer no arquivo (posição)
(f ) Código de erro
Com esse conjunto de informações, temos um protocolo bem simples, mas que
possibilita a troca de mensagens entre processos-servidores e processos-clientes.
3.3.3 Endereçamento
Como identicar o processo-cliente? Em que máquina ele estará?
17
3.3.4.1 Síncronas e assíncronas (bloqueadas e não-bloqueadas)
• Uma primitiva bloqueada (ou síncrona ) trava o processo que está enviando a
mensagem, até que a operação esteja concluída.
2. O uso de buer permite que a mensagem que armazenada, para que quando
ela for solicitada, será prontamente entregue. Dá-se um prazo para que essa
mensagem seja resgatada no buer, e se esse prazo estourar, a mensagem é
descartada. Cada mensagem que entrar no nó, com um endereço referente a
um processo, é colocado num buer, e aguarda ser resgatada. Funciona melhor
do que a implementação anterior, mas requer uma gerência dos buers, e deve-
se lembrar que os buers tem um tamanho nito de espaço em memória para
armazenamento. Uma maneira é evitar que um processo mande mensagem se
o buer que irá recebê-la estiver lotado.
3. Uma terceira maneira é não enviar a conrmação, mas deixar que a resposta
seja a conrmação do envio da mensagem original. Bloqueia-se o cliente,
e enquanto não chegar a conrmação, nada feito. Simples, mas não há a
conrmação do recebimento da resposta (servidor para o cliente).
19
contador de tempo. Se o servidor aprontar a resposta a tempo, a própria
resposta será a conrmação. Se não, envia-se a conrmação, e posteriormente
a resposta. Dessa forma, no melhor caso teremos 2 mensagens trocadas. No
pior caso, serão 3 mensagens sendo trocadas.
20
8. O kernel do servidor envia a mensagem ao kernel do cliente.
Primeiro, precisamos ver quais são as possibilidades de falhas que temos no sistema,
e elas são:
21
O cliente não consegue achar o servidor Nesse caso, teremos que ter um
mecanismo para buscar o servidor, e retornar alguma informação se ele está fora do
ar. O servidor pode não existir, ou não ser compatível com aquele cliente. Daí, o
mecanismo deve checar isso.
Mas o mecanismo que checa a existência do servidor pode gerar uma exceção.
Algumas linguagens de programação tem maneiras de facilitar o trabalho do pro-
gramador, para ter rotinas que tratem tais exceções. Infelizmente, não é a via de
regra, e em muitas, o programador tem que prever aonde a exceção vai ocorrer no
código. Nesse caso, da não-existência do servidor, o cliente terá que procurar outro
servidor que o responda.
2. O cliente faz uma nova ligação com outro servidor, e faça a operação nova-
mente.
O cliente sai do ar logo após ter enviado uma solicitação de serviço Caiu
o cliente. O processamento feito pelo servidor ca então órfão. Como resolver?
Existem quatro propostas de solução:
22
2. O cliente saiu do ar e reiniciou. Quando ele volta, manda uma mensagem
para toda a rede anunciando o seu retorno, para que os processamentos órfãos
relacionados a ele, e que sejam anteriores ao atual estágio, sejam eliminados.
3. Uma outra maneira, aproveitando a idéia acima, é que, quando chega a men-
sagem do cliente solicitando o descarte, o servidor verica se o proprietário
está disponível. Se não estiver, ele descarta o processamento.
4. Na última maneira, uma fatia de tempo T é dada para cada chamada remota,
para que ela possa trabalhar. Se não der tempo para concluir, ela deve solicitar
mais uma fatia de tempo. Mas, se houver uma queda, o servidor espera pela
passagem de uma fatia de tempo T. Assim, todos os procedimentos órfãos
terão sido eliminados.
3.5.1 Introdução
Um grupo é um conjunto de processos que agem juntos, de uma maneira especi-
cada pelo sistema ou por um usuário. Os grupos são dinâmicos, e processos podem
entrar ou sair de grupos facilmente.
A idéia é que o conceito de grupo seja uma abstração de conjuntos de processos,
para que seja mais fácil para o transmissor enviar a mensagem. Logo, ele só precisa
disparar uma mensagem para um grupo.
Em termos físicos, depende principalmente de hardware. Por exemplo, um en-
dereço de rede especíco para o grupo permitiria o cliente enviar uma mensagem a
esse endereço, e todos os servidores associados recebê-la ( multicasting).
Em redes que não temos multicasting, a solução é apelar para o broadcasting,
que consiste em disparar a mensagem para todas as máquinas da rede. Caso a
mensagem não seja de interesse da máquina que a recebeu, ela é descartada. Queira
ou não, essa alternativa acaba acarretando uma sobrecarga desnecessária na rede.
Em último caso, o sistema pode usar o unicasting, que é basicamente o trans-
missor enviando a mensagem para cada membro do grupo. É uma alternativa cara
computacionalmente, e deve ser evitada.
23
2. Grupo aberto: Qualquer cliente pode enviar mensagens para o grupo. A noção
de servidores replicados é útil para grupos abertos.
3. Grupo igualitário: Todos os processos são iguais. São simétricos, e mesmo que
um processo falhe, o sistema continua rodando. Em compensação, a tomada
de decisão é mais complicada.
Uma maneira simples e eciente é fazer com que as mensagens sejam expedidas na
mesma ordem em que foram enviadas. Logo, toda mensagem interna do grupo é
enviada a todos os membros do grupo. Assim, todos recebem-na, e temos o que foi
convencionado chamar ordenação em tempo global.
24
3.5.5 Escalabilidade na comunicação grupal
Muitos algoritmos funcionam bem em sistemas distribuídos montados em cima de
redes locais, com poucos nós. Mas, e como caria a comunicação se expandirmos
o sistema distribuído, englobando centenas ou milhares de componentes? E se
forem várias redes locais interligadas? Pior, e se essas redes estiverem espalhadas
geogracamente?
3.6 Resumo
1. A diferença básica entre os sistemas operacionais tradicionais e os distribuí-
dos consiste na importância em que a comunicação tem entre os sistemas
distribuídos.
4. Apesar dela ser uma proposta muito interessante, também tem problemas,
como:
25
Capítulo 4
Sincronização em sistemas
distribuídos
Em sistemas com um processador, os problemas ligados a regiões críticas, exclusão
mútua e outras questões sobre sincronização são resolvidas com o uso de semáforos
e monitores. Mas, em sistemas distribuídos, é inviável, pois pressupõe a existência
de memória compartilhada, o que não ocorre aqui.
Veremos então os mesmos problemas anteriores, agora em sistemas distribuídos,
e alguns novos.
26
mínimas, mas acumulativas. Logo, depois de um intervalo de tempo razoavelmente
longo, essas discrepâncias serão visivelmente perceptíveis.
Uma solução seria sincronizar os relógios, para termos um tempo único. Isso é
possível, e existem algoritmos para isso. A idéia inicial é que o sincronismo não
precisa ser absoluto. O que vale é que, entre dois ou mais processos que interagem
entre si, eles estejam sincronizados. Isso é o que chamamos de relógios lógicos.
Os relógios reais são os relógios físicos. Impõe-se uma restrição, para evitar que
haja uma discrepância muito grande entre os relógios, lógicos e físicos.
Para sincronizar, usa-se a relação a → b, que quer dizer a acontece antes de b .
Isso é o que chamamos acontecimento-anterioridade. Para ocorrer essa relação,
deve-se ter que:
27
4.1.2 Algoritmos para sincronização de relógios
Existem diversos servidores de hora disponíveis na Internet, que se comunicam
através do protocolo NTP (Network Time Protocol), que usa o protocolo de trans-
porte UDP para estabelecer a conexão.
Os algoritmos para sincronização de relógios são usados para sincronizar os re-
lógios do sistema distribuído com os servidores de hora disponíveis localmente ou
via Internet. Mas, se nenhum nó do sistema distribuído tem como acertar a hora,
o jeito é cada nó cuidar do seu próprio tempo, e todas as máquinas se falam para
manter a menor discrepância possível entre os seus relógios.
Existem alguns algoritmos propostos, onde o servidor de hora é passivo (res-
ponde requisições de hora) ou ativo (envia mensagens às máquinas para que elas
acertem a hora), centralizados (um servidor de hora) ou descentralizados (várias
máquinas espalhadas), entre outras variações.
28
4.2.2.1 Exemplo
1. São 3 processos (0, 1 e 2).
3. O processo 1 não pretende entrar na região crítica, logo ele manda OK para
os outros 2.
Em caso de conito, ganha o processo que enviou a mensagem com o menor tempo
armazenado. Dessa maneira, não temos starvation nem deadlock, o que é bom.
Em compensação, todo processo é um ponto de falha: Se ele não responder a
uma das mensagens, isso bloqueia os outros processos subsequentes. Além disso,
teremos muito mais tráfego na rede, já que todos os processos participam de todas
as decisões.
Uma maneira para evitar o silêncio de um processo é solicitar um aviso de
recebimento por parte dele. Se não chegar o aviso, é porque o processo tem algum
problema, e os outros podem descartá-lo.
Outro problema é que a comunicação é grupal. Logo, cada processo tem que ter
a lista dos membros do grupo, e sempre atualizada. Isso demanda mais tráfego.
Na prática, esse algoritmo acaba sendo mais lento e complexo do que o algo-
ritmo centralizado, e ainda mais sujeito a problemas no caso de grupos grandes de
processos.
O processo que detém o token pode entrar em uma região crítica, fazer tudo o
que precisa ser feito, e depois sair. O mesmo não pode usar o token para entrar
numa segunda região crítica, apenas uma de cada vez. Isso faz evitar a ocorrência
29
de starvation, já que, no pior dos casos, um processo terá que esperar todos os
outros entrarem e saírem para ele poder entrar.
Alguns problemas possíveis são:
Coordenador fora
Centralizado 3 2
do ar
Qualquer processo
Descentralizado 2(n − 1) 2(n − 1)
fora do ar
Perda do token,
Passagem de
1 a ∞ 0 a n−1 queda de um
token
processo
Mas num sistema tolerante a falhas, nenhum desses algoritmos é recomendado,
a não ser que a perda de processos seja algo improvável.
30
1. P envia uma mensagem solicitando o início da eleição a todos os processos
com número de identicação maior do que o dele próprio.
3. Previne a ocorrência de deadlocks, fazendo com que a estrutura não possa ser
quebrada.
31
Nos sistemas distribuídos, os métodos 1 e 2 são populares, principalmente porque
evitar o deadlock num sistema distribuído é muito difícil. A prevenção (método 3) é
complexo de ser implementado, e o método 4 é inviável, pois para ser bem-sucedido,
é necessário saber quais recursos cada processo irá precisar, por antecipação. E essa
informação quase nunca está disponível.
32
• Os processos devem pedir todos os recursos que vão usar antes de entrar em
execução;
Mas, na prática, todos esses métodos causam problemas, pois demanda que os
processos trabalhem de forma estritamente ordenada. Em um sistema distribuído,
pode-se prevenir a ocorrência de deadlocks usando um método, que descrevemos
abaixo:
No momento em que se estabelece uma transação (ou seja, um processo faz uso
de um recurso, entrando na região crítica), coloca-se uma etiqueta nessa transação
marcando o tempo global daquele instante. Graças ao algoritmo descrito na seção
4.1.1, duas transações não terão o mesmo tempo global, e mesmo que tenham, o
número de identicação será o critério de desempate.
Quando um processo está prestes a ser bloqueado, esperando por um recurso
que outro processo estiver usando, procura-se ver qual é o mais velho. Somente os
processos mais jovens (com o tempo global maior do que o processo em execução)
podem car esperando. Logo, dessa maneira, as etiquetas sempre estarão em ordem
decrescente, impedindo que se formem ciclos, e em consequência, deadlocks.
4.5 Resumo
1. Inicialmente vimos o algoritmo para sincronizar processos entre si, sem a ne-
cessidade de usar fontes externas de tempo. Esse algoritmo, como vimos, é
muito útil. Vimos também o uso de relógios físicos para sincronizar os pro-
cessos.
(c) A passagem do token passa o controle por cada uma das máquinas ao
longo de um anel lógico.
33
Capítulo 5
Processos em sistemas
distribuídos
Os processos são nosso alvo de estudo nesse capítulo, e em particular, veremos como
os sistemas operacionais administram vários processadores, e fazem o balanceamento
de carga entre eles, além do escalonamento e a alocação.
5.1 Threads
Na maioria dos sistemas operacionais tradicionais, cada processo tem um espaço
de endereçamento e um único thread. Mas há sistemas que permitem a existência
de mais de um thread (sistemas multithread) compartilhando um único espaço de
endereçamento. Conhecemos a denição, e como tudo funciona.
2. Modelo do time: Cada thread vai até o buer, pega uma requisição e a executa.
Não há o dispatcher aqui.
34
1. O thread que age como servidor é inicializado, e ele copia para o kernel a sua
interface. Essa interface dene quais procedimentos poderão ser chamados,
parâmetros, etc.
3. O kernel então, ca sabendo que haverá comunicação entre eles, em algum
momento, e prepara um meio de processar essa chamada futura.
35
• Algoritmos distribuídos - Descentralização da decisão reparte o problema entre
várias máquinas. É mais robusto, mas mais lento.
• Algoritmos globais - Usado para avaliar onde é o melhor lugar para alocar a
execução de um processo, em todo o sistema.
• Algoritmos iniciados pelo receptor - O receptor deve começar a busca por uma
nova máquina, para executar aquele processo.
36
4. Um algoritmo heurístico distribuído - Quando um processo é criado, a máquina
de origem sonda as outras máquinas, para saber qual delas tem carga abaixo
de um limite pré-estabelecido. Se não achar, procura de novo, até encontrar,
ou então executar esse processo na máquina hospedeira. Muitas vezes esse
processo de escolha usa teoria das las.
5.3 Escalonamento
Cada processador faz o seu escalonamento local, assumindo que há vários processos
para rodar nele, sem se preocupar com o que os outros estão fazendo. Funciona bem
em alguns casos, exceto quando temos um grupo de processos altamente interativos
e e relacionados entre si rodando em diferentes processadores.
Nesse caso, é bom garantir que processos que interagem muito entre si estejam
sendo executados simultaneamente, pois numa situação de tempo compartilhado,
entre vários processadores, uma troca de mensagens pode car muito demorada.
Uma idéia é colocar todos os processos que se encaixam nessa situação rodando
na mesma fatia de tempo. Combinando essa característica com o algoritmo hie-
rárquico para alocação do processador (visto na seção 5.2.3), podemos ter resultados
interessantes, com cada processo supervisor montando uma tabela de alocação, e
coordenando esse escalonamento.
5.4 Resumo
1. Threads são uma realidade em sistemas operacionais, distribuídos ou não.
4. Estações de trabalho - cada usuário com sua estação, processos são executados
prioritariamente na sua máquina.
37
Capítulo 6
Sistemas de arquivos
distribuídos
Um sistema de arquivos é o componente-chave para qualquer sistema operacio-
nal, ainda mais um sistema distribuído. Anal, ele armazena programas e dados,
tornando-os disponíveis quando é necessário.
O serviço de arquivos é a especicação daquilo que o sistema de arquivos
oferece, ou seja, a interface entre o sistema de arquivos com os cliente. Já o servidor
de arquivos é um processo que roda em alguma máquina do sistema, e ajuda a
implementar o serviço de arquivos. Um sistema bem implementado permite que
tudo funcione bem, de forma transparente ao usuário.
6.1 O projeto
O serviço de arquivos e o servidor de diretórios são as duas partes fundamentais e
distintas do sistema de arquivos.
Local: O arquivo, quando lido, é copiado do servidor para o cliente, e lá ele sofre
as devidas alterações para depois ser recolocado no servidor. O modelo aqui é
bem simples, e funciona bem. Mas o cliente tem que ceder um espaço razoável
na memória, com o objetivo de manter nela os arquivos, temporariamente.
Remoto: O serviço de arquivos fornece várias operações que podem ser realiza-
das, remotamente, no servidor. O arquivo não deixa o servidor, mas sofre as
modicações necessárias à distância.
38
6.1.2 O servidor de diretórios
O serviço de diretórios dene como serão os nomes de arquivos e diretórios: Ta-
manho, uso de caracteres especiais, espaços em branco, extensão, etc. Também
denem a criação de diretórios e subdiretórios, montando o que conhecemos como
um sistema de arquivos hierárquico.
É possível a criação de ligações ou ponteiros para um diretório qualquer, mesmo
em sistemas esparsos. Essas ligações permitem que o sistema seja organizado se-
gundo um grafo arbitrário, disperso entre os servidores, o que é uma estrutura muito
mais poderosa, mas ao mesmo tempo, mais complexa.
Um problema ocorre se for eliminada a ligação de um diretório para outro.
Teremos diretórios órfãos, perdidos entre os servidores. O problema também ocorre
em sistemas centralizados, diga-se de passagem. Mas nos sistemas distribuídos, é
muito mais sério: Você não pode simplesmente parar toda a atividade dos arquivos,
para simplesmente procurar por diretórios órfãos.
Uma questão importante é que: nem todas as máquinas tem a mesma visão
da hierarquia de diretório. Uma parte da árvore pode estar num servidor, e outra
parte, em outra máquina. Ou então a ligação entre a raiz e o diretório não ser a
mesma nos clientes (tipo, um diretório está vinculado à raiz numa máquina, e a um
outro diretório na outra máquina). A idéia da montagem remota é usada para
organizar a observação do sistema, por parte dos clientes.
Os dois primeiros casos são simples de serem implementados, enquanto que o terceiro
caso é difícil de ser feito, mas necessário se o objetivo é fazer com que o sistema
distribuído aja como se fosse um único computador.
39
Uma característica interessante, para implementar a tolerância a falhas, é
ter o mesmo arquivo replicado em vários servidores, e a tabela de nomes binários
referenciar todos os servidores onde aquele arquivo se encontra. No momento do
acesso, acessa-se o servidor mais próximo, mas caso haja falhas, o dado ainda está
disponível, por causa da redundância.
40
Mas ainda há dúvidas se essas observações variam de acordo com o ambiente
onde o sistema operacional é empregado: Numa indústria, no escritório de uma
empresa, num banco... Isso tudo acima pode mudar. Mas, para uma aproximação
inicial, é razoável que as seis observações acima sejam plausíveis.
Resposta: Uma maneira é combinar os dois serviços numa coisa só. Outra opção
é mantê-los separados. Assim, abrindo um arquivo, consulta-se o servidor de
diretórios, fazendo o mapeamento do nome simbólico no nome binário, para
assim acessar o arquivo. A vantagem de separá-los é dar mais exibilidade ao
conjunto, mas torna-se mais cara computacionalmente, quando há a necessi-
dade de fazer várias buscas pelos caminhos dos arquivos (pode-se diminuir o
tempo gasto usando um cache).
Resposta: Alguns acham que não deve haver informações de estado nos servidores.
Ou seja: Faz-se a requisição a um servidor, processa ela, envia a resposta e
depois... Esquece. Outros acham que deve-se manter informações de estado
nos servidores. Abaixo vamos ver vantagens e desvantagens:
• Os servidores que não guardam informações são mais tolerantes a falhas, não
precisam guardar tabelas com informações dos clientes, e não tem problemas
quando um cliente pára de funcionar.
1. No disco do servidor;
3. No disco do cliente;
41
O lugar mais apropriado é o disco do servidor, que tem muito espaço, está
disponível para todos os clientes, e evita problemas de consistência. Mas o mesmo
é lento, e o acesso a ele tem que passar pela memória principal do servidor, depois
para o disco do cliente, e nalmente a memória principal do cliente.
Uma maneira de diminuir o tempo gasto é usar o cache do servidor. Assim,
um arquivo que é muito acessado, está no cache, e não terá que ser lido do disco.
Mas, para manter o cache cheio, é preciso um algoritmo que decida quem deve car
no cache. Ainda temos o problema do tráfego na rede, mas pode ser resolvido se
tivermos um cache no cliente.
Esse algoritmo tem que resolver dois problemas:
2. O que fazer, quando o cache encher, e for preciso remover arquivos dela?
Existem quatro métodos para garantirmos a consistência do cache, que iremos re-
sumir na tabela abaixo:
Método Como funciona Comentários
6.2.4 Replicação
O interesse na replicação de arquivos por um sistema distribuído é claro:
• Aumenta a conabilidade;
• Tolerância a falhas;
42
3. Replicação em grupo: O arquivo é gravado no grupo de servidores, simulta-
neamente.
Nos casos 1 e 2, é obrigatório eleger um servidor principal, para que ele receba a
atualização e possa replicar o arquivo, o que não é muito robusto. Pode-se usar um
algoritmo eletivo, para fazer a troca do servidor principal, de tempos em tempos.
6.3 Tendências
Muita coisa está mudando na informática, e isso reetirá na área de sistemas de
arquivos distribuídos. Abaixo vão algumas:
1. Hardware novo - O hardware velho está cada vez mais barato, o que torna
mais atrativo montar sistemas distribuídos, com mais máquinas por um preço
menor. Com o avanço da tecnologia, pode-se pensar em estruturas de rede
mais rápidas (anéis de bra ótica, por exemplo) interligando os servidores de
arquivos. Dessa forma, pode-se dispensar o cache nos clientes, visto que o
gargalo da rede será muito menor, e muito melhor aguentar a baixa latência
dos servidores do que usar uma implementação complexa (e cara) para o cache.
5. Tolerância a falhas - Os sistemas atuais não são tolerantes a falhas, salvo raras
exceções. Para termos redundância propriamente dita, é necessário investi-
mento em hardware (fontes redundantes, matrizes de HDs ligados em RAID,
sistemas hot-swap, etc) e redundância em software, principalmente dos dados.
A replicação de arquivos será fundamental para os futuros sistemas, e a capa-
cidade de funcionar mesmo com parte dos dados fora do alcance, é importante
para termos um sistema realmente tolerante a falhas.
6.4 Resumo
• O centro de qualquer sistema distribuído é o seu sistema de arquivos.
43
• A natureza de um arquivo não muda, seja ele hospedado num sistema centra-
lizado ou distribuído.
44
Referências Bibliográcas
[1] Sistemas Operacionais Modernos - Andrew S. Tanenbaum - Editora LTC - 1a
edição.
45