Baixe o app para aproveitar ainda mais
Prévia do material em texto
T164s Tanenbaum, Andrewa S. Sistemas operacionais [recurso eletrônico] : projeto e implementação / Andrew S. Tanenbaum, Albert S. Woodhull ; tradução João Tortello. – 3. ed. – Dados eletrônicos. – Porto Alegre : Bookman, 2008. Editado também como livro impresso em 2008. ISBN 978-85-7780-285-2 1. Sistemas operacionais. I. Woodhull, Albert S. II. Título. CDU 004.4 Catalogação na publicação: Mônica Ballejo Canto – CRB 10/1023 446 SISTEMAS OPERACIONAIS Do ponto de vista dos usuários, o aspecto mais importante de um sistema de arquivos é como ele aparece para eles; isto é, o que constitui um arquivo, como os arquivos recebem seus nomes e como são protegidos, quais operações são permitidas etc. Os detalhes de serem utilizadas listas encadeadas ou mapas de bits para monitorar o espaço de armazenamento livre e de que existem muitos setores em um bloco lógico têm menos interesse, embora se- jam de grande importância para os projetistas do sistema de arquivos. Por isso, estruturamos este capítulo com várias seções. As duas primeiras são dedicadas à interface do usuário para arquivos e diretórios, respectivamente. Em seguida, há uma discussão sobre maneiras alterna- tivas pelas quais um sistema de arquivos pode ser implementado. Após uma discussão sobre segurança e mecanismos de proteção, concluímos com uma descrição do sistema de arquivos do MINIX 3. 5.1 ARQUIVOS Nas páginas a seguir, veremos os arquivos do ponto de vista do usuário; isto é, como eles são usados e quais são suas propriedades. 5.1.1 Atribuição de nomes de arquivo Os arquivos são um mecanismo de abstração. Eles proporcionam uma maneira de armazenar informações no disco e de lê-las posteriormente. Isso deve ser feito de modo a esconder do usuário os detalhes sobre como e onde as informações são armazenadas e como os discos realmente funcionam. Provavelmente, a característica mais importante de qualquer mecanismo de abstração é a maneira de atribuir nomes aos objetos que estão sendo gerenciados; portanto, começaremos nosso estudo dos sistemas de arquivos com o assunto da atribuição de nomes de arquivo. Quando um processo cria um arquivo, é dado um nome a ele. Quando o processo termina, o arquivo continua a existir e pode ser acessado por outros processos, usando seu nome. As regras de atribuição de nomes de arquivo exatas variam de um sistema para outro, mas todos os sistemas operacionais atuais permitem strings de uma a oito letras como nomes de arquivo válidos. Assim, andrea, bruce e cathy são possíveis nomes de arquivo. Freqüente- mente, algarismos e caracteres especiais também são permitidos; assim, nomes como 2, ur- gente! e Fig.2-14 freqüentemente também são válidos. Muitos sistemas de arquivos suportam nomes de até 255 caracteres. Alguns sistemas de arquivos fazem distinção entre letras maiúsculas e minúsculas, en- quanto outros, não. O UNIX (incluindo todas as suas variantes) entra na primeira categoria; o MS-DOS, na segunda. Assim, um sistema UNIX pode ter todos os seguintes nomes como três arquivos distintos: maria, Maria e MARIA. No MS-DOS, todos esses nomes referem-se ao mesmo arquivo. O Windows fi ca entre esses extremos. Os sistemas de arquivos do Windows 95 e Win- dows 98 são baseados no sistema de arquivos do MS-DOS e, assim, herdam muitas de suas propriedades, como o modo de construir nomes de arquivo. A cada nova versão foram adicio- nados aprimoramentos, mas os recursos que discutiremos são comuns no MS-DOS de modo geral e nas versões clássicas do Windows. Além disso, o Windows NT, o Windows 2000 e o Windows XP suportam o sistema de arquivos do MS-DOS. Entretanto, estes últimos sistemas também têm um sistema de arquivos nativo (o NTFS), que tem propriedades diferentes (como nomes de arquivo em Unicode). Esse sistema de arquivos também passou por alterações nas sucessivas versões. Neste capítulo, vamos nos referir aos sistemas mais antigos como sistema de arquivos do Windows 98. Se um recurso não se aplicar às versões do MS-DOS ou do Win- CAPÍTULO 5 • SISTEMA DE ARQUIVOS 447 dows 95, indicaremos isso. Do mesmo modo, vamos nos referir ao sistema mais recente como sistema de arquivos NTFS ou como sistema de arquivos do Windows XP e destacaremos isso, caso um aspecto que esteja sendo discutido também não se aplique aos sistemas de arquivos do Windows NT ou do Windows 2000. Quando dissermos apenas Windows, isso signifi cará todos os sistemas de arquivos do Windows, desde o Windows 95. Muitos sistemas operacionais suportam nomes de arquivo com duas partes, sendo elas separadas por um ponto, como em prog.c. A parte após o ponto é chamada de extensão de arquivo e normalmente indica algo a respeito do arquivo (neste exemplo, que se trata de um arquivo-fonte da linguagem de programação C. No MS-DOS, por exemplo, os nomes de arquivo têm de 1 a 8 caracteres, mais uma extensão opcional de 1 a 3 caracteres. No UNIX, o tamanho da extensão, se houver, fi ca por conta do usuário, e um arquivo pode até ter duas ou mais extensões, como em prog.c.bz2, onde .bz2 é comumente usado para indicar que o arquivo (prog.c) foi compactado usando o algoritmo de compactação bzip2. Algumas das extensões de arquivo mais comuns e seus signifi cados aparecem na Figura 5-1. Extensão Signifi cado arquivo.bak Arquivo de backup arquivo.c Programa fonte em C arquivo.gif Imagem no formato Graphical Interchange Format arquivo.html Documento em HyperText Markup Language da World Wide Web arquivo.iso Imagem ISO de um CD-ROM (para gravar no CD) arquivo.jpg Fotografi a codifi cada com o padrão JPEG arquivo.mp3 Música codifi cada no formato de áudio MPEG camada 3 arquivo.mpg Filme codifi cado com o padrão MPEG arquivo.o Arquivo-objeto (saída do compilador ainda não vinculada) arquivo.pdf Arquivo no formato Portable Document Format arquivo.ps Arquivo em PostScript arquivo.tex Entrada para o programa de formatação TEX arquivo.txt Arquivo de texto geral arquivo.zip Repositório de arquivos compactado Figura 5-1 Algumas extensões de arquivo típicas. Em alguns sistemas (por exemplo, o UNIX), as extensões de arquivo são apenas conven- ções e não são impostas pelo sistema operacional. Um arquivo chamado arquivo.txt poderia ser algum tipo de arquivo de texto, mas esse nome serve mais para lembrar o proprietário do que para transmitir qualquer informação para o computador. Por outro lado, um compilador C pode fazer questão de que os arquivos a serem compilados terminem com .c e se recusar a compilá-los, caso não terminem. Convenções como essas são particularmente úteis quando o mesmo programa pode ma- nipular vários tipos diferentes de arquivos. O compilador C, por exemplo, pode receber uma lista de arquivos para compilar e ligar, alguns deles sendo arquivos em C (por exemplo, foo. c), alguns em linguagem assembly (por exemplo, bar.s) e alguns sendo arquivos-objeto (por exemplo, other.o). Então, a extensão torna-se fundamental para o compilador identifi car quais são os arquivos em C, quais são arquivos em assembly e quais são arquivos-objeto. 448 SISTEMAS OPERACIONAIS Em contraste, o Windows é muito atento quanto às extensões e atribui signifi cado para elas. Os usuários (ou processos) podem registrar extensões no sistema operacional e especi- fi car qual programa esta associado a cada uma delas. Quando um usuário dá um duplo clique em um nome de arquivo, o programa atribuído a sua extensão de arquivo é ativado e recebe o nome do arquivo como parâmetro. Por exemplo, dar um duplo clique em arquivo.doc inicia o programa Word da Microsoft, com arquivo.doc sendo o arquivo inicial a ser editado. Pode-se achar estranho a Microsoft ter optado por tornar as extensões comuns invisíveis por padrão, devido a sua importância. Felizmente, a maioria das confi gurações “erradas por padrão” do Windows pode ser alterada por um usuário sofi sticado que saiba onde procurar. 5.1.2 Estrutura do arquivo Os arquivos podem ser estruturados de várias maneiras. Três possibilidades comunsaparecem na Figura 5-2. O arquivo da Figura 5-2(a) é apenas uma seqüência não estruturada de bytes. Na verdade, o sistema operacional não sabe ou não se preocupa com o que há no arquivo. Tudo que ele vê são bytes. Qualquer signifi cado deve ser imposto pelos programas em nível de usuário. Tanto o UNIX como o Windows 98 usam essa estratégia. O fato de o sistema operacional enxergar os arquivos como nada mais do que seqüên- cias de bytes proporciona o máximo de fl exibilidade. Os programas de usuário podem colocar o que quiserem em seus arquivos e chamá-los da maneira que for conveniente. O sistema operacional não ajuda, mas também não atrapalha. Para usuários que queiram fazer coisas incomuns, este último aspecto pode ser muito importante. (a) (b) (c) 1 Registro Formiga Raposa Porco Gato Vaca Cachorro Bode Leão Coruja Pônei Rato Minhoca Galinha Íbis Carneiro 1 Byte Figura 5-2 Três tipos de arquivos. (a) Seqüência de bytes. (b) Seqüência de registros. (c) Árvore. A primeira etapa na estrutura aparece na Figura 5-2(b). Nesse modelo, um arquivo é uma seqüência de registros de tamanho fi xo, cada um com alguma estrutura interna. O mais importante na idéia de um arquivo ser uma seqüência de registros é a noção de que a operação de leitura retorna apenas um registro e a operação de escrita sobrescreve ou anexa apenas um registro. Como um dado histórico, quando o cartão perfurado de 80 colunas reinava, os sis- temas operacionais (de computadores de grande porte) baseavam seus sistemas de arquivos em arquivos compostos de registros de 80 caracteres, na verdade, imagens de cartão. Esses sistemas também suportavam arquivos de registros de 132 caracteres, os quais se destinavam à impressora de linha (as quais, naquela época, eram impressoras enormes com 132 colunas). CAPÍTULO 5 • SISTEMA DE ARQUIVOS 449 Os programas liam a entrada em unidades de 80 caracteres e escreviam em unidades de 132 caracteres, embora os últimos 52 pudessem ser espaços, naturalmente. Nenhum sistema de propósito geral atual funciona assim. O terceiro tipo de estrutura de arquivo aparece na Figura 5-2(c). Nessa organização, um arquivo consiste em uma árvore de registros, não necessariamente todos do mesmo tamanho, mas cada um contendo um campo de chave em uma posição fi xa no registro. A árvore é orde- nada pelo campo de chave, permitindo localizar rapidamente uma chave em particular. A operação básica aqui não é obter o “próximo” registro, embora isso também seja possível, mas obter o registro com uma chave específi ca. Para o arquivo zoo da Figura 5-2(c), poderia ser solicitado que o sistema obtivesse o registro cuja chave é pônei, por exemplo, sem se preocupar com sua posição exata no arquivo. Além disso, novos registros podem ser adicionados no arquivo, com o sistema operacional (e não o usuário) decidindo onde colocá- los. Esse tipo de arquivo é claramente muito diferente dos fl uxos de bytes não estruturados utilizados no UNIX e no Windows 98, mas é amplamente usado nos computadores de grande porte ainda utilizados no processamento de dados comerciais. 5.1.3 Tipos de arquivo Muitos sistemas operacionais suportam vários tipos de arquivos. O UNIX e o Windows, por exemplo, têm arquivos normais e diretórios. O UNIX tem também arquivos especiais de carac- tere e de bloco. O Windows XP também usa arquivos de metadados, os quais mencionaremos posteriormente. Os arquivos normais são aqueles que contêm informações do usuário. Todos os arquivos da Figura 5-2 são normais. Os diretórios são arquivos de sistema para manter a estrutura do sistema de arquivos. Estudaremos os diretórios a seguir. Os arquivos especiais de caractere são relacionados à entrada/saída e usados para modelar dispositivos de E/S seriais, como terminais, impressoras e redes. Os arquivos especiais de bloco são usados para modelar discos. Neste capítulo, estaremos interessados principalmente nos arquivos normais. Os arquivos normais geralmente são arquivos ASCII ou arquivos binários. Os arquivos ASCII consistem em linhas de texto. Em alguns sistemas, cada linha termina com um caractere de carriage return. Em outros, é usado o caractere de avanço de linha (line feed). Alguns siste- mas usam ambos (por exemplo, o Windows). As linhas não precisam ter todas a mesma largura. A grande vantagem dos arquivos ASCII é que eles podem ser exibidos e impressos no estado em que se encontram e podem ser editados com qualquer editor de textos. Além disso, se um grande número de programas utiliza arquivos ASCII para entrada e saída, é fácil conec- tar a saída de um programa na entrada de outro, como ocorre no caso de pipes em um shell. (comunicar processos não é nada fácil, mas interpretar as informações certamente é, caso uma convenção padrão, como o ASCII, for usado para expressá-las.) Outros arquivos são binários, o que signifi ca apenas que não são arquivos ASCII. Impri- mi-los resulta em uma listagem incompreensível, repleta do que aparentemente é apenas lixo. Normalmente, eles têm alguma estrutura interna, conhecida dos programas que os utilizam. Por exemplo, na Figura 5-3(a), vemos um arquivo binário executável simples, obtido de uma versão UNIX mais antiga. Embora, tecnicamente, o arquivo seja apenas uma seqüência de bytes, o sistema operacional só executará um arquivo se ele tiver o formato correto. Ele tem cinco seções: cabeçalho, texto, dados, bits de realocação e tabela de símbolos. O cabeça- lho começa com o chamado número mágico, identifi cando o arquivo como executável (para impedir a execução acidental de um arquivo que não esteja nesse formato). Em seguida, vêm os tamanhos das várias partes do arquivo, o endereço no qual a execução começa e alguns bits de fl ag. Após o cabeçalho estão o texto e os dados do programa em si. Eles são carregados na memória e os endereços corrigidos usando os bits de realocação. A tabela de símbolos é usada para depuração. 450 SISTEMAS OPERACIONAIS Nosso segundo exemplo de arquivo binário é um repositório de arquivos, também do UNIX. Ele consiste em um conjunto de funções de biblioteca (módulos) compiladas, mas não ligadas. Cada uma tem como prefácio um cabeçalho indicando seu nome, data da criação, proprietário, código de proteção e tamanho. Exatamente como acontece com o arquivo exe- cutável, os cabeçalhos do módulo estão repletos de números binários. Copiá-los na impresso- ra produziria simplesmente lixo. Todo sistema operacional deve reconhecer pelo menos um tipo de arquivo – seu próprio arquivo executável –, mas alguns sistemas operacionais reconhecem mais. O antigo sistema TOPS-20 (da DECsystem 20) ia a ponto de examinar a hora da criação de qualquer arquivo a ser executado. Então, localizava o arquivo-fonte e via se o código-fonte tinha sido modifi cado desde a criação do binário. Se tivesse sido, recompilava o código-fonte automaticamente. Em termos de UNIX, o programa make foi incorporado ao shell. As extensões de arquivo eram obrigatórias, de modo que o sistema operacional podia identifi car qual programa binário era derivado de qual código-fonte. (a) (b) Cabeçalho Cabeçalho Cabeçalho Número mágico Tamanho do texto Tamanho dos dados Tamanho do BSS Tamanho da tabela de símbolos Ponto de entrada Flags Texto Dados Bits de realocação Tabela de símbolos Módulo objeto Módulo objeto Módulo objeto Nome do módulo Data Proprietário Proteção Tamanho C ab eç al ho Figura 5-3 (a) Um arquivo executável. (b) Um repositório de arquivos. Ter arquivos fortemente tipados como esse causa problemas quando o usuário faz algo que os projetistas do sistema não esperavam. Considere, como exemplo, um sistema no qual os arquivos de saída do programa têm extensão .dat (arquivos de dados). Se um usuário CAPÍTULO 5 • SISTEMA DE ARQUIVOS 451 escrever um formatador de programa que leia um arquivo .c (programa em C), o transforme (por exemplo, convertendo-o para um layout de alinhamento padrão) e depois escreva o arquivo transformado como saída,o arquivo de saída será de tipo .dat. Se o usuário tentar compilá-lo, o sistema se recusará, pois ele tem a extensão errada. As tentativas de copiar arquivo.dat em arquivo.c serão rejeitadas pelo sistema como inválidas (para proteger o usuário contra erros). Embora esse tipo de “camaradagem com o usuário” possa ajudar os iniciantes, deixa os usuários experientes desesperados, pois precisam dedicar um esforço considerável para contornar a idéia que o sistema operacional tem sobre o que é razoável e o que não é. 5.1.4 Acesso a arquivo Os sistemas operacionais antigos forneciam apenas um tipo de acesso a arquivo: o acesso se- qüencial. Nesses sistemas, um processo podia ler todos os bytes ou registros em um arquivo na ordem, começando no princípio, mas não podia pular e lê-los fora de ordem. Entretanto, era possível voltar ao início do arquivo, de modo que eles podiam ser lidos quantas vezes fossem necessárias. Os arquivos seqüenciais eram convenientes quando o meio de armazena- mento era uma fi ta magnética, em vez de disco. Quando os discos começaram a ser usados para armazenar arquivos, tornou-se possível ler os bytes ou registros de um arquivo fora de ordem ou acessar registros pela chave, em vez de ler pela posição. Os arquivos cujos bytes ou registros podem ser lidos em qualquer ordem são chamados de arquivos de acesso aleatório. Eles são exigidos por muitos aplicativos. Os arquivos de acesso aleatório são fundamentais para muitos aplicativos, como por exemplo, os sistemas de banco de dados. Se um cliente de uma companhia aérea telefonar e quiser reservar um assento em determinado vôo, o programa de reservas deve ser capaz de acessar o registro desse vôo sem ter de ler primeiro os registros de milhares de outros vôos. Dois métodos são usados para especifi car onde a leitura vai começar. No primeiro, cada operação read fornece a posição no arquivo na qual a leitura deve começar. No segundo, uma operação especial, seek, é fornecida para estabelecer a posição corrente. Após uma operação seek, o arquivo pode ser lido seqüencialmente a partir da posição corrente atual. Em alguns sistemas operacionais de computadores de grande porte mais antigos, os arquivos são classifi cados como sendo de acesso seqüencial ou aleatório no momento em que são criados. Isso possibilita que o sistema utilize diferentes técnicas de armazenamento para as duas classes. Os sistemas operacionais modernos não fazem essa distinção. Todos os seus arquivos são automaticamente de acesso aleatório. 5.1.5 Atributos de arquivo Todo arquivo tem um nome e dados. Além disso, todos os sistemas operacionais associam outras informações a cada arquivo, por exemplo, a data e hora em que o arquivo foi criado e o tamanho do arquivo. Chamaremos esses itens extras de atributos do arquivo, embora algumas pessoas os chamem de metadados. A lista de atributos varia consideravelmente de um sistema para outro. A tabela da Figura 5-4 mostra algumas das possibilidades, mas tam- bém existem outras. Nenhum sistema tem todas elas, mas cada uma está presente em algum sistema. Os quatro primeiros atributos se relacionam com a proteção do arquivo e informam quem pode acessá-lo e quem não pode. Todos os tipos de esquemas são possíveis, alguns dos quais estudaremos posteriormente. Em alguns sistemas, o usuário precisa apresentar uma senha para acessar um arquivo, no caso em que a senha deve ser um dos atributos. 452 SISTEMAS OPERACIONAIS Atributo Signifi cado Proteção Quem pode acessar o arquivo e de que maneira Senha A senha necessária para acessar o arquivo Criador ID da pessoa que criou o arquivo Proprietário Proprietário atual Flag de leitura somente 0 para leitura/escrita; 1 para leitura somente Flag de oculto 0 para normal; 1 para não exibir em listagens Flag de sistema 0 para arquivos normais; 1 para arquivo de sistema Flag de arquivamento 0 para salvo em backup; 1 para ser salvo em backup Flag de ASCII/binário 0 para arquivo ASCII; 1 para arquivo binário Flag de acesso aleatório 0 para acesso seqüencial somente; 1 para acesso aleatório Flag de temporário 0 para normal; 1 para excluir arquivo na saída do processo Flags de travamento 0 para destravado; diferente de zero para travado Tamanho do registro Número de bytes em um registro Posição da chave Deslocamento da chave dentro de cada registro Tamanhos da chave Número de bytes no campo de chave Tempo da criação Data e hora em que o arquivo foi criado Tempo do último acesso Data e hora em que o arquivo foi acessado pela última vez Tempo da última alteração Data e hora em que o arquivo foi alterado pela última vez Tamanho corrente Número de bytes no arquivo Tamanho máximo Número de bytes até o qual o arquivo pode crescer Figura 5-4 Alguns atributos de arquivo possíveis. Os fl ags são bits, ou campos simples, que controlam ou ativam alguma propriedade específi ca. Os arquivos ocultos, por exemplo, não aparecem nas listagens dos arquivos. O fl ag de arquivamento é um bit que monitora se foi feito o backup do arquivo. O programa de backup desativa o bit e o sistema operacional o ativa quando um arquivo é alterado. Desse modo, o programa de backup pode identifi car quais arquivos precisam de backup. O fl ag de temporário permite que um arquivo seja marcado para exclusão automática, quando o proces- so que o criou terminar. Os campos de tamanho do registro, posição da chave e tamanho da chave só estão pre- sentes em arquivos cujos registros podem ser pesquisados usando uma chave. Eles fornecem as informações exigidas para encontrar as chaves. Os vários tempos monitoram quando o arquivo foi criado, acessado mais recentemente e o modifi cado. Eles são úteis para uma variedade de propósitos. Por exemplo, um arquivo- fonte que foi modifi cado após a criação do arquivo-objeto correspondente precisa ser recom- pilado. Esses campos fornecem as informações necessárias. O tamanho corrente informa o tamanho atual do arquivo. Alguns sistemas operacionais de computadores de grande porte antigos exigem que o tamanho máximo seja especifi cado quando o arquivo é criado, para permitir que o sistema operacional reserve a máxima quanti- dade de armazenamento antecipadamente. Os sistemas operacionais modernos são inteligen- tes o sufi ciente para prescindirem desse recurso. CAPÍTULO 5 • SISTEMA DE ARQUIVOS 453 5.1.6 Operações sobre arquivos Os arquivos existem para armazenar informações e permitir que elas sejam recuperadas pos- teriormente. Diferentes sistemas fornecem diferentes operações para permitir o armazena- mento e a recuperação. A seguir está uma discussão sobre as chamadas de sistema mais co- muns relacionadas aos arquivos. 1. Create. O arquivo é criado sem dados. O objetivo da chamada é anunciar que o arquivo está sendo criado e confi gurar alguns atributos. 2. Delete. Quando o arquivo não é mais necessário, precisa ser excluído para liberar espaço em disco. Sempre é fornecida uma chamada de sistema para esse propósito. 3. Open. Antes de usar um arquivo, um processo precisa abri-lo. O objetivo da cha- mada de open é permitir que o sistema busque os atributos e a lista de endereços de disco na memória principal, para acesso rápido nas chamadas posteriores. 4. Close. Quando todos os acessos tiverem terminado, os atributos e os endereços de disco não serão mais necessários; portanto, o arquivo deve ser fechado para liberar espaço em tabelas internas do sistema operacional. Muitos sistemas estimulam isso, impondo um número máximo de arquivos abertos nos processos. Um disco é escrito em blocos e o fechamento de um arquivo obriga a escrita do último bloco do arquivo, mesmo que esse bloco possa ainda não estar totalmente cheio. 5. Read. Os dados são lidos do arquivo. Normalmente, os bytes são provenientes da posição corrente. O processo que fez a chamada deve especifi car quantos dados são necessários e também fornecer um buffer para colocá-los. 6. Write. Os dados são escritos no arquivo, em geral, novamente, na posiçãocorren- te. Se a posição corrente for o fi nal do arquivo, o tamanho do arquivo aumentará. Se a posição corrente for no meio do arquivo, os dados existentes serão sobrescri- tos e perdidos para sempre. 7. Append. Esta chamada é uma forma restrita de write. Ela só pode adicionar dados no fi nal do arquivo. Os sistemas que fornecem um conjunto mínimo de chamadas de sistema geralmente não têm a operação append, mas muitos sistemas fornecem várias maneiras de fazer a mesma coisa e, às vezes, esses sistemas têm a operação append. 8. Seek. Para arquivos de acesso aleatório, é necessário um método para especifi - car de onde os dados serão extraídos. Uma estratégia comum é uma chamada de sistema, seek, que reposiciona o ponteiro de arquivo para um local específi co no arquivo. Depois que essa chamada termina, os dados podem ser lidos ou escritos nessa posição. 9. Get attributes. Freqüentemente, os processos precisam ler atributos de arquivo para fazer seu trabalho. Por exemplo, o programa make do UNIX é usado normal- mente para gerenciar projetos de desenvolvimento de software compostos de mui- tos arquivos-fonte. Quando o programa make é chamado, ele examina os tempos de modifi cação de todos os arquivos-fonte e arquivos-objeto, e faz as compilações necessárias para que tudo esteja atualizado. Para realizar seu trabalho, make preci- sa ler os atributos, a saber, os tempos de modifi cação. 10. Set attributes. Alguns atributos são confi gurados pelo usuário e podem ser altera- dos depois que o arquivo foi criado. Esta chamada de sistema torna isso possível. As informações de modo de proteção são um exemplo óbvio. A maioria dos fl ags também entra nesta categoria. 454 SISTEMAS OPERACIONAIS 11. Rename. Freqüentemente acontece de um usuário precisar alterar o nome de um arquivo já existente. Esta chamada de sistema torna isso possível. Ela nem sempre é rigorosamente necessária, pois o arquivo normalmente pode ser copiado em um novo arquivo com o novo nome e, então, o arquivo antigo pode ser excluído. 12. Lock. Travar um arquivo ou uma parte de um arquivo impede a existência de vá- rios acessos simultâneos por diferentes processos. Para um sistema de reservas de passagens aéreas, por exemplo, travar o banco de dados enquanto se faz uma reserva evita a marcação de um assento para dois passageiros diferentes. 5.2 DIRETÓRIOS Para monitorar os arquivos, os sistemas de arquivos normalmente têm diretórios ou pastas, os quais, em muitos sistemas, também são arquivos. Nesta seção, discutiremos os diretórios, sua organização, suas propriedades e as operações que podem ser efetuadas neles. 5.2.1 Diretórios simples Normalmente, um diretório contém várias entradas, uma por arquivo. Uma possibilidade apa- rece na Figura 5-5(a), na qual cada entrada contém o nome do arquivo, os atributos do arquivo e os endereços de disco onde os dados estão armazenados. Outra possibilidade aparece na Figura 5-5(b). Aqui, uma entrada de diretório contém o nome do arquivo e um ponteiro para outra estrutura de dados onde são encontrados os atributos e os endereços de disco. Esses dois sistemas são comumente usados. Quando um arquivo é aberto, o sistema operacional pesquisa seu diretório até encontrar o nome do arquivo a ser aberto. Então, ele extrai os atributos e endereços de disco, ou direta- mente a partir da entrada de diretório ou da estrutura de dados apontada, e os coloca em uma tabela na memória principal. Todas as referências subseqüentes ao arquivo usam as informa- ções que estão na memória principal. O número de diretórios varia de um sistema para outro. A forma mais simples de siste- ma de diretório é um único diretório contendo todos os arquivos de todos os usuários, como ilustrado na Figura 5-6(a). Nos primeiros computadores pessoais, esse sistema de diretório único era comum, em parte porque havia apenas um usuário. (a) jogos correio notícias trabalho atributos atributos atributos atributos Estrutura de dados contendo os atributos (b) jogos correio notícias trabalho Figura 5-5 (a) Atributos na própria entrada de diretório. (b) Atributos em outro lugar. O problema de ter apenas um diretório em um sistema com vários usuários é que dife- rentes usuários podem, acidentalmente, usar os mesmos nomes para seus arquivos. Por exem- plo, se o usuário A cria um arquivo chamado mailbox e, posteriormente, o usuário B também CAPÍTULO 5 • SISTEMA DE ARQUIVOS 455 cria um arquivo chamado mailbox, o arquivo de B sobrescreverá o arquivo de A. Conseqüen- temente, esse esquema não é mais usado em sistemas multiusuário, mas poderia ser usado em um pequeno sistema embarcado, por exemplo, um assistente digital pessoal portátil (PDA) ou um telefone celular. Para evitar os confl itos causados pelo fato de diferentes usuários escolherem o mesmo nome de arquivo para seus próprios arquivos, o próximo passo é fornecer a cada usuário um diretório privado. Desse modo, os nomes escolhidos por um usuário não interferem nos nomes escolhidos por outro, e não há nenhum problema causado pelo fato de o mesmo nome ocorrer em dois ou mais diretórios. Esse projeto leva ao sistema da Figura 5-6(b). Ele poderia ser usado, por exemplo, em um computador multiusuário ou em uma rede de computadores pessoais simples que compartilhasse um servidor de arquivos comum em uma rede local. Implícito nesse projeto está o fato de que, quando um usuário tenta abrir um arquivo, o sistema operacional sabe quem é ele, para saber qual diretório deve pesquisar. Como con- seqüência, é necessário algum tipo de procedimento de login, no qual o usuário especifi que um nome de login ou uma identifi cação, algo não exigido em um sistema de diretório de um único nível. Quando esse sistema é implementado em sua forma mais básica, os usuários só podem acessar arquivos em seus próprios diretórios. 5.2.2 Sistemas de diretório hierárquicos A hierarquia de dois níveis elimina os confl itos de nome de arquivo entre os usuários. Mas outro problema é que os usuários com muitos arquivos talvez queiram agrupá-los em sub- grupos menores; por exemplo, um professor talvez queira separar anotações para uma aula a partir de rascunhos de capítulos de um novo livro-texto. O que é necessário é uma hierarquia geral (isto é, uma árvore de diretórios). Com essa estratégia, cada usuário pode ter quantos diretórios forem necessários para que os arquivos possam ser agrupados naturalmente. Essa estratégia aparece na Figura 5-6(c). Aqui, os diretórios A, B e C contidos no diretório-raiz pertencem cada um a um usuário diferente, dois dos quais criaram subdiretórios para projetos em que estão trabalhando. (a) (b) (c) Diretório Arquivo Arquivos Diretório-raiz Diretório de usuário Subdiretórios de usuário C C C C C C B B A A B B C C C BA A A B B C CC C A A B C Diretório-raiz Diretório-raiz Figura 5-6 Três projetos de sistema de arquivos. (a) Diretório único compartilhado por todos os usuá- rios. (b) Um diretório por usuário. (c) Árvore arbitrária por usuário. As letras indicam o proprietário do diretório ou arquivo. 456 SISTEMAS OPERACIONAIS A capacidade de criar um número arbitrário de subdiretórios fornece uma ferramenta de estruturação poderosa para os usuários organizarem seu trabalho. Por isso, praticamente todos os sistemas de arquivos de PCs e servidores modernos são organizados dessa maneira. Entretanto, conforme mencionamos antes, a história freqüentemente se repete com no- vas tecnologias. As câmaras digitais precisam registrar suas imagens em algum lugar, nor- malmente em uma memória fl ash. As primeiras câmaras digitais tinham um único diretório e chamavam os arquivos de DSC0001.JPG, DSC0002.JPG etc. Entretanto, não demorou muito para os fabricantes de câmaras construírem sistemas de arquivos com vários diretórios, como se vê na Figura 5-6(b). Que diferença faz se nenhum dos proprietários de câmara sabe usar vários diretórios e, provavelmente, não poderiam imaginar qualquer usopara esse recurso, mesmo que soubessem? Afi nal, isso é apenas software (incorporado) e, assim, não custa qua- se nada para o fabricante fornecer. Será que vai demorar muito para surgirem câmaras digitais com sistemas de arquivos hierárquicos completos, múltiplos logins e nomes de arquivo de 255 caracteres? 5.2.3 Nomes de caminho Quando o sistema de arquivos é organizado como uma árvore de diretórios, é necessário al- guma maneira de especifi car os nomes de arquivo. Dois métodos diferentes são comumente usados. No primeiro método, cada arquivo recebe um nome de caminho absoluto (absolute path name), consistindo no caminho do diretório-raiz até o arquivo. Como exemplo, o cami- nho /usr/ast/mailbox signifi ca que o diretório-raiz contém um subdiretório usr/ que, por sua vez, contém um subdiretório ast/, o qual contém o arquivo mailbox. Os nomes de caminho absolutos sempre começam no diretório-raiz e são exclusivos. No UNIX, os componentes do caminho são separados por /. No Windows, o separador é \. Assim, nesses dois sistemas, o mesmo nome de caminho seria escrito como segue: Windows \usr\ast\mailbox UNIX /usr/ast/mailbox Independente do caractere usado, se o primeiro caractere do nome de caminho é o separador, então o caminho é absoluto. O outro tipo de nome é o nome de caminho relativo (relative path name). Ele é usado em conjunto com o conceito de diretório de trabalho (working directory), também chamado de diretório corrente (current directory). Um usuário pode designar um diretório como dire- tório de trabalho corrente, no caso em que todos os nomes de caminho que não começam no diretório-raiz são considerados relativos ao diretório de trabalho. Por exemplo, se o diretório de trabalho corrente é /usr/ast, então o arquivo cujo caminho absoluto é /usr/ast/mailbox pode ser referenciado simplesmente como mailbox. Em outras palavras, o comando UNIX cp /usr/ast/mailbox /usr/ast/mailbox.bak e o comando cp mailbox mailbox.bak fazem exatamente a mesma coisa, se o diretório de trabalho é /usr/ast/. Freqüentemente, a forma relativa é mais conveniente, mas faz a mesma coisa que a forma absoluta. Alguns programas precisam acessar um arquivo específi co sem considerar qual é o diretório de trabalho. Nesse caso, eles sempre devem usar nomes de caminho absolutos. Por exemplo, um corretor ortográfi co talvez precise ler /usr/lib/dictionary para fazer seu trabalho. Nesse caso, ele deve usar o nome de caminho absoluto completo, pois não sabe qual será o CAPÍTULO 5 • SISTEMA DE ARQUIVOS 457 diretório de trabalho quando for chamado. O nome de caminho absoluto sempre funciona, independente de qual seja o diretório de trabalho. É claro que, se o corretor ortográfi co precisar de um grande número de arquivos de /usr/lib/, uma estratégia alternativa será executar uma chamada de sistema para mudar seu diretório de trabalho para /usr/lib/ e, então, usar apenas dictionary como primeiro parâmetro de open. Mudando o diretório de trabalho explicitamente, ele sabe com certeza onde está na árvore de diretórios, de modo que, então, pode usar caminhos relativos. Cada processo tem seu próprio diretório de trabalho; portanto, quando um processo muda seu diretório de trabalho e depois sai, nenhum outro processo é afetado e não resta nenhum vestígio da mudança no sistema de arquivos. Dessa maneira, é sempre perfeitamente seguro um processo alterar seu diretório de trabalho quando for conveniente. Por outro lado, se uma função de biblioteca mudar o diretório de trabalho e não voltar para onde estava ao terminar, o restante do programa poderá não funcionar, porque sua suposição sobre onde está pode agora ser repentinamente inválida. Por isso, as funções de biblioteca raramente mudam o diretório de trabalho e quando precisam fazer isso, elas sempre voltam ao inicial, antes de retornar. A maioria dos sistemas operacionais que suportam um sistema de diretório hierárqui- co tem duas entradas especiais em cada diretório, “.” e “..”, geralmente pronunciadas como “ponto” e “ponto-ponto”. O ponto refere-se ao diretório corrente; ponto-ponto refere-se ao seu pai. Para ver como eles são usados, considere a árvore de arquivos UNIX da Figura 5-7. Certo processo tem /usr/ast/ como diretório de trabalho. Ele pode usar.. para subir na árvore. Diretório-raiz bin etc lib usr ast jim tmp jim bin etc lib usr tmp / ast /usr/jim lib lib dict. Figura 5-7 Uma árvore de diretórios UNIX. 458 SISTEMAS OPERACIONAIS Por exemplo, ele pode copiar o arquivo /usr/lib/dictionary em seu próprio diretório, usando o comando cp ../lib/dictionary . O primeiro caminho instrui o sistema a ir para cima (para o diretório usr) e, depois, para ir para baixo até o diretório lib/, para encontrar o arquivo dictionary. O segundo argumento (o ponto) fornece o nome do diretório corrente. Quando o co- mando cp recebe um nome de diretório (incluindo o ponto) como último argumento, ele copia todos os arquivos lá. É claro que uma maneira mais normal de fazer a cópia seria digitar cp /usr/lib/dictionary . Aqui, o uso do ponto evita que o usuário digite dictionary uma segunda vez. Contudo, digitar cp /usr/lib/dictionary dictionary também funciona bem, assim como cp /usr/lib/dictionary /usr/ast/dictionary Todos esses comandos fazem exatamente a mesma coisa. 5.2.4 Operações sobre diretórios As chamadas de sistema para gerenciamento de diretórios apresentam mais variações de um sistema para outro do que as chamadas de sistema para arquivos. Para dar uma idéia do que são e de como funcionam, daremos um exemplo (tirado do UNIX). 1. Create. Um diretório é criado. Ele está vazio, exceto pelo ponto e pelo ponto-pon- to, que são colocados lá automaticamente pelo sistema (ou, em alguns casos, pelo programa mkdir). 2. Delete. Um diretório é excluído. Somente um diretório vazio pode ser excluído. Um diretório contendo apenas ponto e ponto-ponto é considerado vazio, pois eles normalmente não podem ser excluídos. 3. Opendir. Os diretórios podem ser lidos. Por exemplo, para listar todos os arquivos em um diretório, um programa de listagem abre o diretório para ler os nomes de todos os arquivos que ele contém. Antes que um diretório possa ser lido, ele deve ser aberto, o que é análogo a abrir e ler um arquivo. 4. Closedir. Quando um diretório foi lido, ele deve ser fechado para liberar espaço em tabelas internas do sistema operacional. 5. Readdir. Esta chamada retorna a próxima entrada em um diretório aberto. Antiga- mente, era possível ler diretórios usando a chamada de sistema read normal, mas essa estratégia tem a desvantagem de obrigar o programador a conhecer e a lidar com a estrutura interna dos diretórios. Em contraste, readdir sempre retorna uma entrada em um formato padrão, independente de qual das possíveis estruturas de diretório esteja sendo usada. 6. Rename. Sob muitos aspectos, os diretórios são exatamente como os arquivos e podem ser renomeados da mesma maneira que os arquivos. 7. Link. A vinculação, ou atalhos, é uma técnica que permite a um arquivo aparecer em mais de um diretório. Esta chamada de sistema especifi ca um arquivo existente
Compartilhar