E lit : Fonk mbokk
Activité 2 : modelage, pratique guidée et pratique autonome Je fais
A maior revisão do sistema de arquivos do UNIX foi realizada em Berkeley, resultando no UNIX FFS (Fast File System) [MJL+84]. As alterações realizadas se relacionam com a utilização do espaço em disco, com o objetivo de melhorar o desempenho do sistema de arquivos. As principais mudanças são:
• no UNIX FFS, os nós-i não estão concentrados no início do disco. O sistema divide o disco em regiões de cilindros adjacentes, denominadas grupos de cilindros. Cada grupo de cilindro possui sua região de nó-i e sua região de dados. Assim, mesmo em discos grandes, os nós-i estão mais próximos da região de dados;
• o UNIX FFS permite a existência de até dois tamanhos de bloco, iniciando com o
tamanho mínimo de 4096 bytes, até o limite imposto pela controladora de disco, ou pelos drivers. A utilização de blocos maiores reduz, em potencial, a quantidade de acessos a disco, mas aumenta a probabilidade de ocorrer um fenômeno denominado de
fragmentação interna: freqüentemente, o último bloco de um arquivo não é totalmente
• o gerenciamento do espaço livre foi alterado, para tornar a alocação de blocos mais rápida. A lista de blocos livres foi substituída por um mapa de bits, que registra o estado de alocação de cada bloco e fragmento do disco. Como o mapa de bits é pequeno, ele pode ser mantido na memória, dispensando acessos a disco durante a alocação de blocos;
• o UNIX FFS possui um novo algoritmo de alocação de blocos, que procura: alocar o
nó-i e os blocos de um arquivo no mesmo grupo de cilindros; alocar os blocos de um
arquivo da forma mais contígua possível e concentrar, sempre que houver espaço, os arquivos de um mesmo diretório em um único grupo de cilindros. Dessa forma, o UNIX
FFS consegue diminuir a quantidade de posicionamentos do braço, durante o processamento das requisições de acesso.
2.2.3 Armazenamento Estável no U
NIXO sistema de arquivos do UNIX consegue prover armazenamento estável através da
gravação síncrona de dados. Na gravação síncrona, o sistema ativa o driver de disco, para
iniciar imediatamente a transferência do conteúdo alterado nos buffers da cache, para os blocos de disco apropriados. O processo de usuário requisitante da chamada de sistema é bloqueado, até que a gravação termine.
O sistema oferece duas maneiras de uma aplicação solicitar a gravação síncrona de dados. Primeiro, a aplicação pode informar ao sistema, no momento em que abrir o arquivo, que todas as operações de escrita devem ser realizadas de forma síncrona. A aplicação faz essa opção, passando o parâmetro O_SYNC na chamada de sistema open [AT89]. O sistema guarda essa informação na tabela de arquivos abertos, realizando a gravação síncrona dos dados de todas as requisições de escrita para esse arquivo. Quando uma operação de escrita retorna como bem-sucedida, o processo de usuário tem a certeza de que os dados foram realmente gravados no disco.
Uma segunda forma de realizar a gravação síncrona é invocando uma operação complementar, através da primitiva fsync, logo após a operação de escrita no arquivo [Bac86]. A primitiva fsync bloqueia o processo do usuário, enquanto transfere para o disco o conteúdo de todos os buffers “sujos” da cache, com dados do arquivo informado. O processo de usuário só continua a sua execução, quando a gravação dos dados termina.
Existe, ainda, a primitiva sync, que transfere o conteúdo de todos os buffers “sujos” da
cache para o disco. Porém, ela é inadequada para implementar o armazenamento estável de
um arquivo: além de gravar conteúdos do sistema de arquivos, que não se relacionam com o arquivo em questão, o processo de usuário não espera pelo final da operação. Assim, embora o sistema de arquivos dispare imediatamente a gravação dos buffers para disco, a
Quando uma aplicação realiza muitas operações de escrita, a espera pela gravação síncrona pode comprometer o seu desempenho. Portanto, nem sempre as aplicações podem arcar com o custo do armazenamento estável de dados, no sistema de arquivos do UNIX.
2.2.4 Procedimento de Recuperação do U
NIXAlgumas circunstâncias, como a falta de energia ou falhas no hardware, podem levar a um
crash, deixando o sistema de arquivos num estado inconsistente. O comando fsck é
utilizado para investigar inconsistências e reparar o sistema de arquivos [AT89]. Trata-se de um programa interativo, que utiliza a interface de caracter, ou de bloco, para ter acesso direto ao sistema de arquivos, sem valer-se das chamadas de sistema regulares [Bac86].
O fsck prevê uma série de possíveis situações de inconsistência, resultantes da perda de memória volátil, como, por exemplo: blocos de dados referenciados por mais de um nó-i; blocos de dados que não são referenciados; superbloco com informações que não condizem com o estado real do sistema; lista de blocos livres corrompida; nó-i com informações inválidas; diretórios desconectados, ou com entradas incorretas. Para realizar tais verificações, o fsck examina todos os metadados existentes no disco, incluindo todos os
nós-i, blocos indiretos e diretórios, além da lista de blocos livres. Pesquisando essas
estruturas de dados e corrigindo as inconsistências, o fsck consegue levar o sistema de arquivos a um estado consistente.
Uma limitação desse procedimento de recuperação é a necessidade de conferir, incondicionalmente, todos os metadados do sistema de arquivos, a despeito da quantidade de metadados inconsistentes [RO92]. Certas operações, como a verificação de cada entrada de diretório, podem requerer muitas leituras não-seqüenciais, que exigem múltiplas operações de posicionamento. No caso de discos grandes, com muitos arquivos, a leitura e o exame de todos os metadados, em geral, duram um longo tempo. Quanto maior a capacidade do disco, maior o tempo de execução do procedimento de recuperação. Normalmente, apenas um pequeno número de metadados está sendo atualizado e pode tornar-se inconsistente, no momento de um crash. Se o procedimento de recuperação pudesse identificar as estruturas afetadas pelo crash, haveria a possibilidade de restaurar a consistência do sistema de arquivos mais rapidamente.
Outra limitação do procedimento de recuperação do UNIX é o confinamento das ações
corretivas aos metadados do sistema de arquivos. O fsck restringe-se a corrigir os valores dos metadados, para que voltem a corresponder ao estado real do sistema de arquivos, armazenado em disco. Esse procedimento é incapaz de recuperar os blocos de dados que estavam armazenados na cache. Por isso, as aplicações podem perder as últimas atualizações realizadas.