Sistema de Arquivos Virtual
Autor: Hermano | Publicado: 2013-11-21T07:58:00-08:00


O núcleo do sistema possui um suporte básico a sistemas de arquivos externos ao kernel, através de uma abstração chamada de sistema de arquivos virtual ou VFS (virtual file system). A ideia principal do VFS é abstrair a parte comum aos diferentes sistemas de arquivo e colocar o código em uma camada separada que chama o sistema de arquivos subjacente para fazer o gerenciamento dos dados [1].





O sistema de arquivos virtual permite que arquivos sejam
carregados na memória e acessados de forma uniforme, independente de como os
dados estão estruturados nos sistemas de arquivos externos. Diferentes drivers para sistemas de arquivos podem
criar pontos de montagem em uma hierarquia de diretórios que é comum a todos.
Do ponto de vista do usuário, existe apenas uma hierarquia de diretórios embora
na prática diferentes componentes de software
tenham que trabalhar em conjunto para possibilitar o acesso aos dados.


Estrutura e representação dos Arquivos



O sistema FESO trata os arquivos como apenas um conjunto de bytes, não atribuindo nenhum significado
em especial a eles. Cabe ao criador do arquivo designar o significado de cada byte, em cada posição do mesmo. Isto
permite uma grande flexibilidade por parte dos programas, que podem fazer uso
desta abstração da maneira que for mais conveniente.



Cada arquivo do sistema está em uma mesma estrutura hierárquica,
formada por arquivos e diretórios, como é possível ver na figura abaixo. Os
diretórios são arquivos especiais, que agrupam um conjunto de arquivos e outros
diretórios, e formam a estrutura do sistema de arquivos.



A estrutura começa a partir do diretório raiz (representado pelo
caractere '/'), que possui vários outros diretórios. Alguns deles são
diretórios locais, e estão armazenados apenas na memória. Outros são arquivos
externos, que ficam em dispositivos de armazenamentos, e são carregados para a
memória apenas quando preciso. 





Cada arquivo ou diretório é tratado como um nó no sistema de
arquivos. Para cada nó existe um conjunto de informações que é mantida pelo SO,
tais como: o tipo do nó (arquivo comum, diretório), o nome, o tamanho, seu
local (memória ou dispositivo de armazenamento), e uma lista clusters com os dados armazenados. 



Essas estruturas ficam na memória, em uma árvore balanceada. Elas
são ordenadas pelo descritor do nó ao qual representam. &nbsp;O descritor é um número sequencial utilizado
na identificação de cada um dos nós. Tanto nós de arquivos como de diretórios
possuem um descritor, e ele é utilizado também pelos programas para realizar
operações sobre esses nós.



A figura abaixo mostra como os arquivos ficam estruturados na
memória quando carregados. Os diretórios do sistema de arquivo virtual do FESO
possuem apenas uma unidade de armazenamento (cluster) de 512 bytes.
Este cluster contém um vetor de
números inteiros de 4 bytes. A
primeira posição desse vetor contém um inteiro N, que armazena o número de
outros nós contidos naquele diretório. As N posições seguintes armazenam o
identificador de outros nós dentro do diretório. Como cabem apenas 128 valores
inteiros em um cluster de 512 bytes, e como o primeiro é utilizado
para indicar a quantidade de nós, os diretórios estão limitados a uma
quantidade máxima de 127 nós filhos. &nbsp;A
partir da leitura do cluster único
contido nos nós que representam diretórios, é possível identificar quais outros
nós o diretório contém. 







Os arquivos comuns, por sua vez, possuem uma quantidade
arbitrária de clusters de 512 bytes. Assim como as estruturas dos nós,
os dados contidos nos clusters ficam
armazenados na área de memória que é alocada dinamicamente pelo núcleo. Sistemas
de arquivo externos carregam os dados nessa memória, e os tornam acessíveis a
outros programas.



O sistema de arquivos virtual permite que um determinado
conjunto de operações seja executada sobre os nós. Existem chamadas do sistema
para a criação de nós de arquivos comuns e de diretórios. Há ainda, chamadas tanto
para criação de nós locais, que ficam apenas na memória e são perdidos quando o
computador é desligado, quanto os externos, armazenados em um dispositivo de
armazenamento, e gerenciados por um servidor de sistemas de arquivos que funciona
de forma externa ao kernel. 



Existem chamadas também para a leitura, escrita, fechamento e
remoção de arquivos. Essas chamadas são realizadas diretamente pelas rotinas do
núcleo quando feitas sobre um arquivo local. No caso de um arquivo externo, o
núcleo informa ao cliente qual é o servidor responsável, e o próprio cliente
solicita a execução da operação desejada sobre o arquivo. Isto é necessário,
pois o núcleo não tem acesso às
rotinas do servidor do sistema de arquivos externo, e apenas ele pode executar
as operações de maneira correta.



As funções para tratamento de arquivos em espaço de usuário
estão diretamente relacionadas às chamadas ao sistema oferecidas pelo VFS. A
função de abertura/criação de arquivos prevê alguns modos de abertura. Alguns
servem para a abertura de diretórios, outros para arquivos. 



Há também, modos para abertura de arquivos, para a leitura e
para a escrita. A diferença desses dois últimos é o posicionamento do cursor
que existe para cada arquivo. Este cursor é uma variável que indica em que
posição do arquivo a próxima operação de leitura ou escrita deve ser realizada.
No caso da abertura do arquivo para escrita, o cursor é posicionado por padrão
no final do arquivo, e para leitura no começo. De qualquer forma, existe uma chamada
do sistema responsável por alterar a posição do cursor dentro do arquivo,
permitindo o acesso a qualquer posição.



Uma boa parte das funções e chamadas do sistema que trabalham
sobre arquivos se utilizam do descritor para identificá-los. Isto é, o descritor
é geralmente um parâmetro para essas chamadas. Uma exceção é a chamada de
abertura/criação que se utiliza de uma cadeia de caracteres com o nome do
arquivo acompanhado de seu caminho completo a partir do diretório raiz. Este
caminho é composto pelo nome de todos os subdiretórios ordenados de acordo com
sua posição na hierarquia do sistema de arquivos. 



O arquivo arq1
indicado na figura, por exemplo, teria o seguinte caminho: /cdrom/dir1/arq1. Começando pelo
diretório raiz (/), passando pelo diretório cdrom
e dir1 (que está contido em cdrom). Entre os nomes de cada um dos
diretórios existe uma barra (/) para indicar a separação entre eles. Quando uma
chamada para abertura/criação é bem-sucedida, ela retorna um número inteiro que
é o identificador do arquivo, e este sim é utilizado nas outras chamadas.


&nbsp;<!--[endif]-->Integração com Sistemas de Arquivo Externos



O sistema de arquivos virtual oferece uma estrutura básica para
que arquivos sejam manipulados pelos programas. No caso de arquivos locais,
todas as operações sobre os arquivos são feitas diretamente pelas rotinas do kernel. Os arquivos locais ficam salvos apenas na memória do computador, e
são perdidos quando este é desligado. 



Além disso, o sistema de arquivos virtual oferece uma estrutura
para que arquivos externos sejam manipulados. Esses arquivos externos ficam salvos
primeiramente em algum dispositivo de armazenado, como um CD ou um disco
rígido. E sua manipulação não é feita apenas pelas rotinas do núcleo, existindo
um programa em espaço de usuário que funciona como um servidor, acessando o
dispositivo de armazenamento, e lidando diretamente com as peculiaridades de
cada sistema de arquivos em particular.



A figura abaixo mostra um exemplo básico de leitura de arquivo
externo. Primeiramente, um cliente (um programa de usuário qualquer), tenta
abrir um arquivo externo. Os servidores de sistema de arquivos devem, em seu
processo de inicialização, criar nós no VFS que indiquem a existência de
arquivos em outros dispositivos de armazenamentos. A principio, estes nós
contém apenas uma lista de cluster
vazia, sem nenhum dado.



Neste ponto, o cliente se comunica com o servidor de sistemas de
arquivos, e espera que este realize a operação solicitada sobre o arquivo. No
caso da abertura, os sistemas de arquivos externos carregam os dados do arquivo
para a memória, o que permite que eles sejam acessados pelo cliente. Quando os
dados são escritos, eles ficam salvos apenas na memória, e no momento em que o
arquivo é fechado, o servidor entra em ação e move os dados recém-escritos para
o dispositivo de armazenamento.









Na ocorrência de uma tentativa de qualquer operação sobre um
arquivo externo, o núcleo apenas informa ao cliente que a operação não pode ser
realizada diretamente, e retorna o identificador do processo responsável pelo
arquivo. Quando isto ocorre, as funções da biblioteca padrão do sistema FESO
automaticamente tentam entrar em contato com um servidor de arquivos. A
operação solicitada pelo cliente é então repassada ao servidor, que deve
possuir uma implementação especifica para cada caso, seja abertura/criação,
leitura, escrita, exclusão ou fechamento de arquivo. Após o término da
operação, o servidor se comunica com o cliente, e este continua sua execução
normalmente.




Este modelo permite que diversos sistemas de arquivos diferentes
funcionem em uma mesma estrutura, e isola cada sistema de arquivos em um
programa de usuário a parte. Um detalhe a ser acrescentado é que a figura esconde o intermediário que pode existir entre o servidor do sistema de
arquivos e o dispositivo de armazenamento. Os sistemas de arquivos
desenvolvidos até o momento não acessam o dispositivo diretamente. E eles
entram em contato com outro driver de
dispositivo, e este faz a comunicação direta com o dispositivo.&nbsp;&nbsp;



[1]&nbsp;TANEBAUM, Andrew S. Sistemas Operacionais Modernos. 3. ed. São Paulo: Pearson Education, 2010.