# Introdução aos Sistemas Operacionais/Sistemas de arquivos

Os sistemas de arquivos estruturam a informação guardada em uma unidade de armazenamento, podendo ser representada de forma textual ou graficamente utilizando um gerenciador de arquivos. A maioria dos sistemas operacionais possuem seu próprio sistema de arquivos.
O habitual é utilizar dispositivos de armazenamento de dados que permitem o acesso aos dados como uma corrente (cadeia) de blocos de um mesmo tamanho, às vezes chamados setores, usualmente de 512 bytes de largura. O software do sistema de arquivos é responsável pela organização destes setores em arquivos e diretórios e mantém um registo de que setores pertencem a que arquivos e quais não têm sido utilizados. Na prática, um sistema de arquivos também pode ser utilizado para acessar dados gerados dinamicamente, como os recebidos através de uma conexão de rede (sem a intervenção de um dispositivo de armazenamento).
Em geral os sistemas de arquivos proveem métodos essenciais para criar, mover, renomear e eliminar tanto arquivos como diretórios. Outros permitem a criação de enlaces (links) adicionais a um diretório ou arquivo (enlace duro ou hard links em Unix).
A estrutura de diretórios costuma ser hierárquica, ramificada ou "em árvore", ainda que pode ser plana. Em alguns sistemas de arquivos os nomes de arquivos são estruturados, com sintaxes especiais para extensão de arquivos e números de versão. Em outros, os nomes de arquivos são simplesmente correntes de texto (ou strings de texto, em inglês) e os metadados da cada arquivo são alojados separadamente.
Nos sistemas de arquivos hierárquicos, usualmente, declara-se a localização precisa de um arquivo com uma corrente de texto (string de texto, em inglês) chamada "rota" ou "caminho" — ou path em inglês —. A nomenclatura para rotas - ou caminho - varia ligeiramente de sistema em sistema, mas mantêm pelo geral uma mesma estrutura. Uma rota vem dada por uma sucessão de nomes de diretórios e subdiretórios, ordenados hierarquicamente de esquerda a direita e separados por algum caractere especial que costuma ser uma barra ('/') ou barra invertida ('\') e pode terminar no nome de um arquivo presente ao último ramo de diretórios especificada.
Adaptado de: http://pt.wikilingue.com/es/Sistema_de_arquivos

## Características dos sistemas de arquivos

* Segurança ou permissões
* listas de controle de acesso (ACLs)
* Mecanismo para evitar a fragmentação
* Capacidade de enlaces simbólicos (symbolic links) ou duros (hard links)
* Integridade do sistema de arquivos (Journaling)
* Suporte para arquivos dispersos
* Suporte para quotas de discos
* Suporte de crescimento do sistema de arquivos nativo
Mais informações podem ser vistas em Tanenbaum

## Conceitos de arquivos

Observações sobre o mapa conceitual acima:
* Arquivos de texto Windows por padrão são codificados em ASCII e não em Unicode.
* Arquivos de texto Unix por padrão são codificados em Unicode e não em ASCII.
* O termo "arquivos de repositório" não é uma terminologia reconhecida, tudo indica que se quis dizer "arquivos de dados".

### Tipos de Arquivos

Geralmente os Sistemas Operacionais suportam vários tipos de arquivos. O Unix e o Windows, por exemplo, suportam diretórios e arquivos organizados em sequência de bytes, sequência de registros e árvores, conhecidos como arquivos regulares. O Unix, em especial, suporta além dos tipos regulares, arquivos de dispositivo de caracteres e de blocos. Os arquivos de dispositivo de caracteres são utilizados para modelar dispositivos de E/S, tais como terminais, redes, impressoras. Já os arquivos de dispositivo de blocos dão suporte aos dispositivos de armazenamento em massa tais como discos e pen-drive.

### Nomes de Arquivos

Nomear os arquivos é uma tarefa importante, pois será através do nome que um arquivo será encontrado no sistema de arquivos. Por exemplo, uma aplicação cria um arquivo chamado "dados.txt" e com esse nome outras aplicações poderão acessar este mesmo arquivo.
As regras referentes a nomenclatura de arquivos variam de acordo com o sistema de arquivos. Alguns sistemas de arquivos não fazem distinção de letras maiúsculas ou minúsculas, enquanto outros aceitam apenas caracteres em maiúsculo.
O tipo do arquivo pode ser indicado na extensão do mesmo, que é uma última parte escrita após um ponto(.) no nome do arquivo. Alguns sistemas operacionais utilizam essa extensão para automatizar as ações referentes aquele arquivo. Por exemplo, no Windows um arquivo com extensão '.txt' é interpretado como um documento de texto, e ao executá-lo o sistema já procura uma aplicação que trata este tipo de arquivo, como um editor de texto.

### Operações com Arquivos

Seguem uma descrição das operações em arquivos encontradas na maioria dos sistemas de arquivo:
* Criação: criação sem escrita de dado algum.
* Destruição: remoção do arquivo para liberação do espaço.
* Abertura: abertura do arquivo, para colocar na memória os atributos e a lista de endereços para tornar as operações posteriores mais rápidas.
* Fechamento: remover as referências do arquivos da memória principal.
* Leitura: abertura do arquivo para leitura do seu conteúdo.
* Escrita: processo de escrita do arquivo. Geralmente a escrita começa a partir de onde estiver o ponteiro, caso esse ponteiro esteja no final do arquivo ou durante a escrita o final for atingido, o arquivo aumentará de tamanho.
* Concatenação: forma de escrita que só permite adicionar dados no final do arquivo
* Busca: chamada que coloca o ponteiro em uma posição específica do arquivo. Depois dessa chamada, dados podem ser lidos/escritos a partir daquela posição.
* Ver atributos: essa chamada verifica certos atributos como permissões, por exemplo. Às vezes é necessário escrever em um arquivo, porém é necessário verificar se esse arquivo possui permissão de escrita.
* Definir atributos: Serve para definir ou alterar os atributos de certos arquivos. Flags de proteção podem ser definidas com essa chamada.
* Renomeação: Chamada de sistema para renomear um arquivo.

## Implementação de arquivos

A criação de arquivos exige que o sistema operacional tenha controle de quais áreas ou blocos no disco estão livres. É importante o controle de quais blocos de discos estão relacionados a quais arquivos. Este gerenciamento pode ser feito de várias formas: Alocação contígua, alocação por lista encadeada, alocação indexada e alocação combinada .

### Alocação contígua

É o esquema mais simples de alocar e armazenar os arquivos no disco. Consiste em armazenar um arquivo em blocos sequencialmente dispostos. Neste tipo, o sistema localiza um arquivo através do endereço do primeiro bloco e da sua extensão em blocos.
Este tipo de alocação apresenta duas vantagens significativas.
* É bastante simples de implementar e de realizar o controle sobre os onde os blocos estão.
* O desempenho de leitura é excelente, pois todo o arquivo pode ser lido em uma única operação a partir do primeiro bloco de dados.
No entanto este tipo de implementação apresenta uma grande problema: Fragmentação do disco. Como os arquivos podem ser criados e eliminados frequentemente, os segmentos livres vão se fragmentando em pequenos pedaços por todo o disco. O problema pode tornar-se crítico quando um disco possui blocos livres disponíveis, porém não existe um segmento contíguo em que o arquivo possa ser alocado.
O problema da fragmentação pode ser contornado através de rotinas que reorganizem todos os arquivos no disco de maneira que só exista um único segmento de blocos livres. Este procedimento, denominado desfragmentação, geralmente utiliza uma área de trabalho no próprio disco ou em fita magnética.
A alocação contígua é amplamente utilizada em CD-ROMS e em discos apenas para leitura. Neles o tamanho do arquivo é conhecido anteriormente e nunca vai ser alterado.

### Alocação por lista encadeada

Alocação encadeada consiste em manter os arquivos, cada um, como uma lista encadeada de blocos de disco. Dessa forma uma parte de cada bloco é usada como ponteiro para o próximo bloco. O restante do bloco é usado para dados.
Uma vantagem desse tipo de alocação é que o tamanho do arquivo não precisa ser conhecido antes de sua criação, já que cada bloco terá um ponteiro para o próximo bloco. Assim o fato de o disco estar fragmentado não ocasiona problemas para a criação do arquivo.
O problema deste tipo de alocação é o tempo de leitura extremamente lento. O acesso deverá ser sempre sequencial. Assim para acessar um bloco intermediário será necessário percorrer o arquivo desde o inicio.

### Alocação indexada

Alocação indexada é uma forma de resolver o problema do tempo de leitura da alocação por lista encadeada. Isso é feito por meio de uma tabela de endereços dos blocos ocupados pelo arquivo. Para cada novo bloco alocado, inclui-se mais um novo item na tabela.
Usando alocação indexada, o acesso aleatório fica mais fácil, pois não é necessário percorrer todos os blocos de forma sequencial, o endereço de cada bloco fica preto e o sistema fica branco

### Alocação combinada

Outra abordagem é a alocação combinada, envolvendo o uso de blocos de índices e de encadeamento dos mesmos. Essa técnica combina a baixa ocupação de espaço em memória da técnica de lista encadeada e o bom desempenho da técnica de tabela de índices.
No método de alocação combinada é usado uma técnica chamada de níveis de indireção na indexação. Nesta técnica, parte de um bloco é utilizado para apontar diretamente blocos de dados, chamado de apontadores diretos, e outra parte é utilizada pode ser utilizada para apontadores para blocos, chamado de apontadores indiretos. Se usarmos outros níveis de apontadores, podemos estender essa mesma técnica para apontadores duplamente indiretos e apontadores triplamente indiretos.
Esta abordagem é tipicamente utilizada na implementação do sistema de arquivos Unix, chamada de I-nodes. Um I-node (index-node) são os metadados, armazenado em estrutura de dados própria, que relaciona atributos e os endereços dos blocos de um arquivo.

## Múltiplos sistemas de arquivos

Os sistemas atuais podem acessar vários sistemas de arquivos ao mesmo tempo. Isto é feito de forma transparente ao usuário e as diferenças no formato dos descritores de arquivos de cada sistema são espelhadas em descritores virtuais que o sistema operacional mantém.
Soluções envolvendo a coexistência simultânea de vários sistemas de arquivos no mesmo sistema operacional, começaram a surgir a partir dos anos 80. A princípio, surgiram três soluções, que tiveram um maior destaque nesse sentido(para o sistema operacional UNIX), são elas:
* File System Switch da AT&T
* arquitetura "gnode" da Digital Equipament Corporation
* Virtual File System da Sun (Solução abordada neste trabalho para exemplificar)
A ideia básica abordada por estas soluções é fazer com que o sistema operacional suporte diversos sistemas de arquivos diferentes simultaneamente. A solução empregada para facilitar a inclusão de novos sistemas de arquivos, foi inspirada na gerência de periféricos.

### Virtual File System

VFS é uma camada de abstração entre a aplicação e as implementações do sistema de arquivos. O VFS pode, por exemplo, ser usado para acessar dispositivos de armazenamento locais e de rede de forma transparente, sem que a aplicação cliente perceba a diferença.
O propósito principal de um VFS é permitir que as várias aplicações clientes possam acessar diversos tipos de sistemas de arquivos concretos de uma maneira uniforme.

### Mapa Conceitual ilustrando o conceito de múltiplos sistemas de arquivos
## Cache de sistemas de arquivos

Uma cache de disco pode ser definida como parte da memória RAM ou memória buffer cache, utilizada para acelerar o acesso aos dados que estão sendo mais frequentemente requeridos. Para isso a cache de disco pode ser implementado de duas formas principais:
1 - Através da memória RAM inserida no próprio disco rígido.
2 - Utilização de parte da memória RAM.
Representação da localização da memória Buffer Cache:
Caches de disco rígido são mais eficientes, mas são também muito mais caras. Todos os disco rígidos modernos possuem uma cache interna. Para complementar a cache interno, os sistemas operacionais criam um segundo cache usando a memória RAM.
Caches de disco funcionam armazenando os dados mais acessados. Quando um programa precisa acessar um novo dado, o SO primeiramente verifica se os dados estão na cache antes de lê-lo do disco. Isso porque o acesso à memória RAM é muito mais rápido do que o acesso ao disco.

### Vantagens e Desvantagens da Buffer Cache

* Minimização do número de transferências entre o disco e a memória (cache hits);
* O acesso a disco é tratado de uma forma uniforme.Existe apenas uma interface para acessar os dados de um disco;
* Ajudar a manter a coerências dos blocos. Se dois processos tentam acessar o mesmo bloco a buffer cache ordena os acessos;
* Torna o sistema mais vulnerável a acidentes de parada total (falta de energia, por exemplo) ("crashes");
* Torna a transferência de grandes quantidades de informação mais lenta.
Buffers
O número de buffers é configurável de acordo com a memória disponível e o tipo de utilização do sistema. Cada buffer é constituido de 2 partes:
1 - Zona que contém a cópia de um bloco do disco.O mesmo buffer pode guardar blocos de discos diferentes em instantes diferentes.
2 - Cabeçalho que contém informação de controle sobre esse buffer.
Segue um mapa conceitual que ilustra os conceitos de mapeamento da memória cache do sistemas de arquivos:

## Gerência de Espaço livre

O monitoramento de espaço livre em um disco é realizado principalmente através de dois diferentes métodos:lista encadeada e mapa de bits.Esses métodos são descritos abaixo.

### Lista Encadeada

Nesta forma de gerenciamento, primeiramente é preciso entender que os blocos livres são blocos que não contém arquivos (de usuários e programas). Entretanto os mesmos não ficam em branco, pois enquanto não estão sendo utilizados, eles contém informações que o Sistema Operacional armazena para mapear o espaço livre. Ou seja, estes blocos estão livres porém não estão vazios.
Desta forma cada bloco livre no disco possui ponteiros para os seguintes espaços livres em disco. Assim, se considerarmos que um bloco possui um tamanho de 1 KBytes, e um ponteiro tem tamanho de 32 bits, dentro de um bloco livre temos 255 ponteiros para os próximos blocos livres do disco(uma entrada é reservada ao ponteiro para o bloco seguinte).

### Mapa de Bits

Nesta forma de gerenciamento, é utilizado um espaço fixo adicional em disco especificamente para o mapeamento do espaço livre, de forma que para cada bloco em disco é utilizado um bit no mapa.Sendo assim, um disco com n blocos requer um mapa de bits com n bits. Não surpreende,portanto, que os mapas de bits requeiram menos espaço, já que ele usa 1 bit por bloco, contra 32 bits no modelo de lista encadeada. Somente se o disco estiver quase cheio é que o esquema de lista encadeada precisará de menos blocos que o mapa de bits. Por outro lado, se houver muitos blocos livres, alguns deles poderão ser emprestados para conter a lista de livres sem qualquer perda de capacidade de disco.
Para um mapa de bits,é possível manter apenas um bloco na memória e usar o disco somente quando o bloco tornar-se cheio ou vazio.
Uma vantagem dessa estratégia é que as alocações em um bloco único de mapa de bits faz com que os blocos de disco fiquem próximos uns dos outros, minimizando assim os movimentos dos braços de leitura do disco.

### Mapa Conceitual sobre a gerência de espaço livre

http://www.lastfm.com.br/music/The+Great+Gonzo/+images/241888

## Conceitos de diretórios

(a ser escrito)

## Implementação de diretórios

(a ser escrito)