UNIVERSIDADE DO VALE DO RIO DOS SINOS Ciências Exatas e Tecnológicas Graduação Tecnológica em Segurança da Informação - Disciplina de Estruturas de Dados em C++ Prof. Leandro Tonietto Trabalho Objetivo Implementar software para gerenciar armazenamento de arquivos. O software deve controlar o acesso ao disco, determinar a melhor forma de armazenamento dos arquivos para evitar fragmentação e saber como recuperar informações de arquivo do disco. Pode-se considerar que tem funcionamento baseado na idéia de journally. Funcionalidades do sistema A interface padrão do sistema é edição de texto. Sempre que o usuário executar o sistema, ele entra em modo de edição de um arquivo novo. O sistema deve mostrar também as seguintes opções de menu: editar texto, salvar, carregar, novo, excluir, flush, salvar imagem do disco virtual e carregar imagem do disco virtual. O diagrama de funcionamento geral do sistema pode ser visto abaixo (não é um diagrama de classes): Tabela de alocação de arquivos Interface GSA Disco virtual Blocos de bytes arquivo Disco físico Fila de arquivos Opções do sistema: • Editar texto: a interface retira o menu e permite que o usuário digite caracteres que serão inseridos em um arquivo na memória. Quanto o usuário digitar FIM numa linha, o sistema acaba a edição e, efetivamente, insere os caracteres lidos no objeto do arquivo e retorna ao menu principal. • Novo arquivo: o sistema limpa a tela e cria um novo arquivo na memória e entra automaticamente na opção editar texto. • Salvar arquivo: a interface solicita ao usuário que informe o caminho aonde o arquivo deve ser gravado e passa os dados e o nome do caminho do arquivo para o Gerenciador do Sistema de Arquivos (GSA). O GSA coloca o objeto do arquivo numa fila de arquivos a serem gravados no disco virtual e preenche uma entrada na tabela de alocação de arquivos. Alternativamente, o GSA pode apenas gravar na fila sem registrar na TAA uma entrada para o arquivo. Neste caso, antes de se fazer a pesquisa pelo arquivo na TAA, deve-se pesquisar pelo mesmo na Fila de espera. Após “salvar” arquivo, interface retorna ao menu principal. • Flush: esta opção solicita ao GSA que efetive a gravação dos arquivos da fila em disco. Antes de gravar cada um dos arquivos em disco, o GSA deve verificar qual é a melhor área para gravação dos blocos arquivo no disco (veja seção escolha da melhor área para gravação). O sistema efetiva a gravação dos mesmos em disco e atualiza a entrada do mesmo na tabela de alocação de arquivos (veja seção tabela de alocação de arquivos). Após este procedimento, volta ao menu principal. Av. Unisinos, 950 Caixa Postal 275 CEP 93022-000 Fone: (51) 3591-1122 Fax: (51) 3590-8172 Email: São Leopoldo Rio Grande do Sul http://www.unisinos.br [email protected] Site: http://www.inf.unisinos.br/~ltonietto Brasil UNIVERSIDADE DO VALE DO RIO DOS SINOS Ciências Exatas e Tecnológicas • Abrir arquivo: a interface solicita ao usuário qual é a identificação do arquivo (veja seção arquivo), depois solicita ao gerenciador do sistema de arquivos (GSA) que retorne todos os bytes do arquivo. O GSA localiza na tabela de referências de arquivos o endereço do primeiro bloco de armazenamento de dados do arquivo, recupera os blocos que compõem os dados do arquivo, remonta os bytes contidos nos blocos do arquivo no disco, obtém da tabela de alocação de arquivos os metadados referentes ao mesmo e retorna a representação do arquivo para a interface. A interface apresenta (imprime) os dados para o usuário. É importante mencionar que, o GSA deve considerar que o arquivo pode estar em disco ou ainda não sido efetivamente salvo, portanto, na fila de espera. Sendo assim, ele deve verificar primeiro se o arquivo está na fila de arquivos e somente depois verificar a existência do arquivo no disco virtual. Após o procedimento, o sistema pode voltar para o menu principal ou entrar diretamente na opção editar texto (lembrese de que pode ser complicado fazer edição de um texto já existente, portanto, apenas exiba o conteúdo do arquivo não permita edição). • Remover arquivo: a interface solicita que um arquivo seja removido do sistema de arquivos. O GSA primeiro verifica se o arquivo está na fila e, caso positivo, apenas o retira da fila. Caso contrário, verifica a existência do arquivo em disco (disco virtual). Caso exista, remove os blocos do arquivo do disco virtual e também a entrada do arquivo na TAA. Após o procedimento, o sistema retorna ao menu principal. • Salvar imagem do disco virtual: solicita ao GSA que grave o disco virtual em arquivo do HD. • Carregar imagem do disco virtual: carrega do HD (de arquivo) o disco virtual assim como estava quando foi solicitada a geração da imagem do disco virtual. Arquivo O arquivo é uma estrutura de dados que contém um array de bytes (conteúdo), um nome, uma identificação única e demais informações que o aluno julgar importante manter a respeito do arquivo. Em disco, o arquivo é apenas uma lista encadeada de blocos de bytes, onde cada bloco possui até 16 bytes de dados e um apontamento para o próximo bloco de dados. O número de bytes por bloco pode ser configurável, portanto, o sistema deveria ser capaz de gerenciar blocos de qualquer tamanho. Quando os dados de um arquivo devem ser recuperados, o sistema deve acessar o disco virtual, carregar os blocos do arquivo e remontar o array de bytes original. Tabela de alocação de arquivos (TAA) A tabela de alocação de arquivos é uma lista de metadados de arquivos. Idealmente, deve-se utilizar uma estrutura do tipo Hashtable para gerenciar as entradas, ou uma lista seqüencial ou até uma árvore genérica. Cada entrada da tabela de metadados possui: nome do arquivo, endereço do primeiro bloco, quantidade de blocos do arquivo (ou tamanho em bytes do arquivo) e demais dados que o aluno julgar interessante (talvez seja útil algum flag para indicar se o arquivo já efetivado em disco ou não). É importante salientar ainda, que o arquivo em memória possui tanto os metadados quanto os bytes de conteúdo. Em disco, o arquivo é composto uma lista de blocos de bytes. E os seus metadados são armazenados na TAA. Escolha da melhor área para gravação dos blocos dos arquivos. Por questões de performance de leitura, é muito mais rápido ler os dados (blocos de bytes) em seqüência. Entretanto, a fim de evitar desperdício ou fragmentação do espaço disponível em disco, o GSA escolhe reaproveita blocos livres do disco virtual. Portanto, tem-se um paradoxo: é melhor que os dados estejam gravados de forma seqüencial, porém também é importante evitar fragmentação. A solução é implementar um algoritmo que tente privilegiar as duas situações da melhor maneira possível. Por exemplo, o algoritmo pode procurar primeiro por um espaço contínuo de blocos livres que tenha o tamanho suficiente para armazenar todos os blocos do arquivo em seqüência; caso ele não encontre, então reaproveita blocos livres. Av. Unisinos, 950 Caixa Postal 275 CEP 93022-000 Fone: (51) 3591-1122 Fax: (51) 3590-8172 Email: São Leopoldo Rio Grande do Sul http://www.unisinos.br [email protected] Site: http://www.inf.unisinos.br/~ltonietto Brasil UNIVERSIDADE DO VALE DO RIO DOS SINOS Ciências Exatas e Tecnológicas O aluno pode sugerir ou implementar o algoritmo de gerenciamento de blocos livres que ele preferir, desde que evite a fragmentação do disco. Demais considerações sobre o trabalho Trabalho deve ser realizado em duplas Deve ser feito exclusivamente em C++ Deve ser entregue compilável e executável. A entrega do trabalho é feita em duas etapas, uma para GA e outra (final) para o GB. Não serão permitidas entregas após o prazo de entrega. A entrega é composta pelos códigos-fonte do programa devidamente comentados, identados e compiláveis, bem como pelo executável e demais bibliotecas necessárias para execução. Avaliação O trabalho deve ser entregue até o dia 25/11/2008 e contém os seguintes itens entregáveis: Diagrama de classes para compreensão do sistema como um todo (este não valerá nota, apenas para entendimento da solução proposta). Qualidade do código-fonte: ■ Deve ser feito em C++. Códigos-fonte em C serão sumariamente reprovados. ■ Deve-se usar classes para desenvolvimento do trabalho. Funcionamento: funcionamento do sistema deve obedecer as regras das opções do sistema, supra citadas. Apresentação do código-fonte ao professor. Todo código-fonte deve apresentado e explicado ao professor. Avaliação individual, contribuição de cada integrante para o desenvolvimento do programa. Versão da especificação: 1.0, 19/09/2008. Av. Unisinos, 950 Caixa Postal 275 CEP 93022-000 Fone: (51) 3591-1122 Fax: (51) 3590-8172 Email: São Leopoldo Rio Grande do Sul http://www.unisinos.br [email protected] Site: http://www.inf.unisinos.br/~ltonietto Brasil