ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Aula 4 MEMÓRIA PRINCIPAL 1. INTRODUÇÃO O papel do processador é pegar os dados, processá-los conforme uma pré-programação e devolvê-los, não importando de onde vêm ou para vão. Por não existir uma área interna de armazenamento muito grande, o processador busca programas de uma área, genericamente chamada memória. 2. MEMÓRIA PRINCIPAL A memória é a parte do computador onde os programas e os dados são armazenados. Sem uma memória na qual os processadores possam ler ou escrever informações, o conceito de computador digital com programa armazenado não pode ser implementado. É um tipo de memória razoavelmente barata. Seu tempo de acesso está na ordem dos nanosegundos, porém mais lenta que os registradores. Possui uma freqüência muito alta, é volátil e qualquer posição pode ser acessada com o mesmo tempo de acesso. 2.1. Bits A unidade básica de memória é o digito binário, conhecido como bit, que pode ter o valor 1 ou 0. Para que seja possível implementar um sistema de memória é necessário um mínimo de dois valores, para que se possam armazenar informações diferentes. Os computadores usam a aritmética binária por causa de sua eficiência; isso significa que um sistema de armazenamento de informação digital é baseado na distinção entre valores diferentes de alguma grandeza física, como corrente ou tensão. O método de codificação em binário é o mais confiável, pois há necessidade de identificar somente dois números. Porém, nem todos os computadores utilizam o sistema de codificação binário; alguns computadores, como os mainframes da IBM utilizam a aritmética decimal. Na verdade, as operações decimais são possíveis porque nessas máquinas os dígitos decimais são armazenados segundo um código de quatro bits chamado código BCD (Binary Coded Decimal1) 1 Decimal Codificado em Binário 2 Palavras ou Words: Podem ser consideradas seqüências de células. Os registradores são do tamanho das 1 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br 2.2. Endereços de Memória A memória é formada por um conjunto de células (ou posições), cada uma das quais podendo guardar uma informação. Cada célula tem um número associado a ela, número esse conhecido como endereço da célula. É por meio desse número que os programas podem referenciar a célula. Todas as células de uma memória dispõem do mesmo número de bits. A célula é a menor unidade endereçável em um computador. Atualmente, a maioria dos fabricantes de computadores padronizou o tamanho da célula em 8 bits, chamando essa célula de Byte. Os bytes são palavras2 e a maioria das instruções de uma máquina opera sobre palavras. Um computador com uma palavra de 32 bits tem 4 bytes/palavra e com palavra de 64 bits tem 8 bytes/palavra. Uma instrução de soma muito provavelmente vai somar dois valores de 32 bits. Portanto, uma máquina de 32 bits deverá ter registradores e instruções para tratar palavras de 32 bits. O mesmo ocorrerá caso a máquina seja de 64 bits. Figura 1 -‐ Memória Ø Elemento a ser manipulado: bit (armazena a informação na forma de bits) Ø Unidade de informação a ser armazenada, recuperada ou transferida (célula) - Grupo de n bits (n = 8) ⇒ 1 Byte Ø ENDEREÇO: código de identificação da localização das células (informações). 2 Palavras ou Words: Podem ser consideradas seqüências de células. Os registradores são do tamanho das palavras. 2 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br 2.3. Ordenação dos Bytes Na criação dos computadores surgiram duas arquiteturas diferentes para tratamento de armazenamento de memória baseados na ordenação dos bytes. Os bytes de uma palavra podem ser numerados da esquerda para a direita ou da direita para a esquerda. Quando a numeração dos bytes começa da esquerda para a direita da palavra, a ordenação dos bytes é dita Big Endian. Quando a numeração dos bytes começa da direita para a esquerda da palavra, a ordenação dos bytes é dita Little Endian. O Windows NT, por exemplo, foi criado em torno de arquitetura little endian e não foi projetado para ser compatível com big endian , pois a maioria dos programas são escritos com alguma dependência em little endian. Os termos Big Endian (maior valor primeiro) e Little Endian (menor valor primeiro) foram inseridos no jargão da computação por um artigo publicado em 1981, citando o problema e relacionando-o a um episódio mencionado no livro As Viagens de Gulliver – povo que foi à guerra para decidir qual a melhor maneira de quebrar ovos, se pelo maior (big) lado ou se pelo menor (little) lado. Na ordenação Big Endian os bytes são numerados da esquerda para a direita (0, 1, 2,..., n-1) e é usado por sistemas Unix (arquiteturas SPARC, IBM Mainframe). Exemplo numérico com 2 bytes: 0305H = 00000011 00000101 Na ordenação Little Endian os bytes são numerados da direita para esquerda (n-1, ..., 2, 1, 0) e é usado por IBM PCs (arquiteturas INTEL). Exemplo numérico com 2 bytes: 0305H = 00000101 00000011 Outro Exemplo: Um Computador com: - Memória com células de 1 byte; - Palavra de 32 bits; - Número 266: 00000000 00000000 00000001 00001010; - Armazenado na memória a partir da célula de endereço 0 (ocupa células de endereço 0, 1, 2, e 3); 3 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Figura 2 -‐ Ordenação dos bytes 2.3.1. Problemas causados pela falta de padronização do armazenamento em memória: - Interpretação de instruções e dados em redes; - Softwares que rodam em várias plataformas devem tratar essas diferenças; - Uso de plataformas de palavras de diferentes tamanhos; Importante: A solução para o problema não é trivial, em geral se baseia em inversão dos bytes. Isto funciona para valores numéricos, mas não para cadeias de caracteres. 2.4. Códigos de correção Os dados armazenados na memória dos computadores podem ocasionalmente ser alterados em razão de oscilações na tensão de alimentação ou de outras causas. Para se prevenir contra esses tipos de erro, algumas memórias armazenam as informações usando um código que permita a correção ou a detecção de erros. Quando esses códigos são usados, há necessidade de se acrescentarem bits extras a cada palavra de memória, de modo a permitir a verificação da exatidão da informação armazenada. Quando uma palavra é lida da memória, os bits armazenados permitem verificar a ocorrência eventual de erros que tenham corrompido a informação armazenada. 4 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Figura 3 -‐ Processo Básico de Detecção/Correção de Erros Dentre os diversos código ou algoritmos de correção de erros estão: a. Código de Hamming (ou distância de Hamming): O número de bits correspondentes que diferem em duas palavras de códigos quaisquer. As propriedades de detecção de erros e de correção de erros dependem fundamentalmente da sua distância de Hamming. Exemplo: As palavras de código 10001001 e 10110001 distam 03 unidades de Hamming. Assim, é necessário que ocorram 03 erros (inversões) nos bits em destaque da palavra 2 para que ela se transforme na palavra 1; b. Bit de Paridade: Esse bit de paridade deve ser escolhido de modo a fazer com que a quantidade de bits 1 na palavra de código seja sempre um número par (ou ímpar). Tal código tem distância de Hamming igual a 2, portanto, a ocorrência de um único erro produz uma palavra de código inválida. Neste caso o erro é somente detectado e não corrigido. Como a probabilidade de erro nas memórias atuais é extremamente pequena (um em dez anos), na prática, os fabricantes de computadores não fazem uso deste recurso. 3. MEMÓRIA CACHE Ao longo do tempo, os processadores têm sido sempre mais rápidos que as memórias, mesmo com o tempo de operação das memórias tendo melhorado bastante. À medida que se 5 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br torna tecnicamente possível a colocação de mais e mais circuitos dentro de um chip, os projetistas vêm usando essas novas facilidades para implementar o processamento pipeline, o processamento superescalar e processamento em múltiplos núcleos tornando-os mais rápidos. Enquanto isso os projetistas de memórias têm usado as novas tecnologias para aumentar a capacidade de armazenamento e não sua velocidade de operação. Na prática, isso significa que um processador deve esperar vários ciclos de clock até que a memória atenda uma requisição para leitura e escrita. Existem duas maneiras de tratar essa questão: - Na mais simples, as operações de leitura da memória devem ser iniciadas sempre que o processador encontrar uma instrução de READ. Mesmo com a operação de leitura iniciada, o processador deve continuar seu processamento, só parando se uma instrução tentar usar a palavra requisitada. - Outra solução é fazer com que o compilador gere seu código, evitando que instruções usem os valores requisitados à memória antes que estes valores estejam disponíveis, impedindo assim a parada do processador. Na verdade, no momento da carga (LOAD) o que é feito é a geração de uma instrução NOP (no operation), instruções que nada fazem senão gastar o tempo do processador, substituindo a parada do hardware. Acontece que para resolver esse problema, as memórias precisam ser implementadas dentro do chip do processador. Assim sendo, para não aumentar o tamanho do chip do processador com a colocação de muita memória, que acarretaria um custo muito alto e mudança em toda a arquitetura, a escolha foi colocar uma pequena quantidade de memória rápida dentro do chip. Algumas técnicas combinaram memórias pequenas e rápidas com memórias grandes e lentas para que o computador opere com velocidade a um custo razoável. A memória pequena e rápida ficou conhecida como memória cache. Este nome veio do Francês Cacher que quer dizer escondido/esconder. Seu princípio básico é otimizar o tempo de resposta da memória RAM. As palavras de memória mais usadas pelo processador devem permanecer armazenadas na cache. Quando o processador precisar de uma palavra, ele primeiro busca essa palavra na cache. Somente se ela não estiver armazenada na cache é que se dará a busca na memória principal. 6 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Figura 4 -‐ Funcionamento do Cache A memória cache pode operar em dois modos: a) Modo Exclusivo: - Conteúdo da L1 não está na L2 que não está na L3. - Aumento da capacidade de armazenamento. - Permite leitura e escrita. b) Modo Inclusivo: - L1 está na L2 que está na L3. - O conteúdo das caches mais internas está sempre nas caches mais externas. - Dados somente leitura. O sucesso desse esquema depende da fração de acessos satisfeitos pela cache. Normalmente as operações acessam palavras consecutivas ou executam vários loops. A constatação de que as referências à memória são satisfeitas deu origem a um princípio conhecido como princípio da localidade de referência, que dá base teórica à operação dos sistemas de memória modernos, orientados para o uso intenso de cache. Dessa forma é comum observarmos quando uma palavra é trazida para a memória cache vir junto dela as palavras vizinhas que com certeza serão usadas em breve. O princípio da localidade de referencia pode ser: - Temporal: Grande chance da informação ser usada novamente a seguir. Os endereços acessados recentemente tem grande chance de serem acessados em um futuro próximo. 7 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Espacial: Grande chance das informações próximas serem usadas. Endereços próximos aos acessados recentemente tem grande probabilidade de serem acessados no futuro próximo. O projeto de memórias cache está se tornando um assunto de fundamental importância para os processadores de alto desempenho. Uma das questões mais discutidas é o tamanho da cache. Quanto maior ela for, melhor a sua performance e conseqüentemente mais alto seu custo. Outra questão a ser considerada no projeto de cache é se as instruções devem permanecer em uma cache unificada. No entanto, a tendência atual é se utilizar cache divididos, uma cache para instruções e outra para dados, conhecido com o arquitetura de Harvard. Figura 5 -‐ Arquitetura de Harvard 3.1. Níveis de cache Foram desenvolvidos em resposta à uma das consequências ao problema do gargalo de Von Newmann. A divisão em níveis decorre da demanda à memória por velocidade, altíssimas taxas de transferência e baixa latências. Dessa forma, é muito difícil e caro construir memórias cache com estas características, então elas são construídas em níveis que diferem na relação tamanho x desempenho. - L1: A menor delas, mais rápida e mais cara. Alguns projetos a dividem em dados e instruções (Arquitetura de Harvard). - L2: Supre as deficiências de tamanho da L1 e acabou por tornar-se um trunfo nas arquiteturas modernas por mais desempenho. 8 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - L3: Proposta pela AMD, apresenta mais um nível de maior tamanho e menor desempenho. Segundo Stallings, 3 Mb oferece 98% do aumento de desempenho. 3.2. Mapeamento 3.2.1. MAPEAMENTO DIRETO Cada bloco da memória principal tem uma linha previamente definida onde será armazenado. 3.2.2. MÉTODO ASSOCIATIVO TOTAL Oposto do mapeamento direto, não existe posição fixa para cada bloco de memória em cache. É um hardware mais complexo com aumento do custo e complexidade. 3.2.3. MÉTODO ASSOCIATIVO EM GRUPO Tenta resolve o problema de conflito de blocos na mesma linha e o problema de custo da comparação do campo tag. Esta é uma solução hibrida. 3.1. Organização Típica de uma Memória Cache Como o número de linhas de memória é menor que o número de blocos da memória principal, é necessário um algoritmo para mapear os blocos da memória principal, em linhas da memória cache. A escolha da função que efetua esse mapeamento determina como a memória cache é organizada. Existem diversas técnicas usadas para esse mapeamento, sempre utilizando como base uma estrutura geral mostrada a seguir. 9 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Figura 6 – Estrutura do Cache - A memória cache pode conter 64 Kbytes; - Os dados são transferidos entre a memória principal e a memória cache em blocos de 4 bytes. 4. TIPOS DE MEMÓRIA Até o início dos anos 1990, as memórias eram fabricadas em um único chip. A densidade dos chips cresceu ao longo do tempo de 1 KBit para cerca de 1Mbit. Os primeiros computadores tinham soquetes vazios onde o usuário podia plugar chips adicionais de memória. Atualmente, o sistema de memórias está organizado de maneira diferente. Um grupo de chips é montado em uma placa de circuito impresso, e vendido como uma unidade de memória. Essa unidade é chamada de SIMM (Single Inline Memory Module) ou de DIMM (Dual Inline Memory Module), dependendo da existência de uma linha de conectores em um dos lados da placa (SIMM) ou em ambos os lados da placa (DIMM). Os notebooks usam uma DIMM fisicamente menor, chamada de SO-DIMM (Small Outline DIMM). Tanto as memórias SIMM como as DIMM vêm com um bit de paridade ou com bits para correção de erros. Porém, como as estatísticas mostram que a taxa de erro de um 10 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br desses módulos é muito baixo (1 erro a cada 10 anos), a grande maioria dos computadores não implementa nem detecção de erros e muito menos correção de erros. Figura 7 -‐ Memória SIMM Além dessas, outros tipos de memórias devem ser consideradas: - SIMM/72 – Possui 72 conectores. Utilizada em processadores 486, Pentium e superiores é um módulo SIMM de 32 bits, encontradas, por exemplo, nas versões de 4 MB, 8 MB, 16 MB e 32 MB. No caso de uma máquina definida como de 64 bits*, como o Pentium, essas placas são usadas aos pares, cada uma delas acessando metade dos bits necessários a uma operação com a memória. - DIMM/168 – Possui 84 conectores banhados a ouro de cada lado, perfazendo um total de 168 conectores. É um módulo de 64 bits. A capacidade está acima de 64 MB. Os primeiros eram alimentados com 5V e usavam memórias como FPM e EDO. Os mais modernos são alimentados com 3,3V e usam memórias SDRAM. - RIMM (Rambus In Line Memory Module) - Esses módulos são padronizados pela Rambus para a utilização de memórias RDRAM. Figura 8 -‐ Memória RIMM - DDR (Double Data Rating) - é a tecnologia que substituiu as tradicionais memórias DIMM de 168 pinos. É um tipo de memória baseado na tecnologia SDRAM. Podem realizar o dobro de operações por ciclo de clock. 11 ARQUITETURA DE HARDWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Exemplo: Uma memória DDR de 266 MHz trabalha, na verdade, com 133 MHz. Como realiza duas operações por vez, é como se trabalhasse a 266 MHz (o dobro). - Dual DDR - Baseia-se na idéia: em vez de utilizar uma única controladora para acessar todos os slots de memória da placa-mãe, por que não usar duas controladoras ao mesmo tempo? Essa é a principal diferença do esquema Dual DDR. - DDR 2 - É o acrônimo de Double Data Rate 2 Syncronous Dynamic Random Acess Memory. Dual In-line Memory Module significa que os módulos fazem contatos pelos seus dois lados, em contraste aos antigos módulos SIMM (Single In-line Memory Module). Syncronous Dynamic Random Acess Memory significa que a memória possui acesso aleatório síncrono e dinâmico. O termo sincronia é utilizado para indicar que a memória e processador possuem clocks coincidentes, o que faz aumentar o desempenho em comparação com a antiga tecnologia EDO em 25%. O termo dinâmico é uma referência à estrutura dos chips, que são formados por uma matriz de capacitores que precisam ser recarregados constantemente. Double Data Rate significa que o tráfego é de dois dados por pulso de clock. O número 2 simboliza o conjunto de melhorias do novo padrão Não é compatível com placas-mãe que trabalham com memória DDR. - DDR 3 - é uma melhoria sobre a tecnologia precedente DDR2 SDRAM. O primeiro benefício da DDR3 é a taxa de transferência duas vezes maior que a taxa da DDR2, de modo que permite taxas de barramento maiores, como também picos de transferência mais altos do que as memórias anteriores. A memória DDR3 consome cerca de 30% menos energia, se comparado aos módulos DDR2. Trabalha com voltagem de 1.5 V, menor que a 1.8 V da DDR2 ou os 2.5 V da DDR. O uso de voltagem 1.5 V funciona bem com a tecnologia de chips de 90 nanômetros da DDR3. O principal benefício da DDR3 vem da alta taxa de transferência, possível graças ao buffer de 8 bits; diferente dos 4 bits da DDR2 ou dos poucos 2 bits de buffer da DDR. Os módulos da DDR3 podem ainda transferir dados numa taxa entre 800 e 1600 MHz, usando ambos estados de um clock de 400/800 MHz. 12