0
Memória Principal x Cache <ul><li>Uma das soluções possíveis para diminuir a perda de tempo envolvida em operações de leit...
<ul><li>Temos as seguintes opções: </li></ul><ul><ul><li>A que usávamos antes, memória principal, lenta, mas com um tamanh...
<ul><li>Podemos sonhar que </li></ul><ul><li>somos infinitamente </li></ul><ul><li>ricos e simplesmente </li></ul><ul><li>...
<ul><li>Agora, vem a pergunta “manjada”: será que é possível ter o benefício da rapidez da memória cache sem ter que aumen...
<ul><li>Podemos arrumar nossa máquina da seguinte forma: </li></ul><ul><li>Já que a cache tem um tamanho bastante limitado...
<ul><li>Vamos agora supor uma instrução que é executada k vezes ao longo de um programa </li></ul><ul><li>Na arquitetura e...
<ul><li>Para k muito grande, temos k >> t mem , e  k ≈ k - 1. Daí: </li></ul><ul><li>Ou seja, o tempo médio de busca dessa...
<ul><li>Existe um tipo especial de cache, chamado  cache associativa , que recebe da memória principal um conjunto de inst...
<ul><li>Sempre que o processador pedir uma instrução, a cache armazenará todo o bloco de onde essa instrução faz parte: </...
<ul><li>Sempre que o processador pedir uma instrução, a cache armazenará todo o bloco de onde essa instrução faz parte: </...
<ul><li>Se as palavras nos endereços 4, 5, 6 e 7 forem todas instruções e estas forem executadas sequencialmente, apenas u...
<ul><li>Cache associativa para blocos de tamanho 4: </li></ul>1 3 P 0 P 1 P 2 P 3 1 5 P 0 P 1 P 2 P 3 0 2 P 0 P 1 P 2 P 3 ...
<ul><li>Validade  é o bit que diz se aquele bloco está sendo usado ou é lixo. 1 significa que o bloco está sendo usado, en...
<ul><li>Antes, precisamos entender uma certa “mágica” </li></ul><ul><li>Seja a memória dividida em </li></ul><ul><li>bloco...
<ul><li>Antes, precisamos entender uma certa “mágica” </li></ul><ul><li>Seja a memória dividida em </li></ul><ul><li>bloco...
<ul><li>Na verdade, não é algo tão difícil de aceitar se pensarmos em uma generalização </li></ul><ul><li>Vamos pensar na ...
<ul><li>Na verdade, não é algo tão difícil de aceitar se pensarmos em uma generalização </li></ul><ul><li>Vamos pensar na ...
<ul><li>Voltando ao que interessa, vamos supor que o valor 00001001 chegue ao MAR no processador. Isto significa que o pro...
<ul><li>Na verdade, a busca não é sequencial </li></ul><ul><li>Em cada uma das linhas da cache, existem portas lógicas que...
<ul><li>Esse festival de portas lógicas constitui um importante motivo do encarecimento da cache </li></ul><ul><li>Isso po...
<ul><li>O bloco 2 então está na cache. Mas como encontrar a palavra certa (a do endereço 9) em meio às 4 do bloco, que con...
<ul><li>Existe outro tipo de cache, mais barato que a associativa, a  cache com mapeamento direto </li></ul><ul><li>Nela, ...
<ul><li>Cache com mapeamento direto para blocos de tamanho 4: </li></ul>1 000 P 0 P 1 P 2 P 3 1 001 P 0 P 1 P 2 P 3 0 101 ...
<ul><li>Antes, armazenávamos blocos vindos da memória enquanto houvesse linhas disponíveis </li></ul><ul><li>Agora, as lin...
<ul><li>A arrumação mais óbvia seria: </li></ul><ul><li>Porém, perceba que, desta forma, dos blocos 0, 1, 2 e 3, nunca pod...
<ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>palavras nos endereços 0 a 15, consultadas sequencialmente ...
<ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>Ao buscar a palavra no endereço 0, o bloco 0 é carregado pa...
<ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>Na busca da palavra no endereço 4, o bloco 1 é carregado pa...
<ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>O mesmo acontece para as buscas das palavras nos endereços ...
<ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>...e 12! 12 0 bloco 0 bloco 1 bloco 2 bloco 3
<ul><li>Note que, após todas essas buscas, teríamos os 4 blocos armazenados na cache associativa </li></ul><ul><li>Na cach...
<ul><li>Com isso, o problema do loop que acabamos de ver será mais difícil de acontecer </li></ul><ul><li>Agora, quando ca...
<ul><li>Outro ganho que temos com este arranjo é a diminuição da largura da cache, substituindo a antiga coluna que guarda...
<ul><li>Assim, se o valor da tag na linha 0 for 000, sabemos que nela está o bloco 0; se for 010, sabemos que lá está o bl...
<ul><li>Supondo uma memória principal com 32 blocos, teríamos a cache disposta dessa forma: </li></ul><ul><li>Repare que a...
<ul><li>Se tirarmos a última linha da cache, não terá como redistribuir os blocos 7, 15, 23 e 31 sem que todos os blocos d...
<ul><li>Uma forma de unir os benefícios desses dois tipos de cache é literalmente unir as duas caches </li></ul><ul><li>Se...
<ul><li>Isso consiste em um terceiro tipo de cache, chamado  cache associativa por conjunto </li></ul><ul><li>A altura con...
<ul><li>Já que temos mais de um bloco por linha, precisamos de portas lógicas para identificar em qual deles está a palavr...
Upcoming SlideShare
Loading in...5
×

Tipos de memoria

178

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
178
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Tipos de memoria"

  1. 1. Memória Principal x Cache <ul><li>Uma das soluções possíveis para diminuir a perda de tempo envolvida em operações de leitura e escrita na memória principal são as memórias cache </li></ul><ul><li>Este é um tipo de memória rápida, isto é, acessos a ela levam muito menos tempo, porém com a desvantagem de serem surrealmente caras </li></ul><ul><li>Recordando, de forma simplificada, o modelo de Von Neumann: </li></ul>Memória Processador
  2. 2. <ul><li>Temos as seguintes opções: </li></ul><ul><ul><li>A que usávamos antes, memória principal, lenta, mas com um tamanho maior sem um custo alto demais </li></ul></ul><ul><ul><li>Uma memória cache, caríssima e, portanto, de tamanho bem limitado, mas muito mais rápida </li></ul></ul>Memória Principal Processador Cache Processador
  3. 3. <ul><li>Podemos sonhar que </li></ul><ul><li>somos infinitamente </li></ul><ul><li>ricos e simplesmente </li></ul><ul><li>aumentar a cache até o </li></ul><ul><li>tamanho que queremos </li></ul><ul><li>Ou podemos voltar à realidade... </li></ul>
  4. 4. <ul><li>Agora, vem a pergunta “manjada”: será que é possível ter o benefício da rapidez da memória cache sem ter que aumentá-la a ponto de deixar a máquina cara demais, e ao mesmo tempo ter o tamanho de uma memória principal razoável? </li></ul><ul><li>Podemos começar com uma constatação básica: utilizando uma memória convencional, gastaremos 100 ciclos (tempo de leitura na memória, como já vimos) pelo menos uma vez por instrução, pois precisamos buscar cada uma delas na memória </li></ul><ul><li>Então, já seria um bom começo não precisar buscar uma mesma instrução duas vezes </li></ul>
  5. 5. <ul><li>Podemos arrumar nossa máquina da seguinte forma: </li></ul><ul><li>Já que a cache tem um tamanho bastante limitado, podemos usá-la pelo menos para armazenar instruções que já tenham sido buscadas. Assim, quando o processador precisar de alguma instrução pela segunda vez, ela será carregada da cache, o que levará muito menos tempo do que carregá-la da memória principal novamente </li></ul>Memória Principal Processador Cache endereços endereços dados dados
  6. 6. <ul><li>Vamos agora supor uma instrução que é executada k vezes ao longo de um programa </li></ul><ul><li>Na arquitetura em que só havia processador e memória principal, o tempo médio para buscar essa instrução seria, naturalmente, o tempo gasto em uma operação de busca na memória </li></ul><ul><li>Já na arquitetura proposta no slide anterior, sabemos que a instrução só será buscada na memória principal na primeira vez. Nas outras (k - 1) vezes, ela será carregada da cache. Logo, o tempo médio para buscar essa instrução será: </li></ul>
  7. 7. <ul><li>Para k muito grande, temos k >> t mem , e k ≈ k - 1. Daí: </li></ul><ul><li>Ou seja, o tempo médio de busca dessa instrução será o tempo de buscá-la na cache, que era o que queríamos antes </li></ul><ul><li>E nem precisamos gastar uma senhora grana com uma cache do tamanho da memória principal; bastou usar uma menor com alguma inteligência </li></ul>
  8. 8. <ul><li>Existe um tipo especial de cache, chamado cache associativa , que recebe da memória principal um conjunto de instruções, em vez de apenas uma por vez. Estes conjuntos são os blocos </li></ul><ul><li>Blocos de instruções são divisões feitas tanto na memória principal quanto na cache, de tamanho fixo e pré-determinado </li></ul><ul><li>Por exemplo, podemos dividir a memória principal em blocos de tamanho 4 (cada um contém 4 palavras): </li></ul>. . . bloco 0 bloco 1 bloco 2 bloco 3 bloco 4
  9. 9. <ul><li>Sempre que o processador pedir uma instrução, a cache armazenará todo o bloco de onde essa instrução faz parte: </li></ul><ul><li>Vamos dar um zoom em parte da memória do slide anterior. Suponha que o processador precisa da palavra no endereço 4: </li></ul>0 1 2 3 4 5 6 7 8 9 10 11
  10. 10. <ul><li>Sempre que o processador pedir uma instrução, a cache armazenará todo o bloco de onde essa instrução faz parte: </li></ul><ul><li>Vamos dar um zoom em parte da memória do slide anterior. Suponha que o processador precisa da palavra no endereço 4: </li></ul>0 1 2 3 4 5 6 7 8 9 10 11 Cache As palavras nos endereços 5, 6 e 7 também são carregadas para a cache
  11. 11. <ul><li>Se as palavras nos endereços 4, 5, 6 e 7 forem todas instruções e estas forem executadas sequencialmente, apenas uma consulta na memória principal será necessária, em vez de 4 </li></ul><ul><li>Considerando que, em aplicações reais, o tamanho dos blocos tende a ser muito maior que 4, pode-se dizer que conseguimos uma grande vantagem </li></ul><ul><li>Analisaremos mais a fundo a cache associativa para entender melhor suas vantagens </li></ul>
  12. 12. <ul><li>Cache associativa para blocos de tamanho 4: </li></ul>1 3 P 0 P 1 P 2 P 3 1 5 P 0 P 1 P 2 P 3 0 2 P 0 P 1 P 2 P 3 validade (0 ou 1) nº do bloco conteúdo do bloco (P n é a n-ésima palavra do bloco) entradas (ou linhas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  13. 13. <ul><li>Validade é o bit que diz se aquele bloco está sendo usado ou é lixo. 1 significa que o bloco está sendo usado, enquanto 0 quer dizer que aquela linha pode ser sobrescrita </li></ul><ul><li>Número do bloco é o número (evidentemente binário) que representa onde aquele bloco estava na memória principal. Se o bloco armazena as palavras vindas dos endereços 0, 1, 2 e 3 da memória, então seu número é 0; se armazena as palavras dos endereços 4, 5, 6 e 7, então seu número é 1; etc </li></ul><ul><li>Quando o processador pede alguma palavra da memória, todas as linhas de validade 1 são verificadas, e a palavra é buscada na memória principal apenas se não existir na cache </li></ul><ul><li>Mas como essa checagem é feita? </li></ul>
  14. 14. <ul><li>Antes, precisamos entender uma certa “mágica” </li></ul><ul><li>Seja a memória dividida em </li></ul><ul><li>blocos de tamanho n </li></ul><ul><li>Cortando os log₂n bits menos significativos do endereço de uma palavra, obtemos exatamente o bloco onde ela está </li></ul><ul><li>Por exemplo, vimos que, dividindo em blocos de tamanho 4, a instrução no endereço 7 está no bloco 1 </li></ul><ul><li>7 na base 2, em 8 bits, é igual a: </li></ul>00000111
  15. 15. <ul><li>Antes, precisamos entender uma certa “mágica” </li></ul><ul><li>Seja a memória dividida em </li></ul><ul><li>blocos de tamanho n </li></ul><ul><li>Cortando os log₂n bits menos significativos do endereço de uma palavra, obtemos exatamente o bloco onde ela está </li></ul><ul><li>Por exemplo, vimos que, dividindo em blocos de tamanho 4, a instrução no endereço 7 está no bloco 1 </li></ul><ul><li>7 na base 2, em 8 bits, é igual a: </li></ul>00000111 log₂4 = 2; então, tirando os 2 bits menos significativos, obtemos o valor 1, que é o número do bloco da instrução 7
  16. 16. <ul><li>Na verdade, não é algo tão difícil de aceitar se pensarmos em uma generalização </li></ul><ul><li>Vamos pensar na base 10: considere uma memória dividida em blocos de tamanho 100 </li></ul><ul><li>Os endereços 0 até 99 estão no bloco 0, do 100 até 199, estão no bloco 1, e por aí vai </li></ul><ul><li>Para obter o bloco da palavra no endereço 374, precisamos tirar os log₁₀100 bits menos significativos (mudamos para a base 10, então a base do logaritmo passa a ser 10) </li></ul>3 74
  17. 17. <ul><li>Na verdade, não é algo tão difícil de aceitar se pensarmos em uma generalização </li></ul><ul><li>Vamos pensar na base 10: considere uma memória dividida em blocos de tamanho 100 </li></ul><ul><li>Os endereços 0 até 99 estão no bloco 0, do 100 até 199, estão no bloco 1, e por aí vai </li></ul><ul><li>Para obter o bloco da palavra no endereço 374, precisamos tirar os log₁₀100 bits menos significativos (mudamos para a base 10, então a base do logaritmo passa a ser 10) </li></ul>3 log₁₀100 = 2, então tiramos os 2 algarismos menos significativos. A palavra está no bloco 3 3
  18. 18. <ul><li>Voltando ao que interessa, vamos supor que o valor 00001001 chegue ao MAR no processador. Isto significa que o processador está pedindo a palavra que está no endereço 9 (bloco 2) </li></ul><ul><li>Os 2 bits menos significativos são ignorados, e o valor 000010 é comparado, na cache, a todos os números de bloco pertencentes a linhas de validade 1 </li></ul><ul><li>Mas como uma consulta na cache pode ser tão rápida, se ainda precisamos fazer uma busca sequencial para saber se o bloco 2 já está de fato armazenado na cache? </li></ul>
  19. 19. <ul><li>Na verdade, a busca não é sequencial </li></ul><ul><li>Em cada uma das linhas da cache, existem portas lógicas que comparam simultaneamente o número do bloco nela presente ao valor recebido </li></ul>1 3 P 0 P 1 P 2 P 3 1 5 P 0 P 1 P 2 P 3 1 2 P 0 P 1 P 2 P 3 000010 portas lógicas 3 5 2 os valores são diferentes os valores são iguais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  20. 20. <ul><li>Esse festival de portas lógicas constitui um importante motivo do encarecimento da cache </li></ul><ul><li>Isso porque, como vimos desde os primeiros slides, hardware tem uma grande influência no preço final da máquina </li></ul>
  21. 21. <ul><li>O bloco 2 então está na cache. Mas como encontrar a palavra certa (a do endereço 9) em meio às 4 do bloco, que contém as palavras dos endereços 8, 9, 10 e 11? </li></ul><ul><li>Recordando: a palavra pedida é a do endereço 00001001, e para obter o bloco ignoramos os 2 bits mais à esquerda, 01 </li></ul><ul><li>E estes dois bits são exatamente os bits que informam a palavra certa a ser buscada no bloco! </li></ul><ul><li>Então, a palavra do endereço 9 é a P₁ do bloco 2 </li></ul><ul><li>Dessa forma, carregamos a palavra direto da cache, sem consulta à memória principal </li></ul>
  22. 22. <ul><li>Existe outro tipo de cache, mais barato que a associativa, a cache com mapeamento direto </li></ul><ul><li>Nela, cada linha da cache é destinado a blocos específicos da memória </li></ul><ul><li>Dessa forma, não é necessário ter circuitos comparativos em cada linha da cache, já que a procura será feita apenas em uma linha específica e não mais em todas elas </li></ul><ul><li>Com isso, conseguimos baratear a cache significativamente </li></ul><ul><li>Veremos que o esquema é bem parecido com o da cache associativa: </li></ul>
  23. 23. <ul><li>Cache com mapeamento direto para blocos de tamanho 4: </li></ul>1 000 P 0 P 1 P 2 P 3 1 001 P 0 P 1 P 2 P 3 0 101 P 0 P 1 P 2 P 3 validade (0 ou 1) tag conteúdo do bloco (P n é a n-ésima palavra do bloco) entradas (ou linhas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  24. 24. <ul><li>Antes, armazenávamos blocos vindos da memória enquanto houvesse linhas disponíveis </li></ul><ul><li>Agora, as linhas destinam-se a grupos fixos de blocos. Porém, sabemos que cada linha só pode armazenar um bloco </li></ul><ul><li>Então, se uma linha é destinada aos blocos X e Y, apenas um deles pode estar na cache ao mesmo tempo. Se na cache já existir o bloco X, e o bloco Y for carregado da memória, este bloco irá para a linha onde já está o bloco X, sobrescrevendo-a </li></ul><ul><li>Vamos definir que na nossa cache, cada linha armazena 4 possíveis blocos </li></ul>
  25. 25. <ul><li>A arrumação mais óbvia seria: </li></ul><ul><li>Porém, perceba que, desta forma, dos blocos 0, 1, 2 e 3, nunca poderíamos ter mais de um na cache ao mesmo tempo. O mesmo vale para os outros quartetos de blocos </li></ul><ul><li>Isto significa que, se as palavras nesses blocos fossem buscadas sequencialmente, perderíamos sempre o bloco anterior </li></ul>0 1 2 validade tag conteúdo do bloco . . . 0, 1, 2, 3 4, 5, 6, 7 8, 9, 10, 11
  26. 26. <ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>palavras nos endereços 0 a 15, consultadas sequencialmente 0 bloco 0 bloco 1 bloco 2 bloco 3
  27. 27. <ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>Ao buscar a palavra no endereço 0, o bloco 0 é carregado para a linha 0 da cache 0 0 bloco 0 bloco 1 bloco 2 bloco 3
  28. 28. <ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>Na busca da palavra no endereço 4, o bloco 1 é carregado para a linha 0 da cache. A cache perde, assim, o bloco 0 4 0 bloco 0 bloco 1 bloco 2 bloco 3
  29. 29. <ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>O mesmo acontece para as buscas das palavras nos endereços 8... 8 0 bloco 0 bloco 1 bloco 2 bloco 3
  30. 30. <ul><li>Vamos focar na linha 0 para entender melhor: </li></ul>...e 12! 12 0 bloco 0 bloco 1 bloco 2 bloco 3
  31. 31. <ul><li>Note que, após todas essas buscas, teríamos os 4 blocos armazenados na cache associativa </li></ul><ul><li>Na cache por mapeamento direto, porém, ficamos apenas com o último bloco da sequência </li></ul><ul><li>Nesse caso, se as palavras desses 4 blocos fossem instruções internas a um loop, teríamos que consultar a memória a cada mudança de bloco. Já na cache associativa, nenhum acesso à memória teria de ser feito depois que os 4 blocos já estivessem na cache </li></ul><ul><li>Mas nem tudo está perdido. Basta fazermos com que cada linha destine-se a blocos distantes uns dos outros: </li></ul>
  32. 32. <ul><li>Com isso, o problema do loop que acabamos de ver será mais difícil de acontecer </li></ul><ul><li>Agora, quando carregarmos o bloco 0 na cache, ele só será sobrescrito quando os blocos 8, 16 ou 24 forem carregados da memória </li></ul><ul><li>Supondo uma execução sem excessivos desvios, isto é, um programa com razoável localidade , é perfeitamente possível que não precisemos mais do bloco 0 quando carregarmos um dos outros 3 </li></ul>0 1 2 . . . 0, 8, 16, 24 1, 9, 17, 25 2, 10, 18, 26
  33. 33. <ul><li>Outro ganho que temos com este arranjo é a diminuição da largura da cache, substituindo a antiga coluna que guardava o nº do bloco por uma coluna tag </li></ul><ul><li>A linha 0 destina-se aos blocos 0 (00000), 8 (01000), 16 (10000) e 24 (11000). A linha 1 destina-se aos blocos 1 (00001), 9 (01001), 17 (10001) e 25 (11001), e assim por diante </li></ul><ul><li>Repare na semelhança: para cada linha, os 3 últimos bits dos seus possíveis blocos são iguais </li></ul><ul><li>Isto significa que é possível identificar qual bloco aquela linha está armazenando apenas pelos bits que diferem entre os blocos </li></ul>
  34. 34. <ul><li>Assim, se o valor da tag na linha 0 for 000, sabemos que nela está o bloco 0; se for 010, sabemos que lá está o bloco 8; já o valor 100 indica que ela guarda o bloco 16; e 110 indica o bloco 24 </li></ul><ul><li>Na linha 1, estes mesmos valores acusam, respectivamente, os blocos 1, 9, 17 e 25 </li></ul><ul><li>Resumindo: quando o processador precisa de uma palavra que já está na cache, a consulta é imediatamente direcionada para a linha onde o bloco daquela palavra deveria estar. Por exemplo, se o processador pede uma palavra do bloco 8, a consulta é feita diretamente na linha 0 </li></ul><ul><li>Porém, se lá estiver o bloco 16, o bloco 8 é carregado da memória e salvo na linha 0, sobrescrevendo o 16 </li></ul>
  35. 35. <ul><li>Supondo uma memória principal com 32 blocos, teríamos a cache disposta dessa forma: </li></ul><ul><li>Repare que a altura da cache precisa sempre ser uma potência de 2, para que possamos identificar o bloco armazenado através da tag </li></ul>0 0, 8, 16, 24 2 2, 10, 18, 26 4 4, 12, 20, 28 6 6, 14, 22, 30 1 1, 9, 17, 25 3 3, 11, 19, 27 5 5, 13, 21, 29 7 7, 15, 23, 31
  36. 36. <ul><li>Se tirarmos a última linha da cache, não terá como redistribuir os blocos 7, 15, 23 e 31 sem que todos os blocos destinados a uma mesma linha possuam bits em comum. Logo, seria impossível identificá-los através da tag </li></ul><ul><li>Esta restrição de tamanho pode ser ruim: suponha que temos dinheiro para construir até 1023 linhas de cache por mapeamento direto </li></ul><ul><li>A potência de 2 mais próxima é 1024 (2¹⁰), mas não conseguimos atingir esse número. Logo, nossa cache será forçada a ter apenas 512 linhas </li></ul><ul><li>Já a cache associativa poderia sem problemas ter tantas linhas quanto pudéssemos pagar </li></ul>
  37. 37. <ul><li>Uma forma de unir os benefícios desses dois tipos de cache é literalmente unir as duas caches </li></ul><ul><li>Se “grudarmos” várias caches com mapeamento direto, lado a lado, teremos na horizontal uma espécie de cache associativa </li></ul>. . . . . . . . . . . . . . . V tag cont. do bloco . . . . . . . . . . . . V tag cont. do bloco . . . . . . . . . . . . V tag cont. do bloco
  38. 38. <ul><li>Isso consiste em um terceiro tipo de cache, chamado cache associativa por conjunto </li></ul><ul><li>A altura continua sendo necessariamente uma potência de 2, mas a largura é arbitrária </li></ul><ul><li>Portanto, se temos dinheiro para 1536 linhas de cache, basta juntar 3 caches com mapeamento direto de 512 linhas cada </li></ul><ul><li>Com isso, não precisamos sobrescrever uma linha sempre que um novo bloco destinado a ela for carregado da memória; basta passá-lo para o lado </li></ul>
  39. 39. <ul><li>Já que temos mais de um bloco por linha, precisamos de portas lógicas para identificar em qual deles está a palavra pedida pelo processador, exatamente como fazíamos na cache associativa </li></ul><ul><li>Só que desta vez, o número de portas lógicas de que precisamos não equivale ao número de linhas da cache, e sim ao número de caches por mapeamento direto unidas lado a lado </li></ul><ul><li>Temos com isso uma significativa </li></ul><ul><li>redução de preço, sem uma </li></ul><ul><li>significativa perda de eficiência </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×