Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
01/08/2007

< Computadores XXXVI: >
<
Unidade de transferência >


Na coluna anterior, “XXXV: Métodos de Acesso”, você deve ter notado (e talvez estranhado) o fato de que não se pode ler um byte individual de um registro (no acesso seqüencial) ou de um setor (no acesso direto) diretamente na memória externa ou secundária onde ele está armazenado (como logo veremos, para efetuar esta operação é preciso ler todo o registro ou setor, copiá-lo na memória principal e lá localizar o byte desejado).

Pois, se estranhou, estranhará ainda mais o fato de que, nos computadores modernos, nem mesmo na memória principal é possível ler um único byte. Mesmo levando em conta que cada byte da MP corresponde a uma unidade de armazenamento e dispõe de seu próprio endereço.

Isto tem a ver com o conceito de “Unidade de Transferência”.

Uma definição simplificada de “unidade de transferência” seria “o número de bits (ou bytes) lidos ou escritos em uma única operação de leitura ou escrita na memória”. Para que possamos entender o conceito, vamos reduzi-lo à sua expressão mais simples. E a expressão mais simples, no nosso caso, seria um computador pessoal muito, muito antigo, um dos primeiros que foram comercializados lá pelo final dos anos setenta do século passado, as chamadas “máquinas de oito bits”. Porém, para que possamos examinar o conceito tanto no que toca à memória primária (interna) quanto à secundária (externa), vamos adicionar à nossa máquina de oito bits um dispositivo que só foi incorporado aos computadores pessoais alguns anos mais tarde: um disco rígido.

Veja, na Figura 1, o esquema de uma máquina como esta. Repare que seus registradores são de 8 bits, inclusive o registrador de dados da memória (RDM).  Seu barramento de dados tem oito linhas e cada posição da memória primária tem oito células.  Já o registrador de endereços de memória (REM) tem 16 bits o que significa que esta máquina pode utilizar um espaço de endereçamento de 64 KB (64 quilobytes; se você não sabe por que, continue acompanhando a esta série que logo saberá). E seu disco rígido está ligado aos mesmos barramentos de dados, endereços e controle através de uma placa controladora.

Clique e amplie...
Figura 1: Esquema de “máquina de 8 bits”.

Primeiro vejamos como é feita a transferência de dados (leitura e escrita – ou gravação) na memória secundária.
Como vimos na coluna “Métodos de acesso”, a organização lógica de um disco rígido implica sua divisão em faces, trilhas e setores. Cada setor, por padrão, comporta 512 bytes. E é impossível executar uma operação de leitura ou escrita em um disco magnético (ou ótico) que abranja menos de um setor. Portanto a leitura ou escrita em um disco rígido deve ser feita pelo menos setor a setor. No caso das máquinas antigas, como a representada na Figura 1, era lido (ou gravado) um único setor por operação.

Aqui deve-se ressaltar uma diferença essencial entre os conceitos de leitura e escrita na memória principal e na memória secundária. Enquanto as operações de leitura e escrita na memória principal implicam a transferência de dados de uma (ou, como veremos adiante, mais de uma) posição de memória para a UCP (mais especificamente para seu registrador de dados da memória, RDM) ou vice-versa, as operações de leitura e escrita na memória secundária implicam a transferência de dados de todo um setor (ou de mais de um, como veremos adiante), da memória secundária para a memória principal ou vice-versa (nas máquinas modernas, dotadas do recurso de acesso direto à memória – ou DMA, de Direct Memory Access – isto é feito diretamente; nas mais antigas, é feito byte a byte através da UCP).

Como acima mencionado, nas máquinas antigas, que usavam o sistema de arquivos denominado tabela de alocação de arquivos, cada operação de leitura ou escrita abrangia um setor. Nas máquinas mais modernas, que usam sistemas de arquivos mais recentes e que abrigam discos rígidos de grande capacidade, a transferência é feita por grupos de setores denominado “clusters”.

Isto não significa, naturalmente, que não se possa ler um único byte de um setor gravado em um disco rígido. Significa apenas que esta leitura é um pouco mais complicada, já que para fazê-la é necessário copiar o setor inteiro na memória principal e, conhecida a posição do byte no interior do setor, buscá-lo na posição de memória principal correspondente (já para gravar um único byte em um disco rígido é preciso copiar na MP todo o setor – ou cluster – que o contém, efetuar a substituição do byte na MP e regravar o setor ou cluster inteiro no disco; estes conceitos ficarão mais claros durante a discussão da memória secundária).

Mas voltando ao que interessa: então, como é feita a operação de transferência de dados no caso da leitura ou escrita nos discos magnéticos? Ora, é feita obrigatoriamente abrangendo todo um conjunto de bytes que deve corresponder no mínimo a um setor ou a um grupo (número inteiro) de setores chamado cluster.

Algo parecido ocorre no caso de leitura ou escrita em fitas magnéticas, outro tipo de memória secundária. Como vimos anteriormente, esta transferência deve ser feita registro a registro, da memória secundária para a principal (leitura) ou vice-versa (escrita).

Transferências assim, nas quais cada operação envolve conjuntos de bytes (setores inteiros, grupos de setores ou registros) são chamadas “transferências em bloco”. Neste caso, a Unidade de Transferência é o “bloco”, um conjunto de bytes que pode ser um setor ou um grupo de setores no caso dos discos magnéticos e óticos, ou um registro no caso das fitas magnéticas.

Portanto, nas operações de leitura e escrita na memória secundária, a Unidade de Transferência é o “bloco” e a transferência se dá entre a memória secundária e primária (no caso da leitura) ou vice-versa (no caso da escrita).
E as operações de leitura e escrita na memória primária ou principal?

Para descobrir quantos bytes são transferidos em uma única operação de leitura ou escrita na memória principal de uma máquina simples como a mostrada esquematicamente na Figura 1 precisamos lembrar como se fazem estas operações em qualquer memória principal, um procedimento explicado detalhadamente na coluna ; “Computadores XXIX: Leitura e escrita na memória principal”, da qual sugiro uma releitura atenta. Para aqueles que acham a releitura desnecessária, vamos descrever o procedimento aqui muito resumidamente.

Para efetuar uma operação de leitura, a unidade central de processamento escreve o endereço a ser lido no registrador de endereços de memória ou REM, envia os sinais de controle solicitando a leitura e aguarda que o controlador da memória copie no registrador de dados da memória ou RDM o valor contido naquele endereço. Para efetuar a operação de escrita em uma dada posição de memória, a unidade central de processamento escreve seu endereço no REM e o valor a ser escrito no RDM, envia os sinais de controle solicitando a escrita e aguarda que o controlador de memória copie este valor para a posição de memória desejada, sobrescrevendo qualquer coisa que lá tenha sido previamente escrito.

Agora que sabemos disso tudo, olhe para a Figura 1 e pense: quantos bytes são transferidos em uma única operação de leitura ou gravação?  Considerando que cada linha do barramento de dados transporta um bit em cada uma destas operações e que este barramento de dados e tem oito linhas, é fácil concluir que, neste caso, em cada operação de leitura ou gravação são transportados 8 bits, portanto um único byte. Logo, na máquina representada na Figura 1, a Unidade de Transferência de dados da memória principal é de um byte.

Mas neste ponto convém lembrar os conceitos de “posição de memória”, “unidade de armazenamento” e “unidade endereçável”, abordados na coluna “Computadores XXXIII: Posições de memória”, e o conceito de “palavra”, abordado na coluna Computadores XVI: Componentes da UCP”. Se estes conceitos lhe são familiares, você deve estar ciente que no exemplo mostrado na Figura 1, todos estes parâmetros têm o mesmo valor: um byte.

Mas o mais importante de tudo isto é ter em mente um ponto já mencionado alguns parágrafos acima e que, por sua importância, vale repetir: cada linha do barramento de dados transporta um bit em cada operação de leitura ou escrita da memória principal.  Portanto, a Unidade de Transferência da memória principal será sempre igual à largura do barramento de dados (que por sua vez tem a mesma largura do registrador de dados da memória, ou RDM). E o RDM, em geral, tem a mesma largura dos registradores internos da unidade central de processamento e portanto o mesmo tamanho da palavra (mas cuidado que há exceções: nem sempre a largura do barramento de dados corresponde ao tamanho dos registradores internos da UCP e estes, por sua vez, nem sempre têm o mesmo tamanho da palavra; mencionaremos algumas dessas exceções adiante).

E nas máquinas modernas, como é feita a transferência de dados entre MP e UCP?

Bem, máquinas modernas são muito mais rápidas, poderosas e com muito maior capacidade de memória, tanto principal quanto secundária.  Mas, do porto de vista da estrutura interna da unidade central de processamento, a principal diferença foi o aumento do tamanho dos registradores internos. Esta diferença é tão importante que influiu na classificação das máquinas. Surgiram então as máquinas de 16 bits, 32 bits e, ultimamente, de 64 bits. Estes números se referem à largura dos registradores internos, um parâmetro que exerce grande influência no desempenho da máquina. Quanto maior esta largura, maiores são os números que podem ser armazenados em cada registrador, o que facilita extraordinariamente as operações aritméticas com grandes números.

Ora, mas se os registradores internos tornaram-se mais largos, nada impede que o registrador de dados da memória também se alargue. E a largura do registrador de dados da memória corresponde sempre ao número de linhas do barramento de dados. Assim, quanto mais moderna é a máquina e mais largos seus registradores internos, maior é o número de linhas de seu barramento de dados. E, como bem sabemos, este número corresponde ao número de bits transferidos em cada operação de leitura ou escrita na MP.

A estrutura interna da interligação entre memória principal e unidade central de processamento de uma máquina moderna, com registradores internos de 64 bits, é a mostrada e esquematicamente na Figura 2.

Clique e amplie...
Figura 2.

Repare no esquema da Figura 2. Os registradores internos da unidade central de processamento têm 64 bits, a mesma largura do registrador de dados da memória (RDM). O que faz com que o barramento de dados tenha igualmente 64 linhas.

Estas modificações, naturalmente, se refletiram na estrutura interna da memória principal. Porque, evidentemente, com registradores internos mais largos na unidade central de processamento, não faria sentido transferir dados da MP para a UCP de oito em oito bits. Repare então, no alto da Figura 2, como isto se reflete na estrutura da memória principal. A memória agora não mais é uma “pilha” de posições de memória de oito células (um byte) cada, mas uma matriz formada por linhas empilhadas de 64 células (8 bytes), cada uma correspondente ao número de condutores do barramento de dados, à largura do RDM e, no caso da Figura 2, à largura dos Registradores da UCP (a lógica usada para ler e alterar o estado de cada uma destas células, ou seja, ler e escrever na MP, será discutida em detalhes adiante; por enquanto este nível de conhecimento nos basta).

Com este tipo de estrutura e 64 linhas (condutores elétricos) no barramento de dados, cada transferência de dados entre MP e UCP pode abranger toda uma “linha” da estrutura da memória (no caso da Figura 2, 64 bits). Portanto, são transferidas diversas posições de memória de cada vez (no exemplo, 64 bits, que correspondem a 8 posições de memória, cada uma correspondendo a uma unidade de endereçamento; veja Figura 2).

Em uma estrutura como esta, as operações de leitura e escrita na memória principal seguem basicamente o mesmo procedimento descrito alguns parágrafos acima. O endereço onde o dado será escrito ou de onde ele será lido é colocado pela UCP no registrador de endereços de memória (REM). No caso da leitura, os dados são transferidos da MP para o RDM. No caso da escrita, eles são transferidos deste registrador para a MP. A diferença é que esta transferência se faz envolvendo toda uma “linha” da memória por operação (no exemplo, 64 bits, que correspondem a oito bytes ou oito posições de memória). E o endereço escrito no REM pela UCP é sempre um múltiplo de 8 (olhe para os endereços das posições de memória escritos à direita da parte superior da Figura 2 e entenderá o porquê desta afirmação).

Se você ainda lembra do conceito de palavra introduzido na coluna “Computadores XVI: Componentes da UCP”, e se a unidade lógica e aritmética da máquina mostrada esquematicamente na Figura 2 aceitar operandos de 64 bits, perceberá que a palavra desta máquina terá 64 bits de largura. Neste caso, a unidade de transferência entre memória principal e a unidade central de processamento é igual à largura da palavra.

Isto ocorre na maioria das vezes. Exceto em casos particulares, a largura do registrador de dados da memória é igual à largura dos registradores internos, que por sua vez é igual à largura da palavra. Neste caso, sendo a unidade de transferência sempre igual à largura do registrador de dados da memória, a norma é que seja igual à largura da palavra.

Mas nem sempre é assim. Ao longo da história do desenvolvimento dos microprocessadores houve algumas exceções. Por exemplo: o próprio processador da Intel 8088 utilizado no primeiro computador pessoal da IBM tinha registradores internos de 16 bits, operandos da unidade lógica e aritmética de 16 bits (portanto uma palavra de 16 bits), porém seu registrador de dados da memória tinha apenas 8 bits de largura, fazendo com que sua unidade de transferência se restringisse a um byte. O mesmo ocorreu com o microprocessador da Intel 80386 SX, que tinha uma palavra de 32 bits, mas um registrador de dados da memória de apenas 16 bits, o que reduzia a sua unidade de transferência para dois bytes. Em casos como este, a Unidade de Transferência corresponderá ao tamanho de uma “linha” de células da estrutura da memória.

Portanto, embora a regra geral indique que a unidade de transferência entre memória principal e a unidade central de processamento é igual à largura da palavra, isto nem sempre acontece. O que se pode afirmar é que em qualquer caso a unidade de transferência entre memória principal e a unidade central de processamento é igual ao número de linhas do barramento de dados, que por sua vez corresponde à largura do registrador de dados da memória e ao tamanho de uma “linha” de células da estrutura da memória.

Então como fazer para ler ou escrever apenas um byte (uma posição de memória ou unidade endereçável) na MP de uma máquina cuja Unidade de Transferência entre MP e UCP seja de 64 bits como a mostrada na Figura 2?

Bem, neste caso usa-se um artifício semelhante àquele usado para a leitura de um único byte da memória secundária: lê-se para o registrador de dados da memória toda uma linha da estrutura da memória, transfere-se este valor para um dos registradores internos (geralmente o acumulador), e se busca o valor do byte desejado conhecida sua posição no registrador para o qual foi transferido.

Vamos a um exemplo prático. Suponhamos que em uma estrutura semelhante àquela mostrada na figura 2 se deseja conhecer o conteúdo da posição de memória de endereço 178.  O primeiro passo é descobrir em que linha da estrutura de memória ela se situa. Neste caso será a linha que inicia com a posição de memória de endereço 176, o múltiplo de 8 imediatamente inferior a 178. Isto feito, solicita-se a leitura desta linha da memória, escrevendo no registrador de endereços da memória seu endereço inicial (176) e ordenando uma operação de leitura. Ao terminar esta operação toda a linha contendo as posições de memória que vão de 176 até 183 (examine a figura 2 para entender porque) foi copiada para o registrador de dados da memória. Para conhecer o conteúdo da posição de memória de endereço 178, basta transferir este valor para o acumulador e nele verificar o conteúdo do terceiro byte a partir da direita. Pode parecer complicado, mais o fato é que raramente se precisa conhecer o conteúdo de uma única posição de memória. Na verdade o que ocorre com maior freqüência é a transferência (leitura ou escrita) de grande número de bytes por operação. O que corresponde à leitura ou escrita seqüencial de diversas linhas da estrutura de memória.

Então, afinal, qual é a unidade de transferência nas operações de leitura ou escrita na memória principal? Como vimos, em geral ela corresponde ao tamanho da palavra, mas isto não é obrigatório. Nos casos em que não corresponde, a unidade de transferência é igual a uma linha da estrutura de memória, cuja largura é a mesma do registrador de dados da memória.

Já nas operações de leitura e escrita da memória secundária a unidade de transferência é o bloco. Que pode ser um setor ou um grupo de setores no caso dos discos magnéticos e óticos, ou um registro no caso das fitas magnéticas.

Teremos então:

Unidade de Transferência:

  • Memória secundária: Bloco;

  • Memória principal: Palavra ou “linha” (da estrutura da memória).

Para finalizar, uma observação importante. Até aqui vimos nos referindo às operações de leitura e escrita na memória como “transferência de dados”. Fizemos isto porque assim se convencionou fazer. Mas basta pensar um pouco para entender que o termo “transferência” é inadequado.

O verbo “transferir” implica movimentação. Uma transferência de dados, portanto, corresponde à movimentação de dados de um ponto para outro. Mais não é isto o que ocorre nem nas operações de escrita nem nas operações de leitura, tanto na memória secundária quanto na memória principal. O que na verdade ocorre é a cópia de dados de um ponto para outro.

Nas operações de leitura da memória principal o conteúdo de uma linha da estrutura da memória é copiado no registrador de dados da memória mas permanece íntegro na linha da MP de onde foi copiado. Nas operações de leitura da memória secundária, o conteúdo do registro, setor, ou grupo de setores da unidade de memória secundária é copiado para a memória principal mas também permanece íntegro no local de onde foi copiado. O mesmo ocorre nas operações de escrita fazendo-se as adaptações necessárias.

Evidentemente isto é apenas um lembrete. Nesta série de colunas vamos continuar chamando de “transferência” às operações de leitura e escrita na memória. Mas, por respeito ao idioma, sempre é bom lembrar que o termo é inadequado.

 

B. Piropo