Você está na página 1de 23

Sistemas Operacionais

Sistemas de Arquivos

1 Introdução
• Problemas da memória virtual:

– Capacidade limitada
– Volátil
– Espaço de endereçamento (em geral) restrito a um processo

Queremos um sistema que permita: 1) Armazenar muitas informações 2)In-


formações permanecerem após o processo terminar 3) Múltiplos processos acessem
a informação simultaneamente

• Alternativas: discos magnéticos, SSDs, fitas, discos óticos

• Operações:

– Ler o bloco k
– Escrever o bloco k
Um HD é apenas um grande conjunto de blocos. Não existem arquivos ou pastas.

• Essas operações são inconvenientes em um sistema grande


Vamos desenvolver abstrações melhores.

Vamos começar com uma visão dos arquivos do ponto de vista do usuário, depois disso,
veremos formas de implementar.

2 Arquivos
• Abstração para um conjunto de dados no disco

1
• Cada arquivo possui um nome que o identifica. Cada Sistema Operacional tem suas
regras de nomeação de arquivos
Usamos um nome em vez de uma posição no disco

Cada sistema operacional tem suas regras para nomear arquivos. No MS-DOS,
até 8 caracteres. Em sistemas mais modernos, até 255. Alguns distinguem entre
maiúsculas e minúsculas. Alguns suportam caracteres especiais, outros não.

Arquivos podem possuir extensões que identificam o programa que é capaz de


tratar aquele arquivo. No UNIX isso é opcional, no Windows as extensões têm sig-
nificado especial.

• Cada arquivo armazena uma sequência de bytes. O significado da informação é dado


pelo programa que as utiliza
Arquivos podem conter caracteres ASCII (exemplo: .txt, .sql, .json) ou podem ser
binários (exemplo: .mp3, .exe)

• O acesso aos dados do arquivo pode ser:

– Sequencial: os bytes do arquivo são lidos na ordem em que estão armazenados,


começando do inı́cio, sem pular bytes
Utilizado quando o meio de armazenamento era a fita.

– Aleatório: os bytes do arquivo podem ser lidos em qualquer ordem


Utilizado hoje, com os discos. Operação fseek permite ler qualquer parte de
um arquivo.

• O Sistema Operacional pode armazenar outras informações sobre cada arquivo: data
de criação/modificação, dono do arquivo, permissões, etc
Outras: arquivo oculto (no Linux usa-se um ponto no nome), última data de
acesso, tamanho do arquivo

• Operações em arquivos: criar, apagar, abrir, fechar, ler, escrever, acrescentar, ir


para posição, renomear, obter atributos, alterar atributos
Em C: Ler usa r, escrever usa w, append usa a.

3 Diretórios
• Permitem criar uma organização hierárquica dos arquivos

2
• Qualquer arquivo pode ser encontrado através de:

– Caminho absoluto: partindo da raiz do sistema de arquivos.


Ex: /home/usuario/musica.mp3
– Caminho relativo: a partir do diretório atual
Ex: ../musica.mp3

• Operações em diretórios: criar, apagar, abrir, fechar, ler, renomear, criar link,
apagar link
Os links aqui são hard links. Também existem os links simbólicos.

Agora começamos a olhar os sistemas de arquivos da perspectiva do Sistema Opera-


cional.

4 Implementação
4.1 Organização do sistema de arquivos
• O setor zero do disco é chamado de Master Boot Record (MBR)

• Ao final da MBR fica a tabela de partições, que contém o inı́cio e fim de cada
partição

• No boot, a BIOS lê e executa a MBR, que localiza a partição ativa e lê seu primeiro
bloco: o bloco de boot

• Quando executado, o bloco de boot carrega o sistema operacional contido na partição

3
A estrutura da partição pode variar muito dependendo do tipo de sistema de arquivos
que ela contém.

4.2 Implementando arquivos


• Como alocar os blocos do disco para os arquivos?

4.2.1 Alocação contı́gua


O disco é uma sequência de caixas de papelão. Só posso armazenar maçãs em caixas
seguidas. A próxima sequência de caixas só pode armazenar laranjas e assim sucessi-
vamente.

• Cada arquivo fica em um espaço contı́guo do disco

• Vantagens:

– Simples de implementar
Basta saber o inı́cio e o tamanho de cada arquivo.

– Excelente performance de leitura


Posicionamos a cabeça de leitura uma única vez.

• Desvantagens:

4
– Fragmentação

• Aplicações: sistemas de arquivo somente-leitura (ex.: CDs e DVDs)

4.2.2 Alocação por lista encadeada


Cada caixa contém um bilhete dizendo qual a próxima caixa que contém aquela mesma
fruta.

• A primeira palavra de cada bloco é usada como um ponteiro para o próximo bloco
daquele arquivo

• Vantagens:

– Não gera “buracos” (fragmentação)

• Desvantagens:

– Acesso aleatório extremamente lento


– Usa parte de cada bloco para armazenar os ponteiros

4.2.3 Alocação por lista encadeada com tabela em memória


A tabela contém o número da próxima caixa a conter aquela fruta.

5
• Armazena os ponteiros em uma tabela na memória em vez de usar espaço dos blocos

• A tabela é chamada de File Allocation Table (FAT). Era utilizada no MS-DOS.

• Vantagens:

– Não ocupa mais parte dos blocos


– Acesso aleatório mais rápido (informações em memória)

• Desvantagens:

– A FAT precisa sempre estar em memória (ex.: disco de 1TB com blocos de 1KB,
FAT ocupa até 3GB)

4.2.4 Alocação por i-nodes


Cada i-node é um post-it contendo o número das caixas que contém maçãs. Se o número
de caixas não é suficiente, o final do post-it indica uma caixa cheia de outros post-its
com endereços das outras caixas de maçã.

• Cada i-node representa um arquivo e contém os endereços dos blocos ocupados por ele

• Se o arquivo for maior que o número de blocos no inode, usamos um bloco do disco
contendo apenas endereços de outros blocos

6
• Vantagens:

– Somente os i-nodes de arquivos abertos precisam estar em memória


– O tamanho dos i-nodes independe do tamanho do disco

4.3 Implementando diretórios


• A função principal do sistema de diretórios é mapear o caminho completo de um arquivo
para a posição do arquivo no disco (alocação contı́gua), o número do primeiro bloco
(lista encadeada) ou número do i-node

• Tamanho do nome do arquivo:

– Tamanho fixo: simples de implementar


∗ Simples de implementar
∗ Nomes muito curtos são inconvenientes
8 caracteres no MS-DOS
∗ Nomes muito longos desperdiçam espaço
– Tamanho variável:

7
∗ Cada entrada do diretório tem tamanho diferente
∗ Quando um arquivo é removido do diretório, ficamos com um buraco de
tamanho variável na tabela
∗ Compactar a tabela não é muito custoso (a tabela fica em memória)
– Tamanho variável com nomes em um heap:

8
∗ As entradas têm tamanho fixo
∗ Quando um arquivo é removido, o buraco pode ser posteriormente ocupado
por outra entrada

4.4 Arquivos compartilhados


• Possibilidade de um mesmo arquivo existir em mais de um diretório
• Hard-link: cada diretório possui uma entrada apontando para um mesmo i-node

Cabe ao sistema operacional armazenar no inode o número de diretórios que apon-


tam para aquele arquivo e tratar o caso especial no momento da exclusão.

• Link simbólico: um arquivo especial contém o caminho do arquivo a que ele se refere

9
Aqui cada inode é referenciado por apenas um diretório. Ao excluir o arquivo real,
o link simbólico não é alterado, mas deixa de funcionar.

Com links simbólicos, podemos inclusive referenciar arquivos em outras máquinas


via rede.

4.5 Journaling
• Objetivo: tornar o sistema mais resistente a falhas
• Ideia: manter um registro do que o sistema de arquivos vai fazer, antes que as ações
sejam feitas
• Usado em sistemas como NTFS e ext4
O primeiro sistema com journaling no Linux foi o ReiserFS. Posteriormente, o ext3
também ganhou suporte. O ReiserFS foi descontinuado após seu criador ser conde-
nado por homicı́dio de sua esposa.

• Exemplo: Apagar um arquivo envolve:


– Remover o arquivo do diretório
– Liberar o i-node do arquivo
– Liberar os blocos utilizados pelo arquivo
• Se ocorre uma falha durante uma delas, o sistema de arquivos fica inconsistente.
Primeira operação executa antes da falha: i-node e blocos do disco ficam in-
acessı́veis.
Primeira e segunda operações ocorrem antes da falha: blocos do disco ficam perdi-
dos
Segunda operação ocorre antes da falha: a entrada do diretório continua apon-
tando para o i-node, que será reutilizado no futuro. O diretório passa a ter um
arquivo diferente.
Terceira operação ocorre antes da falha: i-node aponta para blocos marcados como
livres, que serão reutilizados posteriormente.

• Um sistema com journaling cria um registro com a lista de operações a serem realizadas
e escreve o registro no disco.
• Após a escrita, o sistema começa a realizar as operações. Ao final das operações, o
registro é apagado.
• Se ocorre uma falha, o sistema verifica no registro se existem operações pendentes. Se
houver, todas elas são executadas.
• Operações devem ser idempotentes, isto é, podemos repetı́-las quantas vezes for
necessário.

10
– Marque o i-node k como livre: idempotente
– Remova o arquivo x de um diretório: idempotente
– Adicione os blocos do i-node K ao fim da lista de blocos livres: não-idempotente
– Busque na lista de blocos livres e adicione o bloco n caso ele não esteja presente:
idempotente

Exemplo: a = 4 é idempotente, a++ não é. Em HTTP, o método GET é idempo-


tente, POST não é.

4.6 Sistemas de arquivos virtuais


• Abstrai sistemas de arquivos diferentes por meio de uma interface em comum

Processo sshfs

Sistema de Arquivos Virtual

ext4 NTFS FAT32 NFS FUSE

Part. 1 Part. 2 pendrive


disco

5 Gerência e otimização de sistemas de arquivos


5.1 Gerência do espaço em disco
• Tamanho dos blocos:
– Blocos muito grandes geram desperdı́cio
– Blocos muito pequenos diminuem a performance
Tempo de busca do disco é significativo.

– Em geral, usa-se blocos de 1KB a 4KB, mas com o aumento do tamanho dos discos,
o desperdı́cio gerado por blocos maiores (ex.: 64KB) se torna menos significativo

11
• Controle dos blocos livres:

– Lista de blocos livres:


∗ Utiliza os próprios blocos livres para armazenar os números dos blocos disponı́veis,
além de um ponteiro para o próximo bloco que contenha a continuação da
lista
∗ “Não ocupa espaço”, já que os blocos utilizados pela lista estão livres.
Bloco de 1KB, endereços de 32 bits: 255 endereços por bloco.

– Mapa de bits:
∗ Armazenado no disco, utiliza um bit para indicar a situação de cada bloco
do disco
∗ Ocupa menos espaço que a lista de blocos livres
∗ Requer parte do disco reservada para o mapa

12
– Em ambas as técnicas, apenas um bloco de informação precisa ficar em memória.
O restante fica no disco.

• Cotas:

– Restringir o espaço/número de arquivos máximo utilizado por um usuário


Restrição no número de arquivos é importante para evitar que se usem todos
os i-nodes.
– O Sistema Operacional pode armazenar uma tabela com as cotas de cada usuário.
– Quando usuário abre um arquivo e adiciona dados a ele, isso é contabilizado na
tabela de cotas

• Backups:

– Permitem recuperar arquivos perdidos


– Nem todos os dados precisam ser copiados
Executáveis, arquivos temporários, arquivos especiais do /etc...

– Pode ser incremental, copiando apenas os arquivos que foram alterados desde o
último backup
Exemplo: um backup completo por semana, um backup incremental por dia

13
– Os dados podem ser comprimidos, mas isso pode tornar os dados mais sensı́veis
a falhas na mı́dia de backup
– Se o sistema não pode parar durante o backup, pode-se utilizar técnicas para
obter um snapshot do estado atual do sistema de arquivos
Estruturas crı́ticas são copiadas e, durante o backup, todas as operações acon-
tecem em cópias dos blocos.

– Cópia fı́sica: o disco é copiado bloco a bloco para outra mı́dia


∗ Pode copiar blocos não utilizados, blocos defeituosos e arquivos desnecessários

Arquivos desnecessários como arquivos de paginação e hibernação.


Alguns blocos defeituosos são tratados pelo próprio controlador do disco
de maneira transparente para o Sistema Operacional. Blocos extras ao
final de cada faixa substituem os blocos defeituosos. Os blocos defeituosos
que não são detectados pelo controlador podem ser tratados pelo Sistema
Operacional durante a formatação. Um “arquivo” fictı́cio contendo todos
os blocos defeituosos garante que eles não serão usados.
∗ Não permitem selecionar quais arquivos serão copiados.
– Cópia lógica:
∗ Copia somente os arquivos e diretórios especificados
É a forma mais comum de backup.

5.2 Consistência
• Se ocorre uma falha durante a escrita de um bloco, o sistema de arquivos pode ficar
inconsistente

• Ferramentas podem verificar o estado do sistema de arquivos (fsck no Linux, sfc no


Windows)

• Consistência de blocos:

– Verifica se cada bloco pertence a um único arquivo ou à lista de blocos livres


– Utiliza duas tabelas, cada uma com um contador para cada bloco, iniciado em
zero
– A primeira tabela conta quantas vezes um bloco aparece em um arquivo
– A segunda tabela conta quantas vezes cada bloco aparece na lista de blocos livres
– Obtém-se a lista de inodes e para cada bloco pertencente a um arquivo, incrementa-
se o contador correspondente da primeira tabela
– Depois, percorre-se a lista de blocos livres e incrementa-se o contador correspon-
dente na segunda tabela

14
– Sistema de arquivos consistente: todos os blocos devem possuir o valor 1 em
apenas um dos contadores

– Bloco perdido: bloco não aparece em nenhuma das tabelas. Não causa prob-
lemas, mas desperdiça espaço. O bloco perdido é adicionado à lista de blocos
livres.

Bloco 2 perdido

– Bloco livre duplicado: o bloco aparece duas vezes na lista de blocos livres.
Basta reconstruir a lista de blocos livres.

Bloco 4 duplicado.

– Bloco usado duplicado: o bloco aparece em mais de um arquivo. Se um dos


arquivos é removido, o bloco é colocado na lista de blocos livres. Se o outro
arquivo também é removido, o bloco aparece duas vezes na lista de blocos livres.
Deve-se criar uma cópia do bloco para cada arquivo em que ele aparece. Um dos
arquivos provavelmente estará danificado, mas a estrutura do sistema de arquivos
volta a ficar consistente.

15
Bloco 5 duplicado.

• Consistência de diretórios:

– Utiliza uma tabela com um contador por arquivo (i-node)


– Percorre-se toda a estrutura de diretórios, incrementando o contador de cada
arquivo a cada vez que ele é encontrado em um diretório
– Um arquivo pode aparecer em mais de um diretório, devido a hard-links
– Resultado esperado: os contadores da tabela são iguais aos números de links
armazenados nos i-nodes
– Contador do i-node ¿ contador da tabela: mesmo se todos os arquivos forem
apagados do diretório, o contador do i-node não será zero e o arquivo não será
removido, desperdiçando espaço. A solução é ajustar o contador de links do i-node
para o valor correto
– Contador do i-node ¡ contador da tabela: quando o arquivo for excluı́do em
um dos diretórios, o contador do i-node chegará a zero e o arquivo será excluı́do.
O outro diretório passará a referenciar um i-node inválido. A solução também é
ajustar o contador de links do i-node para o valor correto

• Outras verificações também são realizadas para garantir que o sistema está
consistente
Número de i-node maior que o número de i-nodes do disco, permissão maior de
acesso para outros que para o dono do arquivo, diretórios com muitos arquivos,
etc...

5.3 Performance
• Acesso ao disco é lento. Sistemas de arquivos podem usar otimizações para melhorar
a performance

• Cache:

– Blocos acessados são colocados em um cache em memória para acelerar futuros


acessos a eles
– Uma tabela hash é usada para determinar rapidamente se um bloco está no cache
ou não

16
– Mudanças no bloco são feitas em memória e só escritas no disco quando o bloco
sai do cache
– Para alguns blocos isso não é desejável (ex.: blocos contendo i-nodes). Esses
blocos podem ser escritos no disco com mais prioridade que os demais
Queremos que esses blocos sejam escritos o mais rápido possivel, pois se hou-
ver uma falha os dados são perdidos

– Os demais blocos também não devem ficar indefinidamente no cache. No caso de


uma falha, os dados seriam perdidos.
Exemplo: pessoa escrevendo documento no Word. Mesmo salvando periodica-
mente, os dados poderiam ser perdidos.

– De tempos em tempos os blocos no cache são escritos no disco


– Outra possibilidade é usar caches com escrita direta (write-through), onde todas
as escritas no bloco são escritas no disco imediatamente
Remoção de pen-drive sem ejetar com segurança.

• Leitura antecipada de blocos:

– Arquivos em geral são lidos sequencialmente.


– Quando um bloco k é solicitado, podemos trazer também para o cache o bloco
k + 1, que provavelmente será acessado em seguida
– Útil para acesso sequencial, mas ruim para acesso aleatório
– O sistema de arquivos pode monitorar o tipo de acesso que está sendo feito no
arquivo

• Redução do movimento do braço do disco:

– Armazenar blocos de um arquivo em sequência no disco acelera a leitura


– Encontrar conjuntos de blocos livres é fácil em um mapa de bits
– Com uma lista de blocos livres, pode-se agrupar blocos livres consecutivos
– Localização dos i-nodes:
∗ Cada acesso a um arquivo requer dois acessos ao disco (um para o i-node e
outro para os dados)
∗ Em geral, i-nodes são colocados no inı́cio do disco

17
∗ Pode-se colocar os i-nodes na metade do disco, diminuindo pela metade o
deslocamento médio do braço
∗ Também pode-se dividir o disco em grupos de cilindros, cada qual com seus
próprios blocos de i-nodes e lista de blocos livres
Criar um novo arquivo, tenta-se selecionar um bloco livre no mesmo
grupo onde ficará o i-node ou em um grupo próximo.

• SSDs:

– Em discos de estado sólido (SSDs), acessos aleatórios são tão rápidos quanto os
sequenciais, eliminando os problemas acima
– A limitação dos SSDs está no limite de vezes que cada bloco pode ser escrito

18
– Os dados são distribuı́dos de maneira a tentar distribuir igualmente o desgaste
dos blocos

5.4 Desfragmentação
• Com a criação e exclusão de arquivos, o disco se torna fragmentado com o tempo

• O processo de desfragmentação busca remover os buracos que foram sendo criados,


tornando a região livre contı́nua

• Versões atuais do Windows fazem isso periodicamente de maneira automática

• Linux sofre menos fragmentação, pois os arquivos são espalhados por todo o disco,
deixando grandes regiões de espaço livre entre eles

• Nunca se deve desfragmentar um SSD

5.5 RAID
• Baseia-se na ideia de que combinar vários discos baratos pode fornecer mais capacidade,
performance e confiabilidade que um único disco mais caro.

• As diversas organizações possiveis para os discos são chamadas de niveis.

• RAID pode ser implementado por software ou utilizando hardware dedicado.

• RAID 0:
RAID 0

A1 A2
A3 A4
A5 A6
A7 A8
A9 A10

Pode haver mais de dois discos.

– Armazena os segmentos de dados de maneira alternada nos discos.


– Se um dos discos falhar, todos os dados são perdidos.
– A capacidade total do sistema é a soma das capacidades dos discos.

19
– Multiplica a velocidade das operações de leitura e escrita pelo número de discos,
já que as operações podem ser realizadas em paralelo.

• RAID 1:
RAID 1

A1 A1
A2 A2
A3 A3
A4 A4
A5 A5

Pode haver mais de dois discos.

– Os dados são armazenados em dois discos.


– Operações de leitura podem ser mais rápidas.
– Operações de escrita são limitadas pelo disco mais lento.
– Suporta a falha de um disco.

• RAID 2:
RAID 2

A1 A2 A3 A4 Ap1 Ap2 Ap3


B1 B2 B3 B4 Bp1 Bp2 Bp3
C1 C2 C3 C4 Cp1 Cp2 Cp3
D1 D2 D3 D4 Dp1 Dp2 Dp3
E1 E2 E3 E4 Ep1 Ep2 Ep3

Indicar que são bits.

– Os dados são distribuı́dos nos discos bit a bit.


– 4 discos armazenam os bits da informação.

20
– 3 outros discos armazenam bits de paridade.
– Utiliza código de Hamming, capaz de detectar erros em até dois bits e recuperar
erros de um bit.
– Todos os discos precisam estar sincronizados.
– Suporta a falha de um disco.
– Não é mais utilizado devido ao baixo custo-benefı́cio.

• RAID 3:
RAID 3

A1 A2 A3 A4 Ap1-4
B1 B2 B3 B4 Bp1-4
C1 C2 C3 C4 Cp1-4
D1 D2 D3 D4 Dp1-4
E1 E2 E3 E4 Ep1-4

Indicar que são bits.

– Os dados são distribuı́dos nos discos bit a bit.


– Utiliza um disco para armazenar bits de paridade.
– Requer que os discos estejam sincronizados.
– Suporta a falha de um disco.
– Pouco usado na prática.

• RAID 4:

21
RAID 4

A1 A2 A3 A4 Ap1-4
B1 B2 B3 B4 Bp1-4
C1 C2 C3 C4 Cp1-4
D1 D2 D3 D4 Dp1-4
E1 E2 E3 E4 Ep1-4

– Divide os dados em blocos, alternando entre os discos.


– Utiliza um disco para armazenar informação de paridade (funciona como um
RAID 0 com paridade)
– Qualquer alteração requer que os bits de paridade sejam recalculados, fazendo
com que o disco de paridade se torne um gargalo.
– Suporta a falha de um disco.

• RAID 5:
RAID 5

A1 A2 A3 A4 Ap
B1 B2 B3 Bp B4
C1 C2 Cp C3 C4
D1 Dp D2 D3 D4
Ep E1 E2 E3 E4

– Semelhante ao RAID 4, mas distribui as informações de paridade por todos os


discos.
– Suporta a falha de um disco.

• RAID 6:

22
RAID 6

A1 A2 A3 Ap Aq
B1 B2 Bp Bq B3
C1 Cp Cq C2 C3
Dp Dq D1 D2 D3
Eq E1 E2 E3 Ep

– Semelhante ao RAID 5, mas adiciona mais informações de paridade.


– Todo sistema que suporta a falha simultânea de dois discos é considerado RAID
6.

• Além dos nı́veis padrão do RAID, é possı́vel combinar vários nı́veis.


• RAID 1+0 (ou RAID 10):

RAID 0

RAID 1 RAID 1

A1 A1 A2 A2
A3 A3 A4 A4
A5 A5 A6 A6
A7 A7 A8 A8
A9 A9 A10 A10

– Dois arranjos RAID 1 conectados em RAID 0.


– Se ao menos um disco em cada arranjo RAID 1 estiver intacto, os dados continuam
acessı́veis.

23

Você também pode gostar