You are on page 1of 1

OFS - OurFileSystem - Descrição e Implementação

Bruno Eduardo Soares1, Leonardo Zanotto Baggion1, Maykon Valério da Silva1

1Curso de Ciência da Computação – Universidade Estadual do Oeste do Paraná (UNIOESTE)


– Cascavel – PR – Brasil
besoares90@gmail.com, leonardozb@gmail.com, maykonvs@gmail.com

Abstract. The objective of this paper is to describe the implementation e operation of the filesystem implemented for the discipline of Operating Systems.

Resumo. Este artigo visa descrever a implementação e o funcionamento do sistema de arquivos implementado para a disciplina de Sistemas Operacionais.

Introdução
O sistema de arquivos é uma das partes mais visível ao usuário de um sistema pois fornece o mecanismo necessário para que o usuário armazene e gerencie as informações (dados). Por isso deve-se ter a preocupação de se utilizar e desenvolver sistemas de arquivos
com vários mecanismos de segurança e que forneçam ao usuário a melhor forma de organização de seus dados.
Este trabalho apresentará uma representação de um sistema de arquivos conforme uma especificação apresentada a seguir:

1. Projetar um sistema de arquivos para armazenamento em disquete. Descreva


como serão armazenadas as seguintes informações:
a. Gerenciamento de espaços livres
b. Alocação de arquivos
c. Nomes de arquivos e diretórios (o sistema de arquivos deve suportar no
mínimo a organização em 2 níveis de diretórios)

2. Implemente as seguintes aplicações:


a. Formatador
b. Cópia de um arquivo do disco rígido para o disquete
c. Cópia de um arquivo do disquete para o disco rígido
d. Listagem dos arquivos armazenados no disquete
- Utilize um arquivo imagem de tamanho 1.44 Mbytes para
simular o disquete.

Segundo Tanembaum o disco serve para armazenamento de dados a longo prazo, para arquivo muito grandes e também para a sincronização de dados entre vários processos. E também segundo este, uma das partes essenciais de um sistema de arquivos são
os seus métodos de alocação e gerenciamento de livres pois estes influenciarão diretamente no tempo de acesso de um arquivo. Portanto a seguir é mostrado como foram feitas essas funções e outras no OFS.

Descrição
O sistema de arquivo implementado, chamado de OFS, utiliza-se de blocos de 512 bytes em um disco de 1.44 Mbytes. Nele não há limites de níveis de diretórios, apenas o tamanho de disco limita essa quantidade. O limite que existe é na quantidade de arquivos e
subdiretórios que um diretório pode ter, que é 124. Isto vem pelo descritor do diretório, este descritor utiliza um bloco de 512 bytes inteiro, nele existe o nome do diretório (8 caracteres - 16 bytes) e uma tabela de inteiros com 124 posições (498 bytes) que serve de
ponteiro para o bloco de cada arquivo ou diretório no disco que estão contidos neste diretório. Em um arquivo também há um limite de tamanho, 61 Kbytes, que também decorre do descritor do arquivo, que possui o nome (8 caracteres - 16 bytes), a extensão (4
caracteres - 8 bytes) e uma tabela de inteiros com 122 posições (488 bytes) que, da mesma forma que no descritor de diretório, aponta para cada bloco do disco que compõe o arquivo, desta forma têm-se uma certa indexação, já que os blocos podem ser acessados de
forma aleatória, pegando o índex na tabela. Assim o sistema de arquivos tem uma característica do ext2 onde o descritor lembra um inode, e também uma caraterística de FAT12 que é a tabela que cada arquivo e diretório possui.
O gerenciamento de livres é feito por uma tabela de 128 posições que aponta para os primeiros 128 blocos livres, o que, por não apontar para todos os blocos livres, exige que seja atualizado a cada alocação ou remoção. Esta tabela de livres está armazenada no
bloco 0 disco.
O método de alocação é direto, o primeiro bloco livre é usado, o segundo e assim por diante, o sistema de arquivo não faz nenhum esforço em deixar os blocos de arquivos juntos, isso gera uma fragmentação muito grande dentro do disco, que pode ser lento
por isso. Outro problema que acontece é o overhead que o descritor gera por ocupar um bloco inteiro, por exemplo, se um arquivo possui apenas um bloco, junto com o descrito ele ocupa dois blocos, um overhead de 100%.
Implementação
A implementação do sistema de arquivos foi feita em java, porque no início do projeto existia a idéia de fazer uma interface gráfica para o OFS, porém por questões de tempo isto não foi implementado, apenas um "console" para ser digitado os comandos para
manipular os arquivos e diretórios.
Existe uma classe para cada elemento do sistema, a classe BlocoDiretório representa o descritor dos diretórios, a BlocoArquivo representa o descritor dos arquivos, BlocoDados representa os dados dos arquivos. Todas essas classes estendem a classe bloco,
que contém apenas o nome do arquivo ou diretório, isto foi necessário para o listar, que não "sabe" se o que ele está mostrando é um arquivo ou diretório, sendo assim ele mostra um Bloco. É importante frisar que inclusive a classe BlocoDados estende a classe Bloco,
ou seja, mesmo um bloco de dados possui nome (o mesmo do arquivo ao qual ele pertence), isto por causa do gerenciamento de espaços livres, o método responsável por esse gerenciamento se utiliza do nome do bloco para saber se este está ocupado ou não, se o
nome estiver vazio (8 espaços em branco) ele não está sendo ocupado.
A classe que manipula o sistema de arquivos é a classe FileSystem, apenas ela usa as classes de blocos, ela é responsável pelo gerenciamento de livres, formatação, alocação, deslocação, gravação e recuperação de dados no disco, importação e exportação de
um arquivo. Esta classe além de ter a imagem do disco possui atributos para identificar o estado atual do programa, entre estes estão um BlocoDiretório que é o diretório atual que está aberto, um inteiro que é o número do bloco deste diretório atual no disco e a tabela
de livres atualizada. Além das funções descritas acima ele possui métodos private que as outra funções se utilizam, os principais são os métodos de busca de bloco através do nome, estes métodos encontram um determinado bloco dentro do disco e retornam a sua
posição no disco.
Para manipular o arquivo de imagem do disquete foi utilizada a classe RandomAccessFile, já existente na linguagem java, que se utiliza de um "index" para apontar para uma determinada região do arquivo, este "index" é em bytes, como cada bloco possui 512
bytes, é utilizado um múltiplo de 512 para acessar cada bloco, por exemplo, seek(2*512) irá acessar o bloco 2 do disco.
Um problema que foi identificado apenas na fase de testes do projeto é o fato de os dados utilizados na implementação serem chars por se imaginar que ocupariam 8 bis (1 byte) porém na classe RandomAccessFile para gravar ou ler um char ele ocupa 2 bytes
por gravar o \0 após cada caracter. Isto diminuiu pela metade a capacidade do disco, ou seja, por mais que ele tenha 1.44 Mbytes ele armazena apenas a metade disto de dados significativos.

Alocação
A alocação, como dito anteriormente, é direta, o primeiro bloco livre é alocado e assim por diante, essa alocação é feita pela importação, criarArquivo e criarDiretório. Nestes métodos é alocado o novo arquivo ou diretório, adicionado a entrada na tabela do diretório
atual e então o diretório atual é atualizado no disco. Os métodos de alocação não fazem nenhuma verificação quanto ao tamanho do arquivo ou espaço ocupado no disco, desta forma um arquivo pode começar a ser alocado porém ser trucado ao final pelo disco nao ter
mais espaço ou o arquivo não suportar mais um bloco indexado por ele.

Gerenciamento de Livres
No método para gerenciamento de livres é varrido o disco inteiro até encontrar 128 blocos que não possuam nome, estes são adicionado a tabela de livres e esta lista é gravada no bloco 0 do disco.
Importação
Uma das partes mais importantes do sistema de arquivos é a importação de arquivos do hd para a imagem do disquete. Esta função é feita pelo comando import, ele abre uma janela nova para ser escolhido o arquivo, então é lido cada byte do arquivo e gravado no
disquete.

Exportação
Igualmente importante, a exportação copia um arquivo do disquete para o hd. Ele cria um arquivo na pasta do projeto com o mesmo nome e extensão do arquivo do disquete e copia cada dado dele para o arquivo no disco.

Formatação
Na formatação ele cria no disco um diretório, que é gravado no bloco 1, este é o diretório raiz, posteriormente ele percorre cada bloco do disco gravando um bloco de dados vazio nos mesmo, então ele atualiza os livres, que nesta fase consistirá dos bloco 2 ao 129 que
são os 128 primeiros blocos livres do disco.

Conclusão
Embora o sistema implementado possua algumas falhas a sua implementação acrescentou muito ao conhecimento sobre essa parte dos sistemas operacionais, parte que é muito importante por hoje em dia os discos rígidos serem o gargalo do desempenho na
computação, portanto qualquer ajuda que o sistema operacional der a esta função é extremamente bem vinda. Também foi verificado a dificuldade que é a implementação de um sistema eficiente por consistir de métodos que podem apresentar erros variados, como o
fato de estar pegando um dado no disco que pode não ser aquilo que é esperado, sendo um dos erros mais difíceis de ser corrigido. O sistema funciona a curta prazo porém pode apresentar problemas a longo prazo, ao ser alocado e desalocado muitos arquivo a
fragmentação pode ser muito grande, porém inclusive a identificação desses problemas acrescentaram ao conhecimento.

References
TanemBaum, A. S. e Woodhull, A. S, (2000) Sistemas Operacionais: projeto e implementação, Bookman, 2ª edição.

You might also like