Prévia do material em texto
Estrutura de arquivos 1. Introdução Armazenar dados significa retê-los para assegurar que sejam recuperados e utilizados quando quer que sejam necessários. Nessa perspectiva, desprende-se o conceito de memória, a qual consiste em dispositivos eletrônicos responsáveis por realizar essa função de armazenamento. Assim, o presente texto versará sobre os tipos de memória, suas estruturas e seu funcionamento, explicando suas características e peculiaridades. 2. Hierarquia de armazenamento 2.1. Armazenamento primário Um dos tipos de armazenamento é o primário. Ele caracteriza-se por ser rápido, pequeno comparado aos outros tipo e volátil (os dados somem quando o computador é desligado). A exemplo disso, há a memória RAM (Random Access Memory) que guarda temporariamente os dados ativos do computador e a memória cache, cuja função é armazenar de forma temporária as informações mais acessadas pelo processador. 2.2. Armazenamento secundário Em contrapartida, a memória secundária é lenta e extensa, porém, não-volátil. Por exemplo, o disco rígido do computador (HD) e a Solid State Drive (SSD). Além de sua capacidade, um fator que torna o HD mais indolente é o fato de ele ser um dispositivo mecânico, o que impacta diretamente seu desempenho. 2.3. Armazenamento terciário Ademais, há a memória terciária, que também é ampla e mantém as informações a longo prazo. Entretanto, ela precisa ser inserida, pois é externa ao computador. Exemplos clássicos são os disquetes, CDs e Pen Drives. 3. Anatomia e desempenho do Disco magnético Para compreender a organização de arquivos, é crucial entender a estrutura do disco magnético (HD), o principal meio de armazenamento secundário. 3.1. Estrutura Física e Lógica Um HD é composto por um eletroímã (cabeçote) que se move sobre pratos magnéticos que giram, a fim de ler/interpretar, gravar ou alterar os dados contidos nos pratos, como mostra a Figura 1 abaixo: Figura 1. Estrutura do HD [1] A informação é gravada magneticamente nesses pratos em partes; por exemplo, para guardar 1 byte (8 bits) em um sistema com 4 pratos, cada prato armazenaria 2 bits daquele byte. O cabeçote de leitura/escrita, um componente eletromagnético, move-se sobre os pratos para ler, gravar ou alterar os dados. É importante notar que o cabeçote não encosta fisicamente na superfície do disco, mas flutua a uma distância mínima sobre ela. A organização dos dados segue uma geometria específica: ● Trilha: Corresponde a uma volta completa do prato, formando um círculo concêntrico. Quanto mais externa a trilha, maior seu comprimento físico, pois seu raio é maior. ● Setor: As trilhas são divididas fisicamente em pedaços de tamanho fixo chamados setores. ● Bloco: É a unidade lógica de transferência de dados entre o disco e a memória principal. Um bloco é formado por um ou mais setores, e seu tamanho é definido durante a formatação do disco. O cabeçote sempre lê ou escreve um bloco de dados por vez. O endereço de um bloco no disco é fixo e não varia. ● Página: Em muitos contextos de banco de dados, o termo "página" é utilizado como sinônimo de "bloco". 3.2. Métricas de Desempenho O fato de o HD ser um dispositivo mecânico o torna lento em comparação com a memória primária. O tempo total para acessar um bloco de dados no disco é a soma de três componentes, majoritariamente mecânicos: ● Tempo de Pesquisa (Seek Time): O tempo necessário para o braço mecânico mover o cabeçote de leitura/escrita até a trilha correta. ● Tempo de Latência Rotacional: O tempo de espera para que o giro do disco posicione o início do setor desejado sob o cabeçote. ● Tempo de Transferência de Bloco: O tempo para que os dados do bloco sejam efetivamente lidos e transferidos para a memória. Esta é a única parte do processo que não é puramente mecânica, mas sua velocidade ainda depende da rotação do disco. A soma desses tempos resulta em um acesso que é ordens de magnitude mais lento que o acesso à memória RAM, tornando a E/S (Entrada/Saída) de disco o principal gargalo de desempenho em sistemas de banco de dados. 4. Buffering de blocos Para mitigar a lentidão do acesso ao disco, os sistemas utilizam buffers. Um buffer é um pedaço de memória principal (RAM) reservado para armazenar temporariamente os dados que estão sendo transferidos do ou para o disco. Quando um programa solicita a leitura de um arquivo, o sistema operacional copia um bloco do disco para um buffer na memória. O programa, então, processa os dados diretamente do buffer, que é um acesso muito mais rápido. Uma técnica comum para otimizar leituras sequenciais é o buffering duplo, que utiliza dois buffers. Enquanto a CPU processa os dados do primeiro buffer, o controlador de disco, em paralelo, já está lendo o próximo bloco do disco e preenchendo o segundo buffer. Isso cria um fluxo contínuo de dados e mascara a latência do disco para todos os blocos, exceto o primeiro. 5. Organização de Arquivos e Registros A forma como os dados são estruturados em arquivos e alocados em blocos impacta diretamente a eficiência do armazenamento e do acesso. 5.1. Conceitos fundamentais ● Arquivo: É uma sequência de registros. Geralmente, um arquivo contém registros de um mesmo tipo, descrevendo uma coleção de entidades semelhantes. ● Registro: Corresponde a uma instância de uma entidade (por exemplo, um funcionário, um produto). É uma coleção de campos relacionados. ● Campo: Representa um atributo de um registro (por exemplo, o nome ou o salário de um funcionário). 5.2. Registros de Tamanho Fixo vs. Variável Os registros podem ter tamanho fixo, onde todos ocupam o mesmo espaço, ou tamanho variável. A variabilidade pode ocorrer devido a campos com comprimentos diferentes (como um campo de "descrição"), campos opcionais (que podem ser nulos) ou campos multivalorados (que contêm uma lista de valores). Para gerenciar registros de tamanho variável, são utilizados caracteres separadores especiais que delimitam o início e o fim de cada campo ou registro. Esse mecanismo é análogo ao processo de síntese proteica na biologia celular. Na tradução do material genético, a maquinaria celular precisa saber exatamente onde começar e onde parar de ler a fita de RNA mensageiro (RNAm) para construir uma proteína corretamente. Essa sinalização é feita por sequências específicas de nucleotídeos chamadas códons. O códon "AUG", por exemplo, atua como um sinal de "início", marcando o ponto de partida para a tradução. De forma similar, códons de "parada" (como UAA, UAG e UGA) indicam o fim da sequência a ser traduzida. Da mesma forma que esses códons delimitam a informação genética, os caracteres separadores em um arquivo delimitam a informação digital, garantindo que o sistema de computador possa interpretar corretamente os limites de cada campo e registro, mesmo quando seus tamanhos não são predefinidos. 6. Blocagem de Registros A alocação de registros em blocos é chamada de blocagem. O fator de blocagem (bfr), ou taxa de blocagem, define a quantidade de registros que um bloco suporta e é calculado pela fórmula bfr=⌊B/R⌋, onde B é o tamanho do bloco e R é o tamanho do registro, arredondando-se o resultado para baixo. Existem duas abordagens principais para a blocagem, as quais serão abordadas a seguir. 6.1 Blocagem Não Espalhada (Unspanned) Cada registro deve começar e terminar no mesmo bloco. Essa abordagem torna mais fácil e rápido localizar um registro, pois sua posição dentro do bloco pode ser calculada diretamente. No entanto, pode levar ao desperdício de espaço no final de cada bloco se o tamanho dos registros não for um divisor exato do tamanho do bloco. ● Leitura: Para ler um registro, o sistema realiza uma única operação de E/S para transferir o bloco que contém o registro para a memória. Como o registro está inteiramente contido nesse bloco, nenhuma buscaadicional é necessária, tornando o acesso mais rápido. ● Escrita: Para inserir um novo registro, o sistema localiza um bloco com espaço livre suficiente para acomodar o registro inteiro. O bloco é então transferido para um buffer, o novo registro é adicionado e o bloco é reescrito no disco em uma única operação de E/S. 6.2. Blocagem Espalhada (Spanned) Um registro pode começar em um bloco e terminar em outro. No final do bloco inicial, um ponteiro indica o endereço do próximo bloco que contém o restante do registro. Essa técnica otimiza o aproveitamento do espaço, mas torna o acesso aos registros mais complexo, pois, durante a leitura exige a navegação através de ponteiros. ● Leitura: A leitura de um registro que se estende por múltiplos blocos requer várias operações de E/S. O sistema primeiro lê o bloco inicial, processa o primeiro segmento do registro e, em seguida, segue o ponteiro para ler o próximo bloco. Esse processo se repete até que todos os segmentos do registro sejam lidos e remontados na memória, o que torna a operação mais lenta. ● Escrita: Ao escrever um novo registro, o sistema preenche o espaço disponível no bloco atual. Se o registro for maior que o espaço restante, ele é dividido: a primeira parte é escrita no bloco atual, um ponteiro para um novo bloco é adicionado, e a parte restante do registro é escrita no bloco seguinte. Isso pode exigir múltiplas operações de escrita em disco. 7. Organização primária de arquivo A organização de arquivo primária determina a ordem física na qual os registros são colocados no disco. A escolha da organização primária é uma das decisões de projeto mais fundamentais, pois define o método de acesso padrão e o desempenho para operações básicas. 7.1 Arquivos Desordenados (Heap) Na sua forma mais simples, os registros são inseridos na ordem em que chegam, com novos registros sendo sempre adicionados ao final do arquivo. Essa organização é chamada de arquivo de heap ou pilha. ● Operações: A inserção é extremamente eficiente. No entanto, a busca por um registro específico exige uma varredura linear de todo o arquivo, lendo e inspecionando cada bloco, o que é um processo dispendioso. ● Manutenção: Para excluir um registro, uma técnica comum é usar um marcador de exclusão, um bit ou byte extra que indica se o registro é válido. O registro permanece fisicamente no disco, mas é ignorado pelas buscas. Com o tempo, isso desperdiça espaço e exige uma reorganização periódica do arquivo para remover fisicamente os registros marcados. 7.2 Arquivos Ordenados (Sequenciais) Uma alternativa é manter os registros fisicamente ordenados no disco com base nos valores de um campo de classificação. ● Vantagens: Esta organização é otimizada para leitura. A leitura sequencial é muito rápida, e a ordem física permite o uso de pesquisa binária nos blocos, o que reduz drasticamente o custo de busca de um registro específico para O(log2 b) acessos a blocos. ● Desafios: A principal desvantagem é o alto custo de inserção e exclusão. Para inserir um novo registro, é preciso encontrar sua posição correta e deslocar todos os registros subsequentes para abrir espaço, o que é inviável para arquivos dinâmicos. Para contornar isso, pode-se usar um arquivo de overflow desordenado, onde as novas inserções são colocadas. Isso acelera as inserções, mas complica a busca, que agora precisa verificar o arquivo principal (com busca binária) e o arquivo de overflow (com varredura linear). 8. Arquivos de Registros Mistos As organizações de arquivo que vimos até agora assumem que todos os registros são do mesmo tipo. No entanto, em muitos sistemas de banco de dados, especialmente os mais antigos (hierárquicos e de rede) e os orientados a objetos, é comum ter arquivos de registros mistos. Nessa abordagem, registros de tipos diferentes são fisicamente agrupados no disco para representar relacionamentos. Por exemplo, um registro de DEPARTAMENTO pode ser seguido por todos os registros de FUNCIONARIO que pertencem a ele. Isso pode aumentar muito a eficiência de consultas que recuperam entidades relacionadas. Para que o sistema possa interpretar esses arquivos, cada registro precisa de um campo de tipo de registro que o identifique. 9. Conclusão A análise das estruturas de armazenamento e organização de arquivos revela um conjunto de compromissos fundamentais. A hierarquia de memória equilibra velocidade e custo, forçando os sistemas de banco de dados a gerenciar a lenta transferência de dados do disco para a RAM. A própria estrutura mecânica do disco rígido impõe gargalos de desempenho, que são mitigados por técnicas como o buffering. A escolha entre uma organização desordenada (heap) para inserções rápidas e uma ordenada para buscas eficientes demonstra um trade-off crucial. Este trabalho se propôs a explicar essas estruturas e seu funcionamento, e a explanação evidencia que não há uma solução única e ideal. A escolha de uma organização de arquivo depende diretamente da natureza das operações que serão realizadas. Uma limitação deste texto é não aprofundar em estruturas de acesso auxiliares, como índices, que são construídos sobre essas fundações para otimizar operações de busca específicas, um tópico essencial para a compreensão completa do desempenho de bancos de dados. 10. Referências [1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados. 6. ed. São Paulo: Pearson Addison Wesley, 2011. 3.1. Estrutura Física e Lógica Figura 1. Estrutura do HD [1] 3.2. Métricas de Desempenho 7.1 Arquivos Desordenados (Heap) 7.2 Arquivos Ordenados (Sequenciais)