O que sabemos até agora sobre memórias nos autoriza a concluir que nem todo tipo de memória admite o mesmo método de acesso. Afinal, o acesso a uma posição da memória principal, situada na própria placa-mãe, há de ser mais simples e rápido que o acesso a algo armazenado, por exemplo, em um dado setor de certa trilha de uma face de um disco magnético. E de fato assim é: tipos diferentes de memória admitem diferentes métodos de acesso.
Métodos de acesso à memória.
Vamos começar discutindo o chamado “acesso seqüencial”, aquele em que conjuntos de dados e informações dispostos seqüencialmente na memória em unidades denominadas “registros” são acessados linearmente, um após o outro.
Os registros são todos de mesmo tamanho (em bytes) e contêm conjuntos de informações denominados “campos” sempre dispostos na mesma ordem. O conjunto dos registros forma um elemento de um “banco de dados”. O exemplo típico é a relação de empregados de uma empresa, na qual cada registro corresponde a um empregado. Neste caso os campos que compõem um registro corresponderiam aos dados pessoais dos empregados e cada registro poderia ser formado, por exemplo, pelos seguintes campos: Matrícula; Sobrenome; Nome; Data de nascimento; Data de admissão; Endereço; etc.
Para que os registros possam manter o mesmo tamanho, o número de bytes ocupado por cada campo é sempre o mesmo. Por exemplo: o campo “Nome” de cada registro disporá sempre de, digamos, doze bytes, enquanto o campo “Sobrenome” disporá de 30. Se o nome ou sobrenome de um determinado empregado forem menores do que isso, “sobrarão” bytes naqueles campos de seus registros e, se forem maiores, terão que ser abreviados.
Pelo menos um dos campos será sempre diferente do campo correspondente de todos os demais registros (no nosso caso poderia ser a “Matrícula”) e será utilizado para “indexar” o conjunto de registros (ou seja, determinar a seqüência a ser obedecida por eles, a ordem em que se disporão na memória). Este será o “campo chave”.
Entre cada dois registros sucessivos serão armazenadas informações adicionais obtidas desses índices que não somente separarão os registros como também serão usadas para facilitar o endereçamento e a localização de um registro na memória.
(Aos puristas: esta coluna não tem por objetivo detalhar conceitos relativos a bancos de dados e seus registros mas apenas apresentar os conceitos básicos necessários ao entendimento do método de acesso seqüencial, daí a simplificação).
O acesso seqüencial é tipicamente usado em dispositivos de armazenamento que se utilizam de fita magnética, um tipo de memória que ultimamente vem caindo em desuso mas que já foi o principal meio de armazenamento de massa de computadores (o IBM PC, principal responsável pela disseminação dos microcomputadores, quando lançado em agosto de 1981 não oferecia suporte para discos rígidos e seu acionador de discos flexíveis era um item opcional; seu principal meio de armazenamento era uma unidade de fitas cassete, das mesmas que então se usava para áudio).
Em toda memória que admite acesso seqüencial existe um mecanismo de leitura (geralmente também usado para a escrita) que percorre a memória linearmente, passando seqüencialmente de registro em registro, identificando cada um deles, até localizar o registro que se deseja consultar ou alterar. No caso das fitas, este mecanismo é a cabeça magnética de leitura e gravação (para os chegados a um preciosismo: estritamente falando, a cabeça magnética não “percorre” a fita, ela permanece parada enquanto a fita se desloca em frente a ela, mas para fins de localização de um registro evidentemente não faz qualquer diferença quem se move e quem fica parado).
Usando o exemplo da fita e imaginando que acabou-se de introduzir a fita em seu acionador e se deseja consultar um byte de um campo contido no registro de ordem 135: para fazê-lo, há que “rebobinar” a fita (retornar ao início), localizar o primeiro registro e, então, movê-la para a frente, lendo seqüencialmente as informações de endereçamento de registro a registro até localizar o de ordem 135 e efetuar a consulta (mas note que neste caso não é possível ler um byte individual: é necessário copiar todo o registro para a memória principal e lá, identificar os campos e buscar o byte no interior do campo que o contem).
Isto feito, para consultar, digamos, o registro de ordem 120, não será necessário retornar ao início e contar novamente 120 registros: como a máquina “sabe” que o mecanismo de leitura acabou de consultar o registro 135, basta mover a fita para trás contando quinze registros. Ou seja: o acesso seqüencial não exige que se retorne sempre ao início, desde que se saiba em que registro se “está” e para a qual se deseja “ir”. Mas exige que se conte, seqüencialmente, todos os registros intermediários. O que faz com que o tempo de acesso a um registro varie bastante dependendo de quantos registros existem entre o último e ser consultado e o a ser consultado em seguida. Porém, comparado aos demais, é o mais lento.
No extremo oposto está o chamado “acesso aleatório” empregado para consultar as posições da memória principal e, eventualmente, alterar o conteúdo.
Como sabemos, cada unidade de armazenamento (posição de memória) da MP é identificada inconfundivelmente por seu endereço, um número que exprime sua posição relativa às demais unidades de armazenamento. O acesso a uma posição de memória principal depende, então, exclusivamente do conhecimento de seu endereço.
Diferentemente das fitas (e dos discos magnéticos, como veremos a seguir), na memória principal não existe um mecanismo único de acesso à memória (a cabeça magnética; no caso dos discos, uma cabeça por face, veja adiante) responsável pela leitura e escrita em todas as posições de memória. Na MP cada posição de memória (ou seja, cada unidade endereçável) dispõe de um mecanismo de acesso fisicamente conectado a ela (veremos detalhes quando estudarmos a lógica interna dos circuitos de memória de semicondutores) ligado ao chamado “barramento frontal” que a interliga diretamente à unidade central de processamento. Para ter acesso a uma dada posição basta acionar este mecanismo e selecioná-la. Desta forma, o tempo de acesso a qualquer posição de memória é sempre o mesmo, independentemente de seu endereço, de sua posição em relação às demais e da posição anterior a ser acessada.
Isto significa que qualquer posição de memória principal, ou unidade endereçável, pode ser acessada diretamente, selecionada por seu endereço, seja ele qual for. O acesso independe da ordem, da posição relativa ou de qualquer outro fator. Qualquer endereço, escolhido aleatoriamente, pode ser selecionado e ter seu acesso estabelecido. Este método de acesso é o acesso aleatório.
Discos magnéticos, óticos e a maioria das unidades de armazenamento que constituem a memória externa (veja coluna anterior, “XXXIV: Localização da memória”) admitem um método de acesso intermediário entre o seqüencial e o aleatório. Este método chama-se “acesso direto”.
Semelhantemente às fitas, os primeiros dispositivos a admitir acesso direto dispunham de um mecanismo único de leitura e escrita. Eram eles os discos magnéticos de uma face (flexíveis e rígidos) com uma única cabeça de leitura/gravação e os dados dispostos em setores que se distribuem em trilhas circulares concêntricas sobre a única face do disco. Mas, ao contrário das fitas, estas cabeças não precisavam percorrer o disco setor a setor para encontrar aquele que se deseja consultar.
|
Figura 1: Estrutura de um disco rígido. |
A estrutura lógica de um disco rígido moderno é apresentada esquematicamente na Figura 1 (este tipo de dispositivo de armazenamento será discutido em detalhes mais adiante, portanto não se aflija com a falta de pormenores; a Figura 1 tem por fim apenas nos ajudar a entender o tipo de acesso direto). Ela mostra um disco rígido formado por três discos unitários, portanto com seis faces. Cada face dispõe de sua própria cabeça de leitura/gravação, todas interligadas ao mesmo mecanismo de leitura. Cada face é dividida em trilhas com o formato de circunferências concêntricas que por sua vez são divididas em setores que, como sabemos da coluna “XXXIII: Posições de memória”, contêm 512 bytes cada.
Como mencionado acima, para ter acesso a um desses bytes lendo o setor que o contém, não é preciso percorrer todo o disco até chegar a ele, basta saber em que setor de que trilha de que face ele está contido.
Vamos supor que se pretenda ler o vigésimo quinto byte do setor 11 da trilha 4 da face 3 do disco rígido mostrado na figura. Como se vê, ele tem seis faces (numeradas de zero a cinco) e cada uma delas dispõe de sua própria cabeça magnética. As cabeças estão presas ao mesmo eixo que, ao girar, as move em conjunto de tal forma que quando a cabeça pertencente à face zero se situa sobre uma determinada trilha desta face, todas as demais cabeças se situarão sobre a mesma trilha de suas faces (e o conjunto de trilhas assim selecionadas formará um cilindro imaginário, o que faz com que alguns fabricantes de discos rígidos se refiram às trilhas como “cilindros”). Portanto, para ler um byte de um setor situado na trilha 4 da face 3, basta fazer girar o eixo que sustenta as hastes das cabeças até que a cabeça da face zero se situe sobre a quinta trilha a contar da mais externa, sua trilha 4 (as trilhas também são numeradas a partir de zero), o que fará com que a cabeça magnética da face 3 também se situe sobre sua trilha 4.
Note que tudo isto é feito enquanto o disco (na verdade, todos os três discos, presos ao mesmo eixo) estão girando a alguns milhares de rotações por minuto. No momento em que as cabeças se situarem sobre as trilhas 4, os setores da trilha 4 da face 3 passam rapidamente sob (na verdade, devido à posição da face 3, passam sobre) a cabeça magnética correspondente, que lê as informações contidas entre os setores onde estão gravados os números de cada setor (por inexplicáveis razões, ao contrário das faces e trilhas, setores são numerados a partir de “um”). Quando encontrar o setor desejado, o de número 11 no nosso exemplo, todos os seus 512 bytes serão lidos e copiados na memória principal (já veremos porque não se lê apenas o byte desejado). E lá, na memória principal, localiza-se o vigésimo quinto byte, aquele que se deseja ler, e inspeciona-se seu valor.
Este “acesso direto”, usado nos dispositivos de memória externa, é portanto um misto entre o acesso aleatório e o seqüencial. No caso dos discos magnéticos ele é aleatório quando seleciona apenas a cabeça de leitura desejada e a move exatamente para a trilha onde se encontra o setor alvo. E é seqüencial a partir do momento que “lê” o número de cada setor que passa junto à cabeça até chegar naquele que deve ser lido (atenção: não são apenas os discos magnéticos que se utilizam do método de acesso direto; a maioria dos dispositivos de armazenamento externos também o faz).
Então pode-se dizer que, de forma genérica, o acesso direto é feito em dois passos. O primeiro é um acesso aleatório a uma vizinhança genérica do bloco de bytes a ser lido (geralmente, um setor). O segundo é um acesso seqüencial (em geral por contagem de blocos) até identificar aquele que deve ser lido. Finalmente, este bloco é transferido para a memória principal (veja, mais tarde, “unidades de transferência de dados”) onde, se necessário, os bytes podem ser identificados individualmente.
Praticamente todo dispositivo de armazenamento externo (memória secundária, ver coluna “XXXIV: Localização da memória”) admite acesso direto. Isto é fácil de entender no caso de discos magnéticos (sejam rígidos ou flexíveis) e até mesmo no caso de discos óticos (que não são subdivididos em trilhas concêntricas mas sim em uma trilha única, espiralada; veremos detalhes no devido tempo). Mas como fazer um acesso direto em um dispositivo tipo “cartão de memória”, uma memória de semicondutores sem partes móveis e sem “cabeça” de leitura/gravação? Bem, na verdade o método de acesso a estes dispositivos é bastante semelhante ao usado para a memória principal. Mas como eles foram concebidos para emular dispositivos de armazenamento externos, o sistema os “enxerga” como uma estrutura lógica muito similar à dos discos rígidos, portanto utiliza funções lógicas para simular um método de acesso direto.
Há ainda um quarto método de acesso, denominado “acesso mapeado”, usado especificamente para as memórias cache. Como memórias cache e seus diferentes tipos de método de acesso (pelo menos dois: mapeamento direto e mapeamento associativo) serão discutidos detalhadamente adiante e este método de acesso só se aplica a elas, voltaremos a ele em detalhes quando o tema “memória cache” for abordado.
Portanto podemos classificar as memórias em quatro tipos de acordo com o método de acesso que admitem:
- Acesso seqüencial;
- Acesso direto;
- Acesso aleatório;
- Acesso mapeado.
Agora que já conhecemos os diferentes métodos de acesso à memória, poderemos discutir a forma pela qual os dados são dela transferidos e para onde se dá esta transferência. O que faremos na próxima coluna.
B.
Piropo