Sistema de Arquivos
Introdução
Funcões
Proteção
Nomes e endereços
Os tópicos a serem examinados
podem ser encontrados nos seguintes capítulos de livros:
Modern
Operating Systems, Tanenbaum, cap. 4
Operating
Systems Concepts, Peterson/Silberschatz, cap. 10
Outros bons livros de sistemas
operacionais, nos capítulos sobre sistema de arquivos
1. Introdução
O sistema de arquivos é o módulo
responsável, dentro do SO, pelo gerenciamento do conteúdo
dos discos do sistema. Esse gerenciamento inclui tanto o controle de
acesso aos mesmos (seguranca), como o controle da localização
e manuseio dos conteúdos de cada arquivo.
Aqui não examinaremos os aspectos
relativos à seguranca do sistema, que foram
apresentados no capítulo anterior. Com isso nos concentraremos
mais nos aspectos relativos aos arquivos propriamente ditos,
iniciando esse estudo pela definição das funcões
do sistema de arquivos.
Uma última observação
é que vários dos conceitos examinados aqui podem ser
mapeados para os mecanismos de gerenciamento de memória
(próximo capítulo), uma vez que este se ocupa também
de controlar a localização e o acesso aos dados
contidos na memória.
2. Funcões
Como dito acima, as funcões
de um sistema de arquivos se concentram no controle dos arquivos em
disco. Dentro desse cenário as principais funcões
por ele desempenhadas são:
Proteção
Mapeamento
de nomes
Endereçamento
Seguranca
Contabilidade
Dessas funcões
examinaremos aqui as três primeiras. A função de
seguranca foi examinada no capítulo anterior e
faz, como foi visto, o servico de autenticação
de usuários e de controle de permissões.
Já a função de
contabilidade não diz respeito especificamente aos
arquivos. Ela é normalmente incluída dentro do sistema
de arquivos por não se encaixar em nenhum outro módulo
do SO e por ser mais fácil executar os servicos de
contabilidade (quem usou o sistema, por quanto tempo, fazendo o que,
etc.) a partir dos arquivos (textos, aplicativos, comandos)
acessados. Em geral os servicos de contabilidade incluem a
geração de arquivos de registro (logs) sobre os
eventos ocorridos no sistema e estão voltando a ter mais presença
com a introdução de ambientes de nuvem (cloud computing) e
de hospedagem, em que se paga pelos recursos utilizados.
3. Proteção
O servico de proteção
é muitas vezes confundido com o de seguranca. A
principal distinção a ser feita entre os dois é
que seguranca se ocupa primordialmente com acessibilidade,
enquanto proteção cuida de integridade (ou
consistência) dos arquivos. Com esse foco a proteção
de arquivos em um sistema deve se preocupar com dois tipos de falha:
aquela que corrompe grande parte dos arquivos (falha de disco) e
aquela que corrompe um arquivo de forma individual (falha de
gravação).
Nas falhas de disco temos, normalmente,
algum tipo de erro que torna o disco ilegível.
Problemas desse tipo ocorrem, em geral, por falhas de energia
elétrica, crashs de disco, etc. A solução para os mesmos é o
uso intenso e cuidadoso de backups, incluindo-se o armazenamento
desses backups em locais fisicamente distantes dos discos
originais (evitando que se perca simultaneamente o
disco e seu backup num incêndio, por exemplo).
Um sistema decente deve fornecer dois
tipos de backup ao seu administrador, que são os
backups físico e lógico. No primeiro o backup
é realizado copiando-se sequencialmente os bytes do
disco, sem preocupação com o conteúdo de cada
byte. No último o backup é feito
copiando-se arquivo por arquivo do disco. Com isso, o backup
físico é mais rápido mas força que o
sistema fique inativo enquanto ele estiver em andamento. Já o
backup lógico é mais lento mas necessita apenas do bloqueio do arquivo sendo copiado durante o processo,
permitindo que o restante do sistema permaneça em atividade.
Independente do modo do backup é
bastante importante que eles sejam programados adequadamente. Embora
o sistema de arquivos possa fornecer aplicativos que realizem essa
operação de modo automático, cabe sempre ao
administrador definir a periodicidade em que ocorrem os backups
e quais arquivos devem ser copiados a cada vez. Isso permite que
áreas diferentes do disco tenham políticas diferentes
de backup, de acordo com a frequência em que seus
conteúdos são alterados.
Já os problemas de falha de gravação
surgem quando um usuário está salvando um arquivo. Se no momento
da gravação ocorrer uma falha no sistema (falta de energia, por
exemplo), o arquivo provavelmente se tornará inconsistente pela
perda de links entre suas diversas partes (blocos). Isto ocorre pois como o disco é dividido em trilhas e setores e um arquivo pode ter que ocupar diversas trilhas e muitos setores, é necessário saber a sequência de setores ocupados. Essa sequência é armazenada e gerenciada pelo sistema de arquivos, sendo que pode se tornar totalmente inconsistente se uma falha ocorrer durante o processo de escrita do mesmo no disco.
Para diminuir (infelizmente não
dá para eliminar) o risco de perda desse tipo de informação
(trilhas e setores ocupados por um arquivo), usa-se técnicas
como as páginas sombra (shadow pages), em que o
salvamento de um arquivo em disco passa a ser feito em duas etapas.
Na primeira criam-se as páginas sombra do que havia sido
anteriormente salvo em uma outra área do disco, juntando-se
também as páginas novas do arquivo. Se essa fase
terminar com sucesso então passa-se a mapear o arquivo para
esse novo conjunto de páginas, eliminando-se sua versão
anterior. Desse modo, a única possibilidade de perda de
integridade é se a falha ocorrer durante o processo de mapear
o arquivo para o novo conjunto de páginas. Em qualquer outro
ponto do processo o prejuízo máximo é o de se
perder o que foi editado após a última operação
de salvamento do arquivo.
Finalmente, o último problema de
integridade de arquivos envolve o seu compartilhamento de modo
simultâneo. Essa situação implica na existência
de diversas cópias de um arquivo no sistema, o que exige
cuidados para se garantir que todos os usuários que o estejam
acessando tenham cópias atualizadas do mesmo e, ainda, que ao
final do uso a cópia resultante seja a realmente pretendida. Esse problema é ampliado em sistemas distribuídos, quando podemos ter réplicas de um mesmo arquivo espalhadas por várias máquinas.
4. Nomes e endereços
Essas são, sem dúvida, as
funcões mais importantes prestadas pelo sistema de
arquivos. Independentemente de haver controle de acesso ou garantia
de integridade dos arquivos, é preciso localiza-los no disco.
Isso é propiciado pelas funcões de mapeamento de
nomes e de endereçamento.
Mapeamento
de nomes: Consiste em identificar os arquivos de forma única
dentro de um disco, a partir de chamadas feitas pelos processos em
execução no sistema. Isso significa ter condicões
de diferenciar arquivos com mesmo nome que sejam de fato distintos
(ou identificar um mesmo arquivo com nomes diferentes).
Parte desse trabalho é feito através da estruturação de
diretórios, que hoje em dia estão organizados na forma
de árvores hierárquicas, com subdiretórios com
permissões de acesso diferenciadas para cada usuário.
Então, quando um processo solicita um dado arquivo, o que se
faz é buscar na estrutura de diretórios o arquivo
pedido (segundo algum caminho de busca pré-definido).
Outras formas de se organizar diretórios incluem diretórios
planos (um único raiz) e de usuários (sem possibilidade de
compartilhamento). Entretanto essas formas não são mais usadas
pois a estrutura em árvore é muito mais eficiente.
Uma outra tarefa do serviço de nomes é permitir o compartilhamento de
arquivos, ou mais precisamente, controlar a abertura de arquivos
evitando que cópias desnecessárias de um arquivo coexistam na
memória da máquina. Isso implica em verificar se o arquivo já
está aberto no momento em que é solicitado (e com isso
mapear nomes a identificadores únicos desse arquivo) e
controlar o seu fechamento, evitando que algum usuário perca
o seu ponteiro para o arquivo.
Endereçamento: Trata
de como os arquivos são alocados (e localizados) ao longo do
disco. Em geral a técnica para resolver esse atividade é
fazer com que a própria estrutura de diretórios possua
algum tipo de mapeamento entre nomes e localização
física no disco. Isso é feito de forma diferente para
cada sistema operacional, com vantagens e desvantagens em cada uma
delas.
Com isso o primeiro obstáculo a ser
resolvido é o de determinar como os setores serão
divididos. Como um arquivo pode não caber em um único
setor, e a alocação de um setor a um arquivo implica
que todos os bytes do setor estariam reservados para esse arquivo
(que pode não ocupar nem 10% dele), é prática
comum dividir o setor em blocos (ou páginas) de tamanho fixo,
alocando-se tais blocos aos arquivos.
Assim, ao armazenar um arquivo temos que, na realidade, armazenar
também os endereços dos blocos que ele ocupa (e a ordem desses
blocos na sequência lógica do arquivo). O tamanho do bloco
deve ser determinado de tal forma que não seja grande nem
pequeno demais, pois blocos grandes desperdiçam muito disco,
apesar de serem mais fáceis de gerenciar, e blocos pequenos
dificultam o gerenciamento, apesar de ocuparem mais integralmente o
disco. Tamanhos razoáveis, nos dias de hoje, vão de
1024 a 8192 bytes.
O segundo obstáculo é, então,
o mapeamento dos endereços ocupados por um dado arquivo em
disco. Como dito acima, isso é feito de maneira diferente em
cada sistema.
No D.O.S. isso era feito através da FAT
(File Allocation Table), que embora de implementação
simples (a localização dos arquivos era feita por
listas implementadas por índices de um vetor), era limitada e
ineficiente para localizar páginas finais em arquivos
grandes.
No UNIX isso é feito através da chamada
I-list, que é uma lista cujos elementos (os
I-nodes) ocupam, cada um, uma página do disco,
independente de se referirem a um arquivo comum ou a um diretório.
Nessa página aparecem os dados genéricos do arquivo,
tais como nome, data de criação, alteração,
proprietário, permissões de acesso, tamanho, etc.
Também aparecem os endereços das primeiras dez páginas
do arquivo (ou dos primeiros dez i-nodes de arquivos de um
diretório). Para arquivos maiores existem ainda outros três
endereços, que funcionam em três diferentes níveis
de indireção, proporcionando o endereçamento
rápido de até 16 Gbytes num sistema com páginas
de 1024 bytes.
Já as versões mais recentes do Windows (a partir do XP)
adotam esquemas intermediários entre o D.O.S. e o UNIX, com várias
das idéias presentes no UNIX mas ainda carregando o peso de ser compatível com a
proposta da FAT. Neles adota-se o sistema
NTFS, que é derivado do antigo Windows NT.
|