Sistemas de Informação
Wagner Arbex
arbex AT jf.universo.edu.br
arbex AT arbex.pro.br
Fevereiro/2010
Sumário
Lista de Figuras
Lista de Tabelas
Lista de Algoritmos p. 8
Apresentação p. 9
3 Processos p. 26
4 Gerência de memória p. 40
4.4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 45
4.4.5 Segmentação . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 48
5 Sistemas de arquivos p. 51
5.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 51
Referências p. 59
Lista de Figuras
2 Arquitetura SISD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 13
3 Arquitetura MISD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 14
4 Arquitetura SIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 14
5 Arquitetura MIMD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 15
22 Alocação indexada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
1 Classificação de Flynn. . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 13
Lista de Algoritmos
Apresentação
sse texto é indicado para estudos iniciais em sistemas operacionais, fornecendo uma
E visão abrangente, mas, não aprofundada, dos fundamentos dos sistemas operacionais,
definindo os conceitos fundamentais e básicos, seus aspectos e mecanismos, diferenciando
os modelos conceitual a de implementação dos sistemas operacionais para permitir a
compreensão de suas funcionalidades e tarefas. Destina-se a alunos dos primeiros períodos
dos cursos de Análise de Sistemas e Sistemas de Informação e, de forma alguma, substitui
textos clássicos, tais como Tanenbaum (2003) e Oliveira, Caríssimi e Toscani (2004), que,
inclusive, são largamente utilizados na elaboração do conteúdo1 aqui exposto.
A motivação para a elaboração do presente texto está no fato de que, o correto en-
tendimento dos mecanismos presentes nos sistemas operacionais permite, ao profissional
de informática, uma melhor compreensão do escopo do seu trabalho, bem como, do seu
ambiente de trabalho, resultando no desenvolvimento de soluções com maior qualidade e
eficiência. Assim, esse texto busca fornecer ao futuro profissional de sistemas um conheci-
mento fundamental para atuar nas áreas de suporte, seleção e recomendação de sistemas
operacionais, além disso, visão básica do desenvolvimento e implementação de um sis-
tema operacional e, principalmente, fornecer subsídios necessários para a compreensão do
funcionamento dos sistemas operacionais.
Assim, qualquer pessoa que utilize um sistema de computação deve saber que existe
um software chamado sistema operacional, que de alguma forma controla os recursos do
sistema de computação, qualquer que seja o seu tipo ou porte. Sistemas operacionais
são necessários nos mais simples microcomputadores domésticos ou nos mais sofisticados
supercomputadores de institutos de pesquisa ou de grandes corporações.
12
Como exemplo, serão tratados sistemas que fazem parte do cotidiano, basicamente,
microcomputadores e estações de trabalho, e a Figura 1 mostra a organização típica desses
dois tipos de sistemas (arquitetura von Neumann1 ).
A memória principal armazena tanto as instruções que são executadas pelo proces-
sador como os dados que serão manipulados. As interfaces de entrada e de saída são as
portas de comunicação para o mundo externo, às quais estão conectados os dispositivos
periféricos, tais como, vídeo, teclado, discos e impressora.
Na classe SISD (Figura 2), um único fluxo de instruções atua sobre um único fluxo
de dados. Nessa categoria se encaixam os computadores com um único processador que
possuem um único elemento processador, que enquadra as máquinas von Neumann tra-
dicionais com apenas um processador, como microcomputadores pessoais e estação de
trabalho. As instruções são executadas seqüencialmente, mas o procedimento de execu-
ção pode ser subdividido em diferentes etapas de execução em série, como em um pipeline.
Na classe MISD (Figura 3), múltiplos fluxos de instruções atuariam sobre um único
fluxo de dados, onde diferentes unidades de processamento executariam diferentes instru-
ções sobre um mesmo fluxo de dados. Na prática, diferentes instruções deveriam operar
14
a mesma posição de memória ao mesmo tempo. Tal situação, até os dias atuais, não faz
o menor sentido, assim não existem sistemas que representem essa classe.
Essa classe pode ser subdividida em duas subclasses de acordo com o tipo de me-
mória, se compartilhada ou não (Figura 6). Máquinas com memória compartilhada são
conhecidas como multiprocessadores, enquanto que a demais são denominadas multicom-
15
_ _ _ _ _ _ _ _ _/ MULTIPROCESSADORES
_ _ _/ BASEADOS EM BARRAMENTOS
_ _ _ _ _ _ _ _/ COMUTADOS
São os mais simples e foram largamente utilizados. Permitiam que somente um pro-
grama por vez fosse processado, ou seja, somente um programa tinha posse de todos os
recursos do sistema de computação, indiferente da sua necessidade de uso, conseqüente-
mente, a utilização dos recursos não era otimizada. Além disso, o programa em execução
deve administrar todo o sistema de computação. Se este tipo de controle for utilizado em
equipamentos caros, a relação custo x benefício tende a ser desvantajosa.
Uma variação um pouco mais sofisticada dos sistemas multiprogramados, são os sis-
temas que fazem multitarefa cooperativa4 , que seguem o mesmo conceito com algumas
melhorias.
A execução dos programas nos diversos processadores, assim como, nos sistemas de
tempo compartilhado, multiprogramados e multiexecutados, não impede a utilização dos
periféricos em outras tarefas independente dos processadores, de forma a otimizar, ainda
mais, a utilização do sistema de computação. Sistemas multiprocessados são ambientes
com sistema operacional complexos e sofisticados, normalmente, destinados a sistemas de
computação de alto desempenho.
19
disso, podem existir diferentes tipos de interfaces que exigirão diferentes seqüências de
acesso. Porém, por meio do sistema operacional, o programador apenas informa, no pro-
grama, qual caracter deve ser colocado na tela e todo o trabalho de acesso ao periférico é
feito pelo sistema operacional.
Ao esconder detalhes dos periféricos, muitas vezes são criados recursos de mais alto
níveis, ou seja, as abstrações, como, por exemplo, os arquivos. Os programas utilizam
o espaço em disco através do conceito de arquivo. Arquivos não existem no hardware,
mas são um recurso criado a partir do que o hardware oferece. Para o programador é
muito mais confortável trabalhar com arquivos do que receber uma área de espaço em
disco que ele próprio teria que organizar. Outro exemplo de abstração, pode ser uma
instrução de I/O, tal como, read ou write em um IBM PC, que deve ser acompanhada
de 13 parâmetros, especificando o endereço do bloco a ser lido, o número de setores por
trilha, o modo de gravação no meio físico, o espaçamento entre setores etc., sem contar
com as tarefas de ordem física/mecânica, ou seja, verificar se o motor do drive já está
acionado etc.
A grande maioria dos programadores não se envolve com tais detalhes, pois lida com
uma abstração de alto nível e, portanto mais simples. No exemplo em questão, a abstração
feita nos discos é visualizá-los como uma coleção de arquivos identificados por nomes, onde
os eventos, a manipulação dos arquivos, não consideram maiores detalhes e restringem-se
a simplesmente abrir, ler/escrever e fechar.
As chamadas ao sistema2 (system calls) são interrupções (traps) originadas por soft-
ware, que fornecem a interface entre processos e o sistema operacional. Os programas
solicitam serviços ao sistema operacional por meio de chamadas ao sistema que provocam
interrupções da execução de determinada tarefa para que uma outra atividade seja execu-
tada. Uma atividade protegida por uma interrupção é específica do sistema operacional
e, portanto, tem privilégio sobre a anterior, que, posteriormente, será restaurada.
1. O aplicativo solicita o serviço ao sistema operacional, que será atendido por meio
da execução de uma ou mais chamadas ao sistema;
• Chamadas ao sistema para tratamento de sinais: Seus serviços são utilizados para
sincronizar processos, suspender a execução de processos etc.;
3 Processos
Uma das dificuldades no estudo dos sistemas operacionais é a denominação das ati-
vidades da CPU. Por exemplo, um sistema batch 1 executa jobs (trabalhos, tarefas), en-
quanto que um sistema de tempo compartilhado executa programas de usuários ou tarefas.
Além disso, o sistema operacional precisa atender aos(s) programa(s) em execução, ge-
renciar recursos e atender suas próprias atividades e necessidades. Em vários aspectos,
um job, programa ou uma atividade interna do sistema operacional são semelhantes e,
portanto, chamamos a todos de processo.
processo), ou, ainda, bloco de controle de tarefa. Um exemplo de uma tabela de processo
pode ser visto na Tabela 2.
estado do processo (status)
identificação do processo (PID)
valor do contador do programa (PC)
valores dos outros resgistradores
limites de memória
informaçãoes sobre arquivos abertos
..
.
A>
>>
>>
>>
B> C
>>
>>
>>
D E F
Figura 9: Exemplo de uma árvore de processos. O processo A é a raiz da árvore e criou
dois processos-filho B e C, o processo B é raiz de uma sub-árvore e criou três processos-filho
D, E e F e os processos C, D, E e F são folhas da árvore.
Apesar de cada processo ser uma entidade independente, com seu próprio fluxo de
controle e com seu próprio estado interno, eles muitas vezes têm necessidade de interagir
com outros processos, como, por exemplo, um primeiro processo que concatena dois arqui-
vos que, por sua vez, será a entrada de um processo de sort 2 . Dependendo da velocidade
entre os processos, isto é, um pode andar mais rápido do que o outro, que leva em conta
a complexidade do processo em si e o tempo alocado no processador para cada um deles,
poderá ocorrer uma situação em que o sort estará pronto para rodar, mas a concatenação
ainda não gerou os dados necessários. Então, o sort será bloqueado até que sua entrada,
ou seja, a saída do primeiro processo, esteja disponível.
processador para outro processo. Neste último caso, a decisão de suspender a execução do
processo é técnica, normalmente baseada no compartilhamento de tempo do processador.
• Pronto (P): Em condições de rodar, mas impedido temporariamente para dar vez a
um outro processo, ou seja, está apto a rodar, mas não há processador disponível;
• Rodando (R): Usando o processador no instante, ou seja, está apto a rodar e existe
processador disponível;
• Bloqueado (B): Impedido de rodar até que ocorra um determinado evento externo
ao processo, ou seja, não está apto a rodar;
Ao passar de um estado para outro o processo sofre uma transição, sendo possível
quatro diferentes transições entre os três principais estados que serão estudados:
2. Pronto para rodando: ocorre quando o processo é selecionado para fazer uso do
processador. O escalonador de processos libera o processador para o processo, ou
seja, pela organização da fila de prontos, chegou a hora do processo utilizar sua fatia
de tempo no processador;
3. Rodando para bloqueado: ocorre quando faltam condições lógicas para um pro-
cesso continuar a ocupar o processador. Normalmente causado por sincronização de
processos ou requisição de I/O;
4. Bloqueado para pronto: Ocorre quando um evento externo provê o recurso aguar-
dado pelo processo. A ocorrência do evento se manifesta por meio de uma interrup-
ção.
30
/. *+
S-,
()
~?
f im ~
7654
0123
~
~
RX
~
c ~~
b
~
01 54
76B23 76P23
/01 54
~
~ ~ a
d _@
@ admissão
@
76
01E54
23
@
A solução do PPC pode ser implementada de várias formas. A que será apresentada
(Algoritmo 2), trabalha com as primitivas4 de bloqueio (sleep) e de desbloqueio (wakeup),
portanto, devemos saber que a primitiva sleep sempre bloqueia o processo que a chamou,
enquanto que a chamada da primitiva wakeup recebe um parâmetro que indica qual o
processo que deve ser desbloqueado.
• Pc está sendo executado e o buffer está vazio, então o valor de contador será 0;
Dessa forma, os dois processo estarão bloqueados e cada um ficará aguardando pelo
outro indefinidamente5 .
4
Os procedimentos do kernel que respondem às chamadas ao sistemas também são chamados de
“primitivas".
5
O problema exposto pode ser resolvido alterando o algoritmo Produtor-Consumidor ou o funciona-
mento das primitivas. Pense em como alterar o algoritmo proposto para solucionar esse problema.
32
Infelizmente, a solução proposta não está correta. Suponha que todos os cincos filó-
sofos resolvam comer ao mesmo tempo e que cada um consiga pegar o talher da esquerda.
A partir daí, nenhum deles terá acesso ao palito da direita, configurando uma situação
de deadlock, ou impasse, que ocorre, em um conjunto de processos, se cada
processo do conjunto estiver esperando por um evento que somente outro
processo pertencente ao conjunto poderá fazer.
34
Aparentemente, essa situação pode ser solucionada se, após pegar o palito da esquerda,
o filósofo verificar se o palito da direita encontra-se disponível. Se não estiver, o filósofo
deve devolver o palito da esquerda e aguardar um tempo determinado para repetir o
processo6 . Entretanto, essa solução também não está correta.
Como no caso anterior pode acontecer de que os filósofos obtenham ao mesmo tempo
o palito da esquerda, então, vão observar que o palito da direita estará ocupado e todos
devolverão o palito da esquerda ao mesmo tempo. Em seguida, esperam o tempo determi-
nado e pegam os palitos da esquerda novamente. Mais uma vez, verificarão que os palitos
da direita estarão ocupados, devolverão os palitos da esquerda e, assim sucessivamente e
indefinidamente. Uma situação como essa, em que os programas rodam indefini-
damente e não fazem nenhum progresso em seu processamento, é denominada
starvation.
Para solucionar esse novo problema, assim como o do impasse, basta fazer com que
o intervalo de tempo seja aleatório, para o início de uma nova tentativa e, assim, será
praticamente impossível que uma outra tentativa de pegar os talheres seja feita ao mesmo
tempo por todos os filósofos.
Como informação, a solução definitiva para esse problema foi dada por Edsger Dijks-
tra, em 1965, utilizando semáforos binários de exclusão mútua. A grosso modo, seria
colocar no procedimento uma variável (semáforo) que assuma somente dois valores (biná-
ria), por exemplo, FALSO ou VERDADEIRO. Quando um filósofo resolver comer, antes
da ação de “pegar o talher", ele deve verificar se a variável está com o valor VERDA-
DEIRO, então ele altera o valor para FALSO e segue o processamento. Quando devolver
o talher da direita, retorna a variável para VERDADEIRO. Assim, exclui-se a possibili-
dade de que outro filósofo tente comer ao mesmo tempo que o primeiro. Da mesma forma
que será excluída a possibilidade de que este tente comer ao mesmo tempo que um outro
(exclusão mútua).
6
Faça a alteração proposta para o Algoritmo 3.
35
Nos problemas de comunicação entre processos, são observadas situações em que dois
ou mais processos podem estar “prontos" e, portanto aguardando o momento de rodar.
Essa decisão cabe ao sistema operacional, ou melhor, ao escalonador de processos do sis-
tema operacional, que utiliza um algoritmo de escalonamento para decidir qual processo
vai ocupar o processador. Os antigos sistemas batch possuíam um algoritmo de escalo-
namento que consistia simplesmente em fazer com que o próximo processo da fila fosse
colocado para rodar ao final do processo corrente de forma não-preemptiva7 . Porém, com
o advento dos sistemas de tempo compartilhados, multiusuários etc., esses algoritmos
tornaram-se mais complexos, permitindo alteração da fila de prontos ou a suspensão de
processos em função de novos processos que estivessem entrando na fila, ou seja, uma
forma preemptiva8 de organizar a fila de prontos.
1. Garantir que todos os processos do sistema terão chances iguais de uso do proces-
sador (exceto nos casos de um processo ser priorizado em relação a outro);
4. Minimizar o tempo que os usuários batch devem esperar pela saída (turnaroud );
O SJF associa ao processo uma determinada medida (métrica, peso etc.) que pode
ser originada por um único valor, por exemplo, tempo previsto de ocupação da CPU, ou
ser obtida a partir de um conjunto de valores, tais como, tempo previsto de ocupação
da CPU, previsão da quantidade de memória a ser utilizada, previsão dos dispositivos de
I/O a serem utilizados. Assim, essa medida associada ao processo passa a ser um peso,
às vezes, uma prioridade, para a organização da fila.
O SJF pode ser implementado nas formas de escalonador de longo, médio ou curto
prazo9 . Como escalonador de longo prazo, o algoritmo determina uma nova ordem para os
processos que se encontram na fila de prontos e, a partir dessa nova ordem, os processos são
executados sem nenhuma alteração, como se fosse o FIFO. No contexto dessa disciplina,
será visto o caso mais simples, ou seja, a implementação para escalonadores de longo prazo,
tomando como medida somente o tempo previsto de CPU para o processo e organizando
a fila de prontos na ordem crescente dos valores previstos. Normalmente a previsão do
tempo de uso da CPU é informada pelo usuário que submeteu o processo e, assim, é
possível que a previsão seja superestimada ou subestimada10 .
Como exemplo, suponha que as informações dos processos na fila de prontos sejam ar-
mazenadas em uma estrutura de dados como descrita a seguir, assim, para implementação
do escalonador SJF, com escalonador de longo prazo, pode ser utilizado o Algoritmo 4.
processo.id processo.peso
Em seus estudos, altere o Algoritmo 4, fazendo que com os processos sejam incluídos
em lista_processo em ordem crescente de peso. Como sugestão, implemente lista_processo
em uma lista encadeada e não em um vetor.)
Se o tamanho do quantum for ampliado para 500 ms, por exemplo, o tempo atribuído
para as tarefas administrativas será menor do que 1%, porém, para os usuários interativos
pode-se gerar uma espera muito longa para que tenham a chance de utilizar o processador.
O tamanho do quantum ideal13 depende do tipo de processos e de usuários que estão
utilizando o sistema em cada momento, portanto, em alguns sistemas, seu valor pode ser
alterado na configuração do sistema.
Alguns algoritmos, como o RR, assumem que todos os processos são igualmente im-
portantes, porém, normalmente associam-se “pesos" aos processos para determinar a hie-
rarquia de execução destes. A idéia é simples: a cada processo associa-se uma prioridade,
12
Pense sobre a função e o funcionamento da troca de contexto nos diversos tipos de sistemas e veja
como essa rotina se relaciona com a tabela de processo.
13
Analise qual a relação entre o tamanho do quantum e as características de um bom algoritmo de
escalonamento, relacionadas na Seção 3.4.
39
PID A B C D E F G H I J K L
Prioridade 4 3 4 3 4 3 2 1 3 1 2 1
Prioridade 4 → A → C → E
Prioridade 3 → B → D → F → I
Prioridade 2 → G → K
Prioridade 1 → H → J → L
Figura 11: Classes de prioridade para aplicação do algoritmo EP.
40
4 Gerência de memória
Existem diversas técnicas de gerência de memória e decidir qual será técnica imple-
mentada em um sistema operacional depende muito do que a arquitetura do computador
hospedeiro suportar, pois as técnicas de gerência são intimamente ligadas ao hardware.
(b) O sistema operacional ocupar a ROM (na parte mais alta do sistema de endereça-
mento de memória);
(c) O sistema operacional ocupar o início da RAM, e a ROM será ocupada pelos drivers
de dispositivos, que formam o BIOS (Basic Input/Output System). Esse é o caso
do IBM PC.
Esse modelo permite o acesso interativo por parte de vários usuários simultaneamente,
existindo mais de um processo na memória ao mesmo tempo. Os processos ocupam
partições diferentes e essas partições podem ser fixas ou variáveis.
2
Os conceitos de swapping e paginação serão apresentados posteriormente.
42
• etc.
Figura 13: Partições fixas: (a) Múltiplas filas de entrada, separadas por partições. (b)
Fila de entrada única (TANENBAUM, 2008).
A princípio, um sistema que utiliza swapping pode ser baseado na divisão da memória
em partições fixas. Sempre que um processo for bloqueado, ele pode ser gravado em disco
e um novo processo será transferido para a área de memória liberada. Porém, nesse caso,
o aproveitamento da memória fica comprometido, pois o novo processo pode ocupar uma
área maior do que a necessária. Além disso, a área de dados de um processo pode aumentar
ou diminuir ao longo de sua execução, assim sendo, uma partição fixa que contenha um
processo em um determinado momento, talvez não o comporte no momento seguinte e,
então, esse processo deve esperar uma partição maior ou ser interrompido.
Quando partições variáveis são utilizadas, obtêm-se maior flexibilidade, por meio do
swapping na substituição dos processos em memória, que variam dinamicamente em ta-
manho e quantidade, diferentemente das partições fixas.
Figura 14: Substituição dos processos em memória, por meio de swap (TANENBAUM,
2008).
1. First-fit:
O sistema coloca um job na memória principal na primeira lacuna que seja grande
o suficiente para contê-lo. Sendo este o método mais rápido para esta decisão;
2. Best-fit:
O sistema coloca o job na memória principal na lacuna mais “justa”, ou seja, na
lacuna que couber mais exatamente e deixe a menor quantidade de espaço sem uso.
A determinação do melhor espaço requer sobrecarga de processamento para a sua
determinação, pois o sistema precisa ter conhecimento de todas as lacunas;
3. Worst-fit:
O sistema coloca o job na memória principal na lacuna mais “folgada”, ou seja, na
maior lacuna encontrada e que deixe a maior quantidade de espaço sem uso. Assim,
o espaço que sobrar tende ser suficientemente grande para acomodar outro job. Para
a utilização dessa estratégia, o sistema também precisa conhecer todas as lacunas
para decidir qual é a maior.
Ainda existe uma variação da estratégia first-fit, conhecida como next-fit (próximo que
couber). Nesse caso, o sistema coloca um job na memória principal na primeira lacuna
que seja grande o suficiente para contê-lo, entretanto a pesquisa para encontrar a lacuna
não começa a partir da primeira posição vaga de memória, mas da posição onde a pesquisa
anterior terminou.
45
4.4.1 Introdução
Embora o trabalho efetivo de troca de overlays fosse feito pelo sistema operacional, o
trabalho de dividir o programa em partes era do programador, exigindo tempo, técnica e
paciência. O programador precisava ter em mente a ordem em que os overlays deveriam
ser trocados para evitar que rotinas com grande interação ficassem em diferentes overlays.
Em 1961, foi criada uma maneira de atribuir todo o trabalho ao sistema operacional,
denominada memória virtual. O princípio básico é que o tamanho combinado do programa
(o tamanho da área de dados e da pilha de execução) possa exceder o tamanho da memória
física disponível, pois o sistema operacional mantém as partes do programa em uso na
memória principal e o restante em disco (swapping). Ou seja, conceitualmente, seguia a
idéia de overlay, entretanto, sob total controle do sistema operacional.
1. Memória lógica:
É a memória que um processo enxerga, ou seja, aquela que o processo é capaz de
acessar. Deste modo, todos os endereços manipulados pelos processos são endere-
ços lógicos, assim como todas as instruções de máquina de um processo especificam
endereços lógicos. Em geral, cada processo possui sua memória lógica, que é inde-
pendente da memória dos outros processos;
2. Memória física:
É implementada pelos circuitos integrados de memória e é formada pelos endereços
físicos, que são utilizados para endereçar os circuitos integrados de memória;
46
4.4.4 Paginação
Vários sistemas geram endereços de memória que são divididos em duas partes: o
número da página (page number ) e o deslocamento na página (page offset). A página é
utilizada como um índice na tabela de páginas, que contém o endereço base dos quadros
(Q), e combinado com deslocamento (D) fornece o endereço na memória física.
Cada processo possui sua própria tabela de páginas que é referenciada pela sua tabela
de processo. O problema dessa organização é o tempo gasto para os dois acessos a cada
pesquisa em memória, um para a tabela de páginas e outro para memória física e, então,
procura-se contornar o atraso com o uso de uma memória cache específica para a conversão
dos endereços.
4
Um disco fabricado e utilizado com o propósito exclusivo de ser a área de swap é chamado de backing
storage.
5
Ver exemplo feito em sala.
6
“Palavra de memória" é uma unidade de medida e corresponde a um espaço de endereçameto na
memória, ou seja, corresponde ao tamanho do espaço alocado para cada endereço de memória.
48
4.4.5 Segmentação
Figura 15: No espaço de endereçamento único pode ocorrer “colisão" entres as tabelas
(TANENBAUM, 2008).
Suponha que a tabela de símbolos esgotou seu espaço, então, seria necessário adotar
uma das seguintes soluções:
Figura 16: Múltiplos espaços de endereçamento. Cada tabela pode aumentar ou diminuir,
independente das demais (TANENBAUM, 2008).
5 Sistemas de arquivos
5.1 Introdução
Além disso, para grande parte dos usuários, especializados ou não, a conveniência e
a utilidade do sistema de computação é determinada pela interface, pela estrutura e pela
confiabilidade do sistema de arquivos.
Usuários e aplicativos “percebem" os arquivos pela visibilidade criada por essas pro-
priedades e características, ou seja, o arquivo é visto por meio da abstração criada pelo
sistema de arquivos implementado pelo sistema operacional.
52
Nessa estrutura, também conhecida como “fluxo de bytes não estruturado", o sistema
operacional não sabe e nem se importa com o que está no arquivo e tudo o que pode ser
percebido são simplesmente bytes e qualquer significado que se queira atribuir a esses bytes
deve ser tratado pelo programa aplicativo. Assim, com o sistema operacional considerando
os arquivos nada mais do que uma seqüência de bytes obtém-se o máximo de flexibilidade,
visto que os aplicativos podem armazenar dados de qualquer espécie (caractere, áudio,
vídeo etc.) e, posteriormente, tratá-los de acordo com suas devidas características e
necessidades.
Desse modo, o sistema operacional não ajuda, mas também não atrapalha, o que
pode ser um aspecto muito importante. Atualmente, muitos sistemas operacionais por
exemplo, as diferentes versões do Unix, as diversas distribuições do Linux, o MS-DOS,
toda a família Windows etc., utilizam essa estrutura.
O arquivo é tratado por registro, ou seja, os bytes não estão “soltos", como no caso
anterior, pois possuem uma estrutura interna, os registros. Assim, as operações de leitura
recuperam um registro e as operações de gravação anexam ou sobrescrevem um registro.
Essa estrutura assemelha-se às “árvores B", sendo os arquivos compostos por uma
árvore de registros, de tamanho fixo ou variável, cada um dos quais contendo um campo
chave (em uma posição fixa do registro), e os registros são ordenados pelo campo chave.
A operação básica não é mais obter o “próximo registro", mas obter o registro que
possua uma chave específica, solicitando ao sistema operacional que encontre o registro
desejado, sem nos preocuparmos com sua posição no arquivo.
Figura 17: Estrutura de arquivos: (a) Seqüência de byte não estruturada. (b) Seqüência
de registros de comprimento fixo. (c) Árvore de registros (TANENBAUM, 2008).
O método de alocação contígua requer que cada arquivo ocupe um conjunto de blocos
com endereços consecutivos no disco e a alocação é definida pelo endereço do primeiro
bloco do arquivo. Assim, se o arquivo tem tamanho n e seu primeiro bloco for o bloco b,
então o arquivo ocupará os blocos b, b + 1, b + 2, ...b + (n − 1).
Nesse método, cada arquivo é visto como uma lista encadeada de blocos, sendo que
os blocos podem estar “espalhados" em qualquer lugar do disco. A estrutura da tabela de
alocação é um “ponteiro" para o primeiro bloco do arquivo (em algumas implementações
também existe um ponteiro para o último bloco) e o encadeamento entre os blocos é feito
por cada um dos blocos, que aponta para o seu bloco seguinte.
Esse método também utiliza o encadeamento de blocos, porém de forma indireta, pois
os blocos são encadeados em uma tabela auxiliar e não diretamente pelo bloco antecessor.
A tabela de alocação aponta para a posição do primeiro bloco do arquivo na tabela de
blocos e cada bloco aponta para a posição do próximo bloco.
Suas desvantagens são: o espaço ocupado pela tabela de blocos e a lentidão na leitura
dos arquivos.
O método de alocação encadeada por tabela é utilizado nos sistemas de arquivos FAT
(file alocation table), em todas as variações FAT 12, FAT 16 e FAT 32. O sistema de
arquivo nativo do MS-DOS e do Windows 9x é a FAT.
56
No método de alocação indexada cada arquivo possui seu próprio bloco de índice, que
é uma tabela de endereços de blocos do disco, sendo que no diretório armazena-se somente
o endereço do bloco de índice.
A indexação possui muitas vantagens em relação aos demais métodos, por exemplo,
permite o acesso direto aos blocos, resolve o problema da estimativa inicial do arquivo, da
fragmentação externa, dos ponteiros “espalhados" pelo disco e do crescimento incremental.
57
Entretanto, o armazenamento dos ponteiros do bloco de índice pode vir a ser maior
do que na alocação encadeada, pois quanto mais arquivos de pequeno porte forem arma-
zenados, maior será a taxa de ocupação.
Nesse ponto deve-se pensar: qual deve ser o tamanho do bloco de índice? Normal-
mente, o bloco de índice ocupa uma unidade de alocação (um bloco) e caso um arquivo
necessite de mais de um bloco de índice é feito um encadeamento entre os blocos de índice.
Figura 23: Implementação da alocação indexada pelo unix file system - UFS, com índices
direto, simples, duplo e triplo.
O Unix File System (UFS), o sistema de arquivos padrão do Unix, utiliza esse conceito,
porém sua implementação amplia a idéia, permitindo indexação indireta, ou seja, índices
que referenciam outros índices, que também podem referenciar outros índices, e assim por
diante. O sistema de arquivos NTFS (New Technology File System), do Windows 2000,
XP e Vista, também segue raciocício semelhante e ambos, o NTFS e o UFS, possibilitam
o armazemento de grandes arquivos.
O sistema de arquivos deve ser capaz de controlar a área de espaço livre no disco, pois,
como os discos possuem quantidade limitada de espaço, é necessário reutilizar o espaço
liberado por arquivos apagados, mantendo a chamada “lista de espaços livres".
A lista de espaços livres referencia todos blocos que estão desocupados no disco e,
então, por exemplo, para a criação de um arquivo, faz-se uma busca na lista, de forma
que seja possível localizar e alocar a quantidade de blocos necessária para o arquivo.
58
Uma segunda maneira para implementar a lista de espaços livres é encadear os blocos
livres, mantendo o endereço do primeiro bloco livre em uma lista de tamanho reduzido -
pois esta lista pode conter somente um endereço - e, a partir do primeiro bloco livre, cada
bloco livre apontará para o seguinte.
As desvantagens desse método são o tempo gasto na localização dos espaços livres, pois
se perde um tempo substancial percorrendo a lista de blocos encadeados, e provavelmente
não será possível perceber a existência de blocos livres contíguos
59
Referências
GIOZZA, W. F.; MOURA, J. A. B.; SAUVÉ, J. P.; ARAÚJO, J. F. M. de. Redes locais
de computadores: tecnologias e aplicações. São Paulo: McGraw-Hill: EMBRATEL, 1986.
Esse documento foi editado com o Winefish, utilizando a classe ABNTEX, processado pelo LATEX 2ε e está disponível em
http://www.arbex.pro.br/.
Arquivo de impressão gerado em 8 de fevereiro de 2010.