Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Engenharia/Ciência da Computação
Prof. Joel Guilherme
UNIDADE 2 – ARITMÉTICA
COMPUTACIONAL E SISTEMAS DE
MEMÓRIA
Introdução
Na Unidade 1, você viu os conceitos básicos de um sistema computacional, os principais
elementos que o compõem, e os mecanismos básicos que permitem ao computador computar. Como
computar é fazer cálculos, no sentido lato da palavra, e sendo esta a principal atividade de um
computador, precisamos entender como um computador executa cálculos.
Dois aspectos particularmente diferenciam a forma como um computador faz cálculos daquela
a que nós estamos acostumados. Primeiro, o computador trabalha em binário, conforme vimos, e
nós trabalhamos em decimal. Segundo, é que o computador trabalha com valores de precisão finita,
ou seja, ele não dispõe de quantos bits você queira para fazer os cálculos, estando limitado, em
primeira instância, pelo tamanho de seus registradores, e, em última instância, pela tamanho da
memória. Por isto vamos iniciar esta unidade examinando a aritmética computacional. Vamos ver
como o computador representa valores numéricos em binário, e como são realizadas as operações
aritméticas com esses números.
O restante da unidade será dedicada a nos aprofundarmos na parte mais importante de um
computador, depois do processador: seu sistema de memória, onde dados e instruções ficam
armazenados. Tivemos uma breve visão do que é uma memória na Unidade 1, como um depósito de
“informações”. Veremos aqui que existem diversos tipos de memória, analisaremos suas
características, e justificaremos porque um computador geralmente conta com todos estes tipos de
memória, organizados em uma estrutura hierárquica.
AULA 1 – Aritmética Computacional
1.1. Números de Precisão Finita
Segundo estimativas (http://tinyurl.com/l4rw9wf), o número de átomos no universo é
da ordem de 1080. Tal número, para ser expresso por extenso, requer 81 dígitos
decimais, ou seja, o dígito '1' seguido de 80 '0s'. Isto corresponde ao número N =
100000000000000000000000000000000000000000000000000000000000000000000000
000000000. Para representação em binário, como veremos adiante, necessitaríamos de
266 bits. Este é um número muito grande. No papel, praticamente não temos qualquer
problema para expressarmos um número desta ou qualquer outra grandeza, nem de
realizarmos operações com estes números. Em um computador digital, existem limitações
para a representação numérica, pois a quantidade de bits para isto é limitada, em função
do tamanho da palavra do processador, e mesmo da quantidade de memória existente.
Vejamos quais são as implicações de trabalharmos com números de precisão finita, ou
seja, com um número de dígitos limitado para sua representação.
Vamos considerar que nosso sistema computacional somente possa operar com
números inteiros, decimais, representados por 3 dígitos, na faixa de 000 a 999. Que
limitações isto nos trará?
Claramente podemos identificar que não seremos capazes de representar:
a) números maiores que 999 (por exemplo, '3752');
b) números negativos (como '-2');
c) números fracionários (tal como '1,35');
d) números irracionais (tal como ' √ 2 ' );
e) números complexos. (como '3+2i').
Além disso, sabemos que números inteiros, de uma forma geral, satisfazem à
propriedade de fechamento em relação às operações de soma, subtração e multiplicação.
Isto significa que se A e B são dois inteiros quaisquer, então A+B, A-B e AxB são também
inteiros. No entanto, os inteiros não satisfazem o fechamento sob a operação de divisão –
por exemplo, 62 = 3 é um inteiro, mas 32 = 1,5 não é inteiro.
Com relação aos números de precisão finita, podemos verificar que estes não
satisfazem à propriedade de fechamento para nenhuma das quatro operações
aritméticas, o que nos leva a prever que operações aritméticas realizadas em um
computador digital, que têm por natureza precisão finita, serão distintas das operações
aritméticas usuais a que estamos acostumados.
A principal diferença que vamos encontrar está na possível geração de erros.
Considerando nosso sistema numérico anterior, podemos observar os seguintes
exemplos:
erro por excesso: 600+700 = 1300 (o resultado é muito grande);
erro por falta: 005 – 007 = -2 (o resultado é muito pequeno);
não-membro: 005 002 = 2,5 (o resultado não pertence ao conjunto, embora não
seja nem muito grande nem muito pequeno).
A possibilidade de ocorrência destes tipos de erro levam a que a álgebra de precisão
finita seja diferente da álgebra ordinária. Por exemplo, a álgebra ordinária prevê as
propriedades de associatividade entre a soma e a subtração, tal que podemos escrever
associatividade: a + (b – c) = (a + b) – c
é uma relação sempre verdadeira, para todo 'a', 'b' e 'c'. No entanto esta relação não
prevalece para números de precisão finita, como, por exemplo:
800 + (400 – 300) (800 + 400) – 300,
visto que, na segunda expressão, o termo (800 + 400) irá gerar um erro por excesso!
Também, a álgebra ordinária prevê a propriedade de distributividade do produto
sobre a soma (ou subtração), de modo que a expressão
distributividade: a x (b – c) = (a x b) – (a x c)
é uma relação sempre verdadeira, para todo 'a', 'b' e 'c'. No entanto esta relação não
prevalece para números de precisão finita, como, por exemplo:
050 x (400 – 390) (050 x 400) – (050 x 390),
visto que, na segunda expressão, o termo (050 x 400), assim como (050 x 390), irá gerar
um erro por excesso!
Uma conclusão fundamental que podemos tirar desta análise é que a aritmética
computacional não consegue, em geral, nos fornecer resultados exatos, mas apenas
aproximações para estes, visto ser impossível se representar todos os valores que
encontramos no mundo real. Analisaremos em mais detalhes este problema quando
virmos a aritmética binária e os números de ponto-flutuante, mais adiante.
Para convertermos um número inteiro de uma base qualquer para qualquer outra
base, podemos utilizar um processo de divisões sucessivas. Todas as operações devem
ser efetuadas na base de origem. Este último fato leva a que, para nós, é bem mais
simples converter da base-10 para outra base (as operações serão na base-10) do que
em outro caso, porém o algoritmo é válido para qualquer base.
Suponha que você quer converter o número decimal N 10, para uma outra base B
qualquer. N10, será nosso dividendo inicial, D, e B será nosso divisor. O algoritmo é como
segue:
Algoritmo para Conversão de Inteiros Decimais para a Base B:
1. realize a divisão inteira de D por B, obtendo um quociente Q e um resto R;
2. faça D = Q e anote R;
3. se D > 0, retorne ao passo '1';
4. os restos obtidos são os dígitos na nova base, tomados na ordem inversa, ou
seja, o último resto obtido corresponde ao dígito de maior ordem, e o primeiro
resto obtido corresponde ao dígito de ordem '0'. Observe que os restos obtidos
sempre corresponderão a dígitos válidos na nova base B, uma vez que o
processo de divisão assegura que R < B.
Exemplo: Converter 16310 para a base 2 (binário). Vamos representar as divisões
na forma D = QxB + R, onde D é o dividendo, B é o divisor, Q o quociente e R o
resto.
163 = 2x81 + 1 → d0 = 1;
81 = 2x40 + 1 → d1 = 1;
40 = 2x20 + 0 → d2 = 0;
20 = 2x10 + 0 → d3 = 0;
10 = 2x5 + 0 → d4 = 0;
5 = 2x2 + 1 → d5 = 1;
2 = 2x1 + 0 → d6 = 0;
1 = 2x0 + 1 → d7 = 1.
Então, N10 = 16310 = N2 = 101000112.
Para conferir, fazemos a conversão inversa: 101000112 = 27+25+21+20 =
128+32+2+1 = 16310.
Para a conversão de números fracionários, o processo é semelhante ao utilizado
para inteiros, só que usando a multiplicação. Tomando-se apenas a parte fracionária,
multiplica-se sucessivamente seu valor pela nova base, extraindo-se a parte inteira a cada
passo, que representará cada dígito da parte fracionária na nova base. Um exemplo para
a conversão de um número decimal fracionário ilustrará o processo.
Exemplo: converter 0,687510 para binário …
0,6875 x2 = 1,375 d-1 = 1;
0,375 x2 = 0,75 d-2 = 0;
0,75 x2 = 1,5 d-3 = 1;
0,5 x2 = 1,0 d-4 = 1;
0,0
Então, N10 = 0,687510 = N2 = 0,10112 = 1x2-1+0x2-2+1x2-3+1x2-4 = 0,5 + 0,125 +
0,0625 = 0,687510, conferindo o resultado.
Quando o resultado de uma das multiplicações parciais der zero, podemos encerrar
o processo pois, daí em diante, obteremos apenas dígitos zero, não significativos. Nem
sempre isto ocorre e poderá ser preciso se interromper o processo em algum ponto,
dependendo da precisão desejada. Experimente converter 0,3 10 para binário. Pare a
conversão após obter 10 dígitos fracionários em binário. Você deve obter N 2 =
0,01001100112. = 0,299804687 (o valor da conversão de volta não é o original porque
obtivemos apenas uma aproximação do valor decimal em binário).
1.3. Números Negativos e Aritmética Binária
Para se aprofundar um pouco mais e obter mais exemplos sobre este tópico, você
pode recorrer à seção “Tipo Numérico”, em (Monteiro, 2007, Cap. 7, pp 219-266).
Até o momento não consideramos o problema de sinal, ou seja, a possibilidade de
representarmos números negativos. O problema da representação de sinal na aritmética
computacional é que o computador tem apenas dois símbolos para utilizar, e assim não é
possível simplesmente acrescentarmos um “sinal gráfico” como o '+' e o '-' para indicar se
um número é negativo ou não. Podemos conceber diversos sistemas para fazer a
representação de sinal na aritmética computacional, sendo os mais utilizados os
seguintes:
Sinal e Magnitude – o bit mais à esquerda do número representa o sinal (0 é ‘+’ e
1 é ‘-’), os bits restantes representam a magnitude em valor absoluto;
Complemento de 1 – também o bit mais à esquerda representa o sinal (0 é ‘+’ e 1
é ‘-’), os bits restantes representam a magnitude. Para achar o negativo de um
número, substitua todos os bits, inclusive o de sinal, pelo seu complemento lógico (0
→ 1, 1 → 0);
Complemento de 2 - também tem o bit de sinal (0 é ‘+’ e 1 é ‘-’). Para achar o
negativo de um número, substitua todos os bits, inclusive o de sinal, pelo seu
complemento lógico (0 → 1, 1 → 0) e em seguida adicione 1 ao resultado. Se ocorrer
“vai um” do bit da extrema esquerda ele é descartado;
Excesso de q – simplesmente adiciona-se (excesso de) q ao valor do número.
Usualmente, para representação de inteiros com m bits, tomamos q = 2m-1.
Toda representação numérica com sinal requer que o número de bits da
representação seja fixado, para se poder determinar qual bit representa o sinal (ou o
excesso, no caso desta representação em particular).
Exemplo: representar em binário com 8 bits os números 8410 e -8410 nos formatos binário puro (sem
sinal), sinal/magnitude, complemento de 1, complemento de 2, e excesso de 128 (28-1 = 27 = 128):
8410 -8410
binário (sem sinal) 01010100 (não existe)
sinal/magnitude 01010100 11010100
complemento de 1 01010100 10101011
complemento de 2 01010100 10101100
excesso de 128 11010100 00101100
Um mal-entendido comum nesta área de representação de números negativos é
achar que complemento diga respeito apenas a números negativos. Complemento, no
entanto, diz respeito a uma forma de representação numérica onde o sinal do número é
levado em consideração, seja ele positivo ou negativo. Podemos achar o complemento de
um número positivo ou negativo. O complemento de um número positivo resultará em um
número negativo e vice-versa, e, para tal, ambos precisam estar representados na forma
de complemento considerada.
Um fato interessante que você pode observar é que podemos determinar o
complemento de um número em excesso de 2 m-1 simplesmente computando-se o
complemento de 2 do mesmo e adicionando-se o excesso (2 m-1), seja ele positivo ou
negativo, descartando eventual “vai 1” do bit mais à esquerda, se houver. Teste este fato
para o exemplo dado acima e para outros valores.
A tabela 2.3 resume a representação de números de 4 bits com sinal. Observe na
tabela que as representações em sinal/magnitude e complemento de 1 utilizam
representações distintas para um mesmo valor, '0' e '-0', desperdiçando, portanto, uma
das codificação dos 16 códigos possíveis com 4 bits. As casas em vermelho indicam
codificações inexistentes, em amarelo, a dupla codificação para um mesmo valor (zero) ,
em em azul, realçado o uso da mesma codificação para o zero, positivo ou negativo.
Subtração:
0–0=0
0–1=1 e “pede 1 emprestado” (em inglês, “borrow”)
1–0=1
1–1=0
Exemplo:
binário decimal
1111 1 ← “1 emprestado”
101101001 361
- 1011011 91
100001110 270
Compare a tabela da soma com a tabela da subtração. Observe que são idênticas, a
menos das condições de carry/borrow!
Em qualquer aritmética que utilize complemento (representação de números
negativos) sempre podemos escrever que A – B = A + (–B), ou seja, para fazer uma
subtração, podemos simplesmente somar o complemento do subtraendo. Em binário não
é diferente, e, assim podemos realizar a subtração fazendo uma operação de soma.
Embora seja possível utilizar qualquer formato de complemento, o complemento de 2,
aqui, é vantajoso, porque resulta efetivamente em simplesmente realizar a soma do
complemento, sem qualquer necessidade de ajustes na representação, e teremos um
resultado correto, também expresso em complemento de 2.
Exemplo:
Repetindo o exemplo anterior, em binário, precisamos acrescentar um zero à
esquerda do minuendo, para representar o bit de sinal, e da mesma forma, ajustar o
subtraendo para conter o mesmo número de bits:
minuendo: 0101101001
subtraendo: 0001011011
e, computando o complemento de 2 do subtraendo
-subtraendo: 1110100101
e nossa operação fica então como
binário decimal
11111 1 11 ← “vai 1”
0101101001 0361
+ 1110100101 9909
10100001110 10270
Observe que utilizamos a mesma técnica para fazer a subtração em decimal,
utilizando a soma do “complemento de 10” do subtraendo. O complemento de 10,como
em qualquer outra base, é semelhante ao complemento de 2, em binário: ache o
complemento de 9 (ou seja, subtraia de 9) de cada dígito, e some 1 ao valor final
encontrado.
Verifique que os resultados de soma e subtração são sempre corretos, quando
utilizamos representação em complemento de dois, quaisquer que sejam os sinais dos
operandos.
Multiplicação:
0x0=0
0x1=0
1x0=0
1x1=1
Multiplicação em binário, em nível de bit, não poderia ser mais fácil. O resultado é
sempre zero, exceto quando os dois operandos são um, quando o resultado também é
um. O método básico para efetuar a multiplicação é tal qual na aritmética decimal:
Divisão:
Para a divisão, é difícil criarmos uma “tabuada de um bit” que seja útil, pois a divisão
por zero, como em qualquer sistema de numeração, não é permitida. O melhor é
simplesmente seguir as mesmas regras básicas para a divisão decimal, separando tantas
casas no dividendo quanto necessário para obtermos um dividendo parcial maior ou igual
ao divisor. Faça a divisão, obtendo um dígito do quociente. Multiplicamos este pelo divisor
e calculamos a diferença para o dividendo parcial, obtendo um resto parcial. Repetimos o
processo até que o divisor restante seja menor que o divisor, obtendo um quociente e
resto final.
Tal qual para a multiplicação, este algoritmo de divisão não se aplica a números em
complemento de 2, mas podemos também efetuar a divisão, neste caso, tomando o valor
absoluto dos operandos e ajustando o resultado conforme os sinais dos mesmos.
Também em (Stallings, 2010, Cap. 9) pode ser encontrado um algoritmo que implementa
diretamente a divisão em complemento de 2.
Por estarmos trabalhando com números de precisão finita, um problema que temos
são as situações de erro. Em operações aritméticas com inteiros, a principal ocorrência é
a de uma condição de overflow (transbordo). Uma condição de overflow ocorre quando
não é possível representar o resultado da operação com o número de bits disponível –
normalmente o tamanho da palavra do processador. A detecção de uma condição de
overflow depende da operação que está sendo efetuada e da forma de representação dos
operandos:
Operação de Soma/Subtração
Sem sinal ou sinal/magnitude: uma condição de overflow é indicada pela
ocorrência de um carry (ou borrow) do bit mais significativo (mais à esquerda).
exemplos:
111 1 11 ← vai 1/1 emprestado
1011 0110
+ 0110 - 1011
10001 11011
(11+6 = 17 > 24-1 = 15) (6-11 = -5 < 0)
Em complemento: somente é possível ocorrer uma condição de overflow se os
números forem de mesmo sinal, situação esta que será indicada por termos o
resultado com o sinal trocado.
exemplos:
1 1 1 ← vai 1
0101 5 1011 -5
+ 0110 + 6 + 1010 -6
1011 11 > 7 10101 -11 < -8
= -5 = +5
Operação de Multiplicação
Multiplicação sofre do mesmo problema da soma de números de mesmo sinal.
Multiplicar equivale a somar o valor absoluto do multiplicando o número de vezes
indicado pelo valor absoluto do multiplicador e ajustar o sinal do resultado!
Operação de Divisão
Não tem problema de overflow, pois o resultado será, em valor absoluto, sempre
menor ou igual ao dividendo, exceção feita para o caso singular do divisor ser zero,
quando deve ser sinalizada esta situação particular de erro.
1.4. Números de Ponto-Flutuante
Considere as seguintes situações numéricas do mundo real:
a) a massa do nosso sol é estimada em 2x1033g;
b) a massa do elétron é estimada em 9x10-28g.
Para acomodar a representação de ambos estes números, um muito grande e outro
muito pequeno, utilizando notação decimal de ponto-fixo, onde a vírgula (ou ponto
decimal) separa, de forma fixa, uma parte inteira de outra fracionária, precisaríamos de 62
dígitos decimais (em binário isto corresponderia a cerca de 206 bits):
Sol
2000000000000000000000000000000000,0000000000000000000000000000g
Elétron
0000000000000000000000000000000000,0000000000000000000000000009g
Deve-se observar que a maioria dos dígitos em ambos os números são zero, e,
dificilmente se precisa realizar cálculos com esta precisão. Em nosso mundo cotidiano a
solução é a utilização da notação científica onde separamos o número em duas partes:
uma responsável por estabelecer a faixa de valores que iremos cobrir, e outra
responsável pela precisão com que iremos cobrir esta faixa. Representamos então um
número real, decimal, como
n = f x 10e
Observe na figura que, efetivamente, temos apenas dois estados estáveis, quando
as duas entradas são mantidas em '0'. Uma com a saída Q = '0' (denominado estado
zero) e outro com a saída Q = '1' (denominado estado um). O bit armazenado no FF
corresponde ao estado de sua saída Q. Confira que quando levamos a entrada S para o
estado lógico '1' forçamos a que o novo estado do FF (Q t+1) passe para '1',
independentemente de seu estado anterior. Assim como quando levamos a entrada R
para o estado lógico '1' forçamos a que o novo estado do FF (Q t+1) passe para '0'. Assim,
o valor colocado em suas entradas é armazenado, permanecendo neste estado até que
outra entrada seja comandada. A única restrição para este modelo de FF é que não
podemos comandar simultaneamente as entradas para levá-lo ao estado '1' e '0', ou seja
fazer S = R = '1', o que causará uma indeterminação lógica do estado seguinte do FF.
Outros modelos de FF podem eliminar esta indeterminação, como, por exemplo, forçando
o FF a “mudar de estado”.
Este é um exemplo de uma memória de 1 bit, a partir do qual podemos construir
memórias maiores, conforme a necessidade de armazenamento. Analisaremos estas
possibilidades em nossa tópico 4, quando veremos a estrutura do sistema de memória.
Representação de Textos
Você já viu que em nosso dia a dia utilizamos, para escrita, centenas de símbolos,
porém o computador só é capaz de manipular informação na forma binária.
Com o surgimento da computação e a comunicação digital surgiram diversos
códigos para representação binária de textos, já discutidos em nossa Unidade 1. O código
ASCII, apesar de ter sido um dos primeiros códigos binários criados para representação
de texto ainda é um código universalmente utilizado e tomaremos um exemplo deste
código para representação de um texto simples, conforme ilustrado na figura 2.06.
Representação de Imagens:
Uma forma muito utilizada para representação de imagens é através uma coleção de
pixels (do inglês, picture element). Um pixel é um elemento da imagem, um “ponto”. Cada
pixel é codificado individualmente na forma de um código binário que representa a sua
cor, em uma coleção denominada bitmap (mapa de bits). Um bitmap é nada mais que um
arranjo retangular, uma matriz, correspondendo às linhas e colunas dos pixels da imagem.
A quantidade de bits utilizada para representar cada pixel é denominada a profundidade
de cor da imagem, indicando quantas cores distintas podem ser expressas por um pixel.
Portanto, uma imagem em que cada pixel é representado por um byte em memória tem
uma profundidade de cor de 8 bits, cada pixel podendo assumir uma entre 256 cores
possíveis. O padrão mais utilizado hoje em dia é o denominado true color, onde um pixel
é definido pela combinação das três cores primárias (vermelho, verde e azul), cada cor
primária sendo codificado em um byte, totalizando uma profundidade de cor de 3x8 = 24
bits.
Este método é popular porque a maioria dos dispositivos de apresentação, tais como
impressoras e telas, operam sob o conceito de pixels. Uma desvantagem das imagens em
bitmap é que elas não podem ser ampliadas arbitrariamente sem comprometer a
qualidade da imagem, como ilustrado na figura 2.7 abaixo, onde cada “quadradinho” da
imagem ampliada corresponde a exatamente um pixel da imagem original.
Representação de Sons:
A forma mais genérica de codificar áudio é se amostrar a amplitude da forma de
onda do som a intervalos regulares e se armazenar a sequência de valores assim obtido,
digitalizados em binário. Esta é uma técnica chamada PCM (Pulse Code Modulation) em
que o áudio analógico é armazenado como uma sequência de códigos, cada código
correspondendo a um pulso com a mesma amplitude (aproximadamente) da onda no
momento da amostragem. Dadas certas condições de contorno (a frequência máxima do
sinal analógico e a taxa de amostragem) é possível se recuperar totalmente o sinal
original a partir das amostras digitais, a menos de erros de amostragem/digitalização, que
podem ser feitos tão pequenos quanto se queira.
A figura 2.8 ilustra este processo de amostragem de um sinal analógico, para
digitalização.
Os arquivos no padrão WAV (de WAVeform Audio Format), fora um cabeçalho, nada
mais são que uma sequência de tais amostras digitalizadas. Este é o formato que permite
a melhor qualidade de reprodução, e é utilizado para a gravação de música em CDs. A
gravação de música com a qualidade de um CD padrão requer 44.100 amostras/s, com
16 bits por amostra, por canal. Portanto, uma gravação estéreo de 1 segundo irá consumir
176.400 bytes, ou 1.411.200 bits.
O padrão WAV é um padrão de armazenamento desenvolvido pela Microsoft e é utilizado
principalmente para armazenamento das amostras PCM de um sinal de áudio, sem
compressão, com qualidade de CD. Corresponde a um volume de dados de
aproximadamente 10 MiB/minuto.
O fato de o padrão PCM puro consumir muita memória para armazenamento de áudio levou à
criação de diversos métodos de compressão específicos para áudio. Entre estes destacamos:
MP3 (MPEG Layer 3 Audio) - É o formato mais popular hoje em dia, embora seja
proprietário. Utiliza um esquema de compressão baseado no fato de que certas partes
de um som geralmente estão além do limite de percepção da maioria das pessoas,
reduzindo drasticamente o tamanho do arquivo, comparado com PCM puro.
OGG - É um contêiner para diversos tipos de mídia, incluindo vídeo, áudio, legendas e
metadados. Na parte de áudio, o padrão é o Vorbis (outros modelos de codificação
podem ser utilizados), um padrão aberto, que adota um esquema de compressão com
perdas com desempenho similar ao MP3, em relação à compactação, porém de
qualidade superior.
WMA (Windows Media Audio) - É um padrão proprietário da Microsoft que oferece,
como base, uma compressão com perdas, similar ao MP3.
MIDI (Musical Instrument Digital Interface) é uma outra técnica, especial para música
instrumental, onde o que é codificado é o instrumento, a nota musical, a duração da
nota, e outros parâmetros, para ser tocado por um sintetizador musical, e não o áudio
propriamente dito. Um arquivo MIDI é um arquivo texto contendo todas estas
informações. Para gravar e reproduzir música em MIDI, contudo, você precisa de
software e hardware especial.
AULA 3 – Hierarquia da Memória
3.1. Memória interna, externa e off-line
Você já viu que a menor unidade processada em um sistema de computação é o bit.
Foi visto também que o bit sozinho tem pouco poder de representação. Quando estamos
tratando da memória de um computador, o usual é não armazenar os bits individualmente,
cada um ocupando um endereço específico. Uma memória é então normalmente dividida
no que se denomina de células, onde cada célula corresponde a um único endereço da
memória, e é a unidade de armazenamento da memória, ou seja, quando lemos ou
escrevemos na memória, vamos ler ou escrever em uma determinada célula, conforme o
endereço especificado.
Uma célula contém um determinado número de bits, definido no projeto da memória,
sendo usual se utilizar 8 bits por célula, de modo que uma célula geralmente armazena
um Byte de informação.
O termo célula, contudo, costuma ser utilizado apenas para denotar a unidade de
armazenamento da memória principal pois, dependendo do tipo de dispositivo de
armazenamento, a “célula” pode possuir outras denominações, tais como bloco, setor,
cluster e etc., e ter tamanhos distintos, como veremos adiante quando analisarmos os
discos e outros dispositivos de armazenamento.
Os endereços da memória são numerados consecutivamente, de zero até N-1, onde
N é a quantidade de células (endereços) disponível. Um endereço é apenas uma entidade
lógica, um código, que permite ao sistema de memória identificar a célula associada
àquele endereço.
Você já viu que temos duas operações básicas associadas a um sistema de
memória:
Escrita - O ato de guardar ou armazenar um dado é realizado através da operação de
escrita ou armazenamento (write). A operação de escrita é destrutiva, pois ao se
armazenar um dado o conteúdo anterior, contido naquele endereço, é perdido.
Leitura - O ato de retirar ou recuperar um dado armazenado é realizado através da
operação de leitura (read). A operação de leitura não é destrutiva, pois o valor lido é
apenas copiado para outro local, preservando o valor original armazenado naquele
endereço.
Figura 2.10:
Organização básica de um sistema de Memória.
Um programa, para ser executado, tem que ter suas instruções armazenadas
na memória principal, que é a única que o processador entende como sendo a
memória acessível como tal. Quando a capacidade da MP não comporta o
programa a ser executado (ou o conjunto de programas a serem executados), pode
ser utilizado um esquema denominado de “memória virtual” onde uma parte
reservada da memória secundária (HD) trabalha como uma extensão da MP, a
memória física. Então, necessariamente o programa precisa estar totalmente
contido na MP, estando contido na memória virtual (HD), dividido em “páginas”, que
são blocos de memória contígua atribuídos normalmente pelo sistema operacional
(SO) do computador, e o SO transfere um determinado número destas páginas
para a MP sempre que necessário, removendo outras páginas da MP, que não se
façam necessárias naquele momento, e armazenando-as de volta na memória
virtual (HD).
Sempre que o processador necessitar de uma instrução (ou um dado), ele irá
realizar uma operação de leitura encaminhada a um endereço específico da MP. Pode
então entrar em ação um complexo controle do sistema de memória que, em linhas
gerais, tomará as seguintes ações:
Verificará se o conteúdo da MP no endereço especificado já está armazenado ou não
no cache (MC). Se sim, a leitura será feita diretamente do cache, que é uma operação
muito mais rápida que ler da MP. Se não, um bloco de dados da MP englobando o
conteúdo solicitado será transferido para a MC, na expectativa que as próximas
solicitações da UCP já estarão na MC, acelerando o processo de acesso à memória.
Caso o conteúdo solicitado não esteja, em primeira instância, na memória física, a
página da memória virtual que contenha estes dados será transferida para a MP, e o
processo anterior é então realizado.
Note-se que o processo de verificação do cache tem que ser muito rápido, para ser
eficiente. Este controle é realizado então por hardware. Já o controle da memória virtual,
por lidar com dispositivos relativamente lentos, é normalmente realizado por software, na
realidade, pelo SO da máquina, se existir.
tivesse o tamanho da palavra do processador porém o usual é que uma célula seja
constituída por 1 byte, ou seja, m = 8 bits, como mencionado anteriormente. Mesmo
assim, a unidade de transferência de dados em uma operação de leitura/escrita pode
ser maior que a célula, sendo geralmente um múltiplo desta e, preferivelmente, igual ao
tamanho da palavra do processador. Assim, um processador de 32 bits com a MP
organizada em células de 8 bits, como usual, é capaz de acessar 4 células contíguas em
uma única operação de leitura/escrita, especificando apenas o endereço da primeira
célula do grupo. Ainda assim, sempre que necessário, será possível se acessar qualquer
célula, individualmente.
Na figura 2.12 a seguir ilustramos o processo de leitura/escrita na MP pelo
processador.
A MP é constituída por um tipo de memória popularmente chamada de RAM. As
memórias RAM (Random Access Memory, ou, em português, Memória de Acesso
Aleatório) têm o seu nome devido ao fato de que o tempo de acesso a qualquer célula é
independente de seu endereço, ou seja, podemos acessar aleatoriamente qualquer
endereço gastando sempre o mesmo tempo. Elas evoluíram com o tempo, resultando em
diversos tipos de memória, que podemos classificar, de uma forma ampla, em dois tipos:
Figura 2.12: Processo de leitura/escrita na MP pelo processador.
Temos então que o endereço da célula procurada é 112 = 3H, a qual poderá estar em
alguma das 4 linhas do conjunto cujo endereço é 1100100101102 = C96H, devendo ter um
rótulo igual a 00111010012 = 0E9H. Agora, basta procurar nos rótulos das 4 linhas do
conjunto C96H pelo rótulo 0E9H. Se for encontrado, leia a célula de endereço 3 no bloco e
repasse o valor para a UCP. Se o rótulo não for encontrado em nenhum dos blocos do
conjunto, leia o bloco da MP e armazene em qualquer uma das linhas do conjunto na MC
(de acordo com um algoritmo de substituição a ser especificado), e repasse a célula
solicitada para a UCP.
Mapeamento Direto
O mapeamento direto é o modo mais simples de se mapear os blocos da MP na MC.
Ele se resume a estabelecer que os conjuntos de linhas na MC serão formados por
apenas uma única linha. Em outras palavras, teremos tantos conjuntos quanto linhas no
cache, de modo que temos J = 1 linha por conjunto, e portanto l = 0 bits, v = r bits, e
temos B = L = 2r Linhas (Conjuntos), como mostrado na figura 2.17.
Mapeamento Associativo
O mapeamento associativo representa o outro extremo da organização da MC, onde
adotamos um único conjunto, contendo todas as linhas do cache.
O esquema geral para o mapeamento associativo pode então ser visto como na
figura 2.19. Observem que, tirando-se os bits para indicação da palavra dentro de um
bloco, todos os demais bits do endereço global serão utilizados como rótulo.
Discos Magnéticos
Um disco magnético é comumente feito a partir de um disco de metal ou plástico,
cuja superfície é recoberto por um material magnético (óxido de ferro). Os discos
magnéticos foram ou são fabricados em diversos estilos, sendo de nota os seguintes:
Disco Flexível, ou Floppy Disc;
Disco Rígido (HD);
Disco Rígido Removível.
Todo tipo de disco magnético tem a mesma
organização básica, conforme a figura 2.21. Os
discos são divididos em anéis concêntricos,
denominados trilhas, havendo um espaço separador
(gap) entre as trilhas. Cada trilha é dividida, por sua
vez, em setores, também separados por gaps entre
eles. Um setor é a menor unidade de armazena-
Figura 2.21: Trilhas e Setores de um disco
mento no disco, e usualmente tem uma capacidade magnético. (imagem original)
de 512 Bytes. A menor unidade de transferência é
denominada de um Bloco (ou Cluster), que pode ser constituído de um ou mais setores,
conforme o tamanho (capacidade) do disco e a capacidade do SO do computador de
“endereçar” objetos no disco.
Embora as trilhas e setores tenham tamanhos físicos distintos, proporcionais à
distância do centro em que se encontram, como a velocidade de rotação é constante,
todos comportam a mesma quantidade de informação e têm uma taxa de leitura/escrita
fixa. As trilhas internas, portanto, terão uma densidade de gravação maior que as
externas.
Algumas das principais características que encontramos nos discos magnéticos são:
Cabeças de leitura/escrita: podem ser
Fixas, o que requer uma cabeça por trilha (não muito usado atualmente);
Móveis, tendo-se uma cabeça por face que pode se mover para ser posicionada
sobre qualquer trilha.
Posicionamento do Cabeçote de leitura/escrita: pode ser
Por contato, em que a cabeça de leitura/escrita fica em contato com a superfície
do disco, levando à necessidade de uma velocidade de rotação mais lenta
(usada nos discos flexíveis);
Espaço fixo, em que as cabeças estão a uma pequena distância da superfície
do disco, mecanicamente fixada, mas sem tocá-la (discos rígidos em geral);
Flutuantes, onde a cabeça “flutua” em um colchão de ar, formado pela alta
velocidade de rotação do disco, que está em uma unidade selada (caso dos
discos Winchester, atualmente conhecidos simplesmente por HD, por ser a
tecnologia dominante).
Transportabilidade:
Removível, permite a retirado do disco para substituição por outro, gerando
uma capacidade virtual de armazenamento ilimitada;
Fixo, com o disco permanentemente montado no drive.
Faces (ou Lados):
Simples, onde apenas uma das faces do disco é utilizada para armazenamento;
Dupla, onde as duas faces são utilizadas.
Pratos (ou Discos):
Prato único, onde o drive contém somente um único disco físico;
Pratos Múltiplos, quando o drive contém vários discos acoplados ao mesmo
eixo de rotação.
feita “derretendo-se” esta camada a 400 oC, passando-a do estado cristalino para um
estado amorfo, e alterando assim sua refletividade. Para apagar, esquenta-se esta
camada a temperaturas mais baixas, e ela retorna ao estado cristalino.
DVD
O DVD, ou Digital Vídeo Disc ou ainda Digital Versatile Disc, é semelhante a um CD,
porém utiliza um laser de menor comprimento de onda (650nm, o CD usa 780nm), e uma
taxa de transferência maior (10,55Mbps). Um DVD pode ser single-side (face simples) ou
dual-side (face dupla) e single-layer (uma camada) ou dual-layer (dupla camada), em
qualquer combinação. Cada layer oferece uma capacidade de 4,7GiBytes. Uma segunda
camada é obtida na forma de uma camada semi-transparente, de ouro, que permite
acesso à camada por trás variando o comprimento de onda do laser. A finalidade do DVD
é o armazenamento de vídeo digital, mas, como o CD, pode também ser utilizado para
dados. Também como o CD, pode ser encontrado em versões ROM, R e RW.
Blu-Ray Disc
Um disco tipo Blu-Ray é semelhante ao DVD, utilizando um laser de comprimento de
onda (450nm), ainda menor que o utilizado no DVD. Pode ser single-layer ou dual-layer, e
cada layer oferece uma capacidade de 25 GiBytes. É voltado para o armazenamento de
vídeo de alta definição (HD- High Definition), mas, como o CD/DVD, pode também ser
utilizado para dados.
Fita Magnética:
A tecnologia do uso de fitas magnéticas como sistema de armazenamento de massa
em computação é uma das mais antigas nessa área, existindo há mais de 50 anos. Utiliza
o princípio básico de uma fita de áudio, porém grava, normalmente, várias trilhas em
paralelo (8 ou 9), normalmente utilizando o mesmo número de cabeças fixas de
leitura/escrita. Os métodos de gravação comuns são lineares (gravação no sentido
longitudinal da fita) ou helicoidal (diagonalmente, como nas antigas fitas de vídeo – Vídeo
K7).
Oferece grandes capacidades de armazenamento, hoje em formato de cassetes, de
até 800GiBytes. A grande desvantagem das fitas magnéticas é o acesso totalmente
sequencial, o que o torna uma operação bem mais lenta que nos discos magnéticos, que
têm acesso semi-sequencial.
Apesar de estarem caindo em desuso, ainda encontram aplicação como meio de
backup, particularmente para servidores.
Pen Drive:
Um Pen Drive é um dispositivo de armazenamento de dados que utiliza a tecnologia
de memórias flash. Usualmente utiliza uma interface USB (através um controlador interno)
para comunicação com um computador, onde o sistema operacional visualiza o
dispositivo como se fosse um drive de disco.
Além da função genérica de um drive de estado sólido, este dispositivo também é a base
para players de áudio digital, armazenamento de imagens/vídeo em câmeras digitais e em
telefones celulares.
Hoje são comumente disponíveis dispositivos com capacidade desde 64 MiB até 250 GiB.
REFERÊNCIAS
Monteiro, Mário A. Introdução à Organização de Computadores. 5.ed. Rio de Janeiro:
LTC, 2007.
Número irracional
Um número irracional é um número real que não pode ser obtido pela divisão de dois
inteiros.
Número complexo
Um número complexo é um número que pode ser escrito como z = a + bi, onde a é dita
Metadados
Dados sobre outros dados – são informações, geralmente adicionadas a um arquivo de
dados, fornecendo informações sobre estes dados. Por exemplo, um arquivo de música
pode conter o “nome do artista”, “nome da música”, “nome do álbum”, e assim por diante.
Estes são metadados associados aos “dados” constituídos pela música em si.
Backup
Uma operação de backup, em computação, é a realização de uma cópia de segurança de
dados que ficará guardada, fora do sistema computacional, para uma possível
restauração destes na ocorrência de alguma falha e/ou corrupção dos dados presentes no
sistema.
Drive
Drive ou acionador geralmente se referencia a um dispositivo eletromecânico que permite
a leitura/gravação de informações em um ou vários discos magnéticos ou ópticos.
Minuendo e Subtraendo
Em uma operação de subtração, toma-se um valor, o minuendo, e dele se retira, se
subtrai, outro valor. O resultado é o resto, ou diferença.
Digitalizar
Digitalizar é a operação de converter um sinal analógico, como um sinal de áudio, em
valores digitais, normalmente binários.
Sintetizador Musical
Um sintetizador digital é um equipamento capaz de gerar sons a partir de códigos digitais.
Por exemplo, um sintetizador pode gerar uma determinada nota musical a partir de um
código que a identifique.
Contêiner
Palavra derivada do inglês, container, que em seu significado original diz respeito um tipo
de caixa para o transporte de cargas. Por extensão, em computação e comunicação de
dados se denomina também de contêiner qualquer tipo de disposição especial para
armazenar ou transportar dados de natureza distinta contidos em um único objeto, o
contêiner.
Dipolo Magnético
Materiais magnéticos, como um ímã, têm elementos da sua estrutura com dois polos, um
denominado Norte, e o outro denominado Sul. Estes elementos são denominados “dipolos
magnéticos”, e têm a propriedade de que o polo sul de um dipolo atrai o polo norte de
outro, enquanto polos iguais se repelem.
Sistema operacional
Um sistema operacional é uma coleção de programas que gerenciam o hardware e o
próprio software de um computador e oferecem uma série de funções básicas, como
escrever na impressora ou ler o teclado, que podem ser utilizadas por um programa do
usuário.
Compressão de dados
Compressão de dados diz respeito a técnicas especiais de codificação da informação de
forma a reduzir a quantidade de bits necessária para representá-la. È particularmente útil
para armazenamento de arquivos, assim como em comunicação, para reduzir o tempo de
transmissão.