Вы находитесь на странице: 1из 20

Memória Cache - Conceito, Características e Aplicações

Trabalho 1 – Sistemas Operacionais I


Prof. Antonio Carlos Gay Thomé

Integrantes:
Bruno Caricchio Buss
Davi Vercillo C. Garcia
Francisco Viégas Vianna
Rodrigo M. T. Fernandez
Thiago Elias Gomes

1
2
Índice

Introdução.............................................................................................4
Conceitos básicos.................................................................................6
Modos de endereçamento....................................................................7
Políticas de atualização da memória principal......................................11
Algoritmos de reposição de dados........................................................13
Níveis de Cache....................................................................................15
Especialização de Cache......................................................................16
Bibliografia.............................................................................................20

3
1. Introdução

Uma das coisas mais impressionantes quando se fala em tecnologia, pode-se dizer, é a
velocidade com que as mudanças e inovações ocorrem, mais especificamente a partir da
década de 80. Há não mais que 25 anos, os profissionais mais inteirados dos principais
avanços na área maravilhavam-se com máquinas de configuração muito inferior à maioria
dos PC que atualmente são encontrados em quase todas as residências.
A evolução dos microprocessadores também não escapou a essa tendência, como
podemos ver na tabela abaixo.

Processador Ano Clock Nº de Trans.

8086 1978 5-10 MHz 29 K

80386 1986 12-40 MHz 175 K

Pentium 1993 60-300 MHz 3.1 M

Pentium 4 2000 1.3-3.8 GHz 55 M

Core i7 2008 2.6-3.3 GHz 781 M


Tabela 1 – A evolução dos processadores

Como podemos ver na tabela acima, o 8088, famoso processador da Intel® lançado em
1979, trabalhava a uma freqüência de apenas 4.7 MHz. Já o mais novo processador da
Intel®, o Core® i7, lançado em novembro de 2008, possui 4 núcleos operando cada um a
2.66 GHz, em sua versão mais simples. É uma diferença simplesmente notável.
As técnicas de armazenamento também evoluíram muito. Novos tipos de memória cada
vez mais rápidas e com mais capacidade foram criadas, como a SDRAM (Synchronous
Dynamic Random Access Memory) e suas sucessoras, as DDRs. Hoje temos computadores
com memória principal muito maior que todo o armazenamento de um dispositivo do
tamanho de uma geladeira de 30 anos atrás.
No entanto, a evolução dos processadores foi comparativamente muito maior do que a
evolução das memórias. A diferença de velocidade entre um acesso à memória e uma
operação na CPU, que não era muito grande, passou a ser um fator limitante na velocidade
de operação dos computadores atuais. Foi nesse ponto que a otimização do acesso à
memória principal passou a ser foco de estudos mais profundos por parte dos projetistas de
processadores, em busca de métodos eficazes para tentar fazer com que o acesso à
memória causasse o mínimo possível de overhead no sistema. É importante ressaltar que a
tecnologia para criar memórias mais rápidas existe. O que determina que memórias mais
lentas sejam utilizadas é um fator meramente econômico. Estas memórias seriam
extremamente caras (em varias ordens de magnitude, na verdade).

4
Já idéia de criar um buffer de alta performance para a memória principal não é tão
recente. A primeira publicação a respeito foi feita em 1968 e foi extremamente bem recebida
pela comunidade. Não demorou muito para que a então recém-criada memória cache, como
foi batizada, sofresse uma série de melhoras e otimizações e se tornasse parte fundamental
de qualquer sistema computacional atual.

O que é a memória Cache ?


Memória Cache nada mais é do que um bloco de memória de tamanho reduzido e com
tempo de acesso menor, se comparado à memória principal, que se interpõe entre esta e o
processador com o objetivo de diminuir o tempo médio de acesso a dados que estão na
memória principal. Ela armazena uma pequena parte dos dados que estão em memória,
aqueles com a maior probabilidade de serem usados em um breve período de tempo.
Entenda-se “com maior probabilidade” aquelas informações que se encontram em posições
de memória subsequentes à que está sendo acessada em um dado momento. Isso ocorre
graças ao “Princípio da Localidade” que existe em máquinas determinísticas.

Como a memória Cache funciona ?


Abaixo temos um diagrama simplificado de como pode-se ver o papel de uma Memória
cache em um sistema computacional.

Figura 1 – Diagrama simplificado de uma arquitetura que utiliza Memória Cache

O funcionamento da Cache, seja qual for o seu nível de refinamento, se dá


basicamente da seguinte forma (As operações de escrita e leitura ocorrem de forma um
pouco distinta uma da outra. Veja em “Políticas de atualização da Memória Principal”):
A CPU inicia a execução de uma instrução que requer busca ou escrita de dados em
uma certa posição de memória.
Antes de ir à Memória Principal, a CPU faz uma consulta à Memória Cache para saber
se a posição de memória em que ela deve operar está lá.
Caso esteja, ela nem mesmo chega a ir à Memória Principal, efetuando a operação na
própria Cache e dando seqüência ao fluxo de execução do programa.
Caso contrário, ela vai até a Memória Principal realiza a operação desejada e traz mais
um determinado bloco de memória, com posições que tem grandes chances de serem
acessados nos próximos ciclos de máquina.

5
Ganhos de performance com memória Cache.
Embora este possa ser um assunto extremamente extenso, uma breve e superficial
análise se faz necessária para que possamos adentrar em outros detalhes da Memória
Cache e sua implementação.
Os níveis da hierarquia de memória em um computador atual, suas tecnologias e tempo
médio de acesso podem ser vistos na tabela abaixo:

Tempo de Tamanho
Nível Tecnologia
Acesso Médio
CMOS
Registradores 1-3 ns 4B–8B
Especializada

Cache 2-8 ns 8 KB-128 KB SRAM

Memória Principal 10-60 ns 64 MB - 1 GB DRAM


3,000,000
-
Disco 20 - 100 GB Magnético
10,000,00
0 ns
Tabela 2 – Hierarquia de memória dados estatísticos

Pelos dados na tabela acima, podemos perceber que um acesso à Memória Cache
pode ser até 30 vezes mais rápido que um acesso à Memória Principal ( 2 ns – 60 ns). Se
considerarmos a média do tempo de acesso (5 ns – 35 ns) temos um acesso 7 vezes mais
rápido. Uma melhoria de mais de 86%.
Obviamente, existem muitos outros fatores a se considerar ao se tratar de performance
de cache, sendo um dos principais, o tipo de carga de trabalho executada pelo sistema, e o
fato de que a execução de um programa não é 100% acessos a memória. Mas essa análise
superficial mostra quão melhor, teoricamente, um sistema com Memória Cache
implementada pode ser.

2. Conceitos básicos

Cada elemento que compõe o cache, contém uma informação que é a cópia exata da
informação original, localizada em outro setor de maior latência de acesso. Cada um desses
elementos tem uma etiqueta que identifica o dado que foi copiado para o cache no local de
armazenamento original.

6
Quando um dispositivo quer acessar um dado que está num local de armazenamento,
primeiramente ele verifica o cache. Se uma entrada com uma etiqueta correspondente ao
dado desejado for encontrada, o elemento do cache é então utilizado ao invés do dado
original.
Essa situação é conhecida como "cache hit". A percentagem de acessos que resultam
em cache hits é conhecida como a taxa de acerto (hit rate ou hit ratio) do cache.
Por outro lado, quando um cache é consultado e constata-se que ele não contém a
informação com a etiqueta desejada, a informação é então copiada do local original de
armazenamento e inserido no cache, ficando pronto para o próximo acesso. Esta situação é
chamada de "cache miss".
O custo de uma memória cache é muito alto, por isso em geral a capacidade de
armazenamento de um cache é limitada. Caso não haja mais espaço para armazenar o novo
dado, algum outro elemento deve ser retirado dele para que libere espaço para o novo
elemento. As heurísticas utilizadas para fazer esta seleção de qual elemento será substituído
são chamadas de algoritmos de reposição de dados.
Os dados que estão disponíveis nos locais de armazenamento original podem ser
modificados por outras entidades diferentes, além do próprio cache. Nesse caso, a cópia
existente no cache pode se tornar inválida. Da mesma forma, quando um cliente atualiza os
dados no cache, as cópias do dado que estejam presentes em outros caches se tornarão
inválidas. Protocolos de comunicação entre gerentes de cache são responsáveis por manter
os dados consistentes e confiáveis e são conhecidos por protocolos de coerência.

3. Modos de endereçamento

A função de uma memória cache é assegurar performance à CPU tentando mapear as


áreas mais utilizadas da memória principal dentro de uma memória muito reduzida. Devido a
isto, o modo como uma determinada área da memória principal é mapeada na memória
cache é muito importante e traz melhorias de desempenho se escolhida da forma correta.
Existem três formas principais de mapeamento da cache:
● Mapeamento direto: Cada posição da memória principal só pode ser mapeada
para uma posição da memória cache.
● Totalmente associativo: Cada posição da memória principal pode ser mapeada
em qualquer posição da memória cache.
● Associativo por conjunto: Cada posição da memória cache pode ser mapeada
em N posições da cache.
Aprofundaremos cada um desses modos de mapeamento incluindo detalhes de
estrutura de armazenamento da informação.

Mapeamento Direto
Neste modo cada posição da memória principal é mapeada em apenas uma posição da
memória cache. Como a cache é muito menor que a memória principal, várias posições
desta são mapeadas numa mesma posição da cache como vemos na figura abaixo.

7
O método utilizado para fazer este mapeamento é o hash map. No caso ao lado, a
memória cache possui 4 posições endereçáveis, portanto, uma posição X da memória
principal é mapeada para a posição X mod 4 desta cache.
Há também um endereçamento horizontal feito quando o bloco da cache armazena
mais de uma palavra de dados. Isso é feito para que, ao buscar um dado ou instrução na
memória, a cache traga junto a ela os dados ou instruções adjacentes, tentando melhorar o
cache hit. Quando a cache busca dados na memória principal, ela traz de uma só vez, tantas
palavras quanto forem o número de palavras dentro de seu bloco. O exemplo abaixo mostra
uma memória cache com um bloco de tamanho 2:

No exemplo dado, precisamos de 1 bit para endereçar dentro do bloco na horizontal.

Já vimos como endereçar a cache, mas, lembrando que várias posições da memória
principal são mapeadas num mesmo bloco, como podemos identificar que o dado de um
bloco requisitado pela CPU é aquele que está armazenado na cache? Para isso precisamos
guardar juntamente com o bloco, o resto do endereço que compõe o endereçamento real da
memória principal. Esta parte do endereçamento é chamada de tag e é responsável por
identificar a posição real a qual aquele bloco pertence.
Agora podemos mostrar um possível particionamento do endereçamento real numa
cache com acesso direto. Vamos supor uma cache de 16 posições verticais com blocos de
tamanho 4 em uma máquina com 22 bits de endereço real.

8

1101010101101000 01
1101 
tag  Ev Eh
index

Onde Eh é a parte responsável pelo endereçamento horizontal(dentro de um bloco) e o


Ev é o responsável por selecionar o bloco na vertical. Este é chamado de index. A tag
distingue os endereços de diferentes blocos, então todas as posições dentro de um mesmo
bloco possuem a mesma tag.
Ainda temos um problema, o conteúdo de uma célula de memória nunca é nulo, então
como podemos saber se o que está armazenado é valido ou não? Para isso adicionaremos
um bit chamado de bit de validade, para sinalizar que um bloco é válido ou não. Portanto
podemos concluir que um determinado bloco de tamanho 2, por exemplo, terá uma estrutura
parecida com a seguinte:

- Vantagens:
Neste tipo de endereçamento, para achar um dado dentro da cache, basta ir
diretamente na posição endereçada e comparar a tag armazenada com a tag requisitada.
Esta operação é rápida e não exige tanta complexidade de implementação. Além disso,
quando há necessidade de substituir algum dado, não há overhead na escolha da posição.

- Desvantagem:
Pouca localidade é mapeada, desta forma, um programa com uma localidade muito
específica pode não fazer um bom aproveitamento da cache utilizando uma pequena faixa de
endereço e recebendo muitos cache miss.

Totalmente Associativo
Neste método, nenhuma das posições da cache possuem endereçamento, ou seja,
todas as posições da memória principal podem ser mapeadas para qualquer posição da
memória cache como mostra a figura:

9
Neste tipo de armazenamento, a cache é sempre utilizada ao máximo, pois sempre que
existe um lugar vazio o algorítimo de reposição alocará este espaço para uma nova
requisição.
Como não possuí index, a partição do endereçamento real fica desta forma:
 
11010101011010001101 01
tag Eh

Também existe uma pequena diferença na estrutura de armazenamento do bloco.


Quando a cache está cheia e há a necessidade de armazenar um novo bloco, o algoritimo de
reposição deverá escolher um bloco para ser substituído, esta escolha depende do
algoritimo(será explicado mais adiante), mas normalmente necessita de uma informação
como a freqüência de acesso. Então a estrutura fica da seguinte forma:

- Vantagem:
A cache mapeia uma localidade maior sendo utilizada por completo.

- Desvantagem:
Como não há endereçamento, todas as tags devem ser comparadas para encontrar um
dado, isso demanda um custo alto de implementação para poder fazer todas as
comparações em paralelo e obter um resposta no tempo esperado. Além disso, o algoritimo
de reposição pode demandar um tempo para escolha, diminuindo o tempo de resposta.

Associativo por Conjunto


Este método é o meio termo entre os dois métodos anteriores. Este método possui um
fator N que é seu grau de associatividade. Ele possui um endereçamento, mas cada
endereço da cache possui N blocos de armazenamento. Estes N blocos são como na
totalmente associativa.
No exemplo a seguir, o grau de associatividade é 2, pois cada posição endereçada pois
2 blocos possíveis.

10
Por causa de suas características, a partição do endereço real será igual ao método de
mapeamento direto e a estrutura de blocos parecida com a do totalmente associativo.
  1
1101010101101000110 10
tag  Ev Eh
index

Partição de um endereço real de 22 bits com uma cache com 4 posições verticais e
bloco de tamanho 2

Estrutura de uma cache com bloco de tamanho 2 e grau de associatividade 2.

- Vantagem:
Possui n posições de armazenamento para blocos com o mesmo índice.

- Desvantagem:
Controle complexo necessitando de um algorítimo de reposição para a substituição de
um entre n blocos.

4. Políticas de atualização da memória principal

Quando a CPU deseja realizar uma operação em Memória, ela tem duas opções (os
dois modos de operação de uma memória, qualquer que seja): Leitura ou Escrita.
Em um sistema com Cache, a operação de leitura não gera problemas, pois a
informação que está na Cache (na verdade uma cópia do backing) é apenas copiada para
um registrador, e ambos Cache Backing continuam perfeitamente sincronizados.
Já uma operação de escrita é um pouco mais problemática. Imagine a seguinte
situação. Uma posição X do backing está mapeada em uma posição X' da cache e em um
determinado momento, uma instrução que escreve na posição X é executada. Naturalmente,
teríamos um cache hit e a operação seria, na verdade, realizada na posição X' da cache.
Agora imagine que houve um desvio no programa para uma região de memória não
mapeada em cache. Logo no primeiro acesso, teríamos um cache miss e uma leitura em
memória, que traria consigo um bloco contíguo de dados para a cache.
O que aconteceria então, se este novo bloco trazido da memória fosse mapeado na
região da posição X' da cache? A alteração feita na posição X da memória seria perdida.
Obviamente isso é inadmissível em qualquer sistema computacional e para resolver estes
problemas temos as “Políticas de Atualização da Memória Principal”.

11
O papel de uma política de atualização (write policy) é determinar quando e de que
forma as alterações feitas no Cache serão atualizadas no Backing. Obviamente, o objetivo é
fazer o mínimo de acessos à memória, sem que nenhum dado seja perdido. Para evitar este
tipo de situação, foram criadas duas abordagens diferentes, a saber:

Write-Through:
Cada escrita em cache ocasiona automaticamente uma escrita síncrona na memória.
Pode-se dizer então que a Cache se torna um buffer apenas de leitura, já que o potencial da
possibilidade de escrever na cache não é aproveitado.. É importante notar que o número de
escritas em memória em geral é muito menor que o números de leituras. Logo, esta política
não é ineficiente, embora ir N vezes à memória escrever um dado “custe” bem mais que ir
uma vez à memória escrever N dados.

Prós:
● Implementação mais simples
● São melhores para sistemas multiprocessados, pois vários clientes (em vez de
somente a CPU) podem querer acessar dados que devem estar atualizados em
qualquer ponto da hierarquia de memória.
Contras:
● Não usufrui de todo o potencial da Cache, já que não é necessário ir ao Backing
em todas as operações de escrita.

Write-back:
Cada operação de escrita em memória é feita diretamente na cache. Quando isto
acontece, a posição de memória da cache recebe o status de “dirty”. Quando um outro bloco
de memória é trazido para a cache em uma posição “dirty” (por decorrência de um cache
miss), o bloco que está lá atualmente, antes de ser sobrescrito, é rebatido de volta para o
Backing e é mantida a coerência da Memória Cache. Este método também é conhecido
como Lazy Write.

Prós:
● Diminui consideravelmente o tráfego de memória em relação ao Write-Through,
e por conseqüência é, em geral mais eficiente.
Contras:
● Implementação mais complicada
● Pode se tornar um problema em sistemas multi-cache e muliprogramados,
situações nas quais manter a coerência de dados é mais difícil.

12
5. Algoritmos de reposição de dados

Em um sistema de Cache, a parte responsável por remover uma entrada da Cache


para dar acesso a um novo bloco de dados é chamado de Algoritmo de Cache, Algoritmo de
Reposição de Dados ou mesmo Política de Reposição.
Este algoritmo desempenha um papel fundamental no desempenho final da Cache,
pois a escolha deste algoritmo irá ditar quais entradas serão mantidas e quais serão
removidas quando for necessário alocar um novo bloco.
Caso este algoritmo escolha um bloco utilizado frequentemente, estará descartando
uma entrada que em breve, provavelmente, será requerida novamente. Esta taxa, na qual
uma entrada buscada na Cache, está presente nela – não sendo necessário ir na memória
principal - é chamada de Taxa de Acerto.
No entanto, quanto mais informações em relação a utilização de um determinado bloco
da Cache este algoritmo guarda e utiliza para tentar prever qual será a melhor posição a ser
removida – com objetivo de manter uma Taxa de Acerto alta - irá aumentar o tempo de
execução deste algoritmo.
O tempo gasto – incluindo toda a execução do algoritmo de reposição - a partir a
requisição de um dado e o retorno deste quando presente na Cache, é chamado de Latência.
Então, um determinado Algoritmo de Reposição de Dados terá que buscar um melhor
termo entre Latência e Taxa de Acerto (basicamente uma troca Custo-Benefício).

Quanto maior a Taxa de Acerto provida pelo algoritmo, maior será sua Latência devido
as informações que ele deverá atualizar e armazenar sobre cada entrada. O inverso também
acontece, quanto menor for a Latência induzida pelo algoritmo, menor serão as chances que
este algoritmo escolha a melhor entrada para ser removida.
A seguir veremos algumas abordagens para um Algoritmo de Reposição de Dados de
uma Cache.

Least Recently Used (LRU):


Os algoritmos que utilizam a abordagem de LRU, descartam as entradas menos
utilizadas, ou seja a que foi menos recentemente requisitada.
Esta abordagem é melhor aproveitada quando temos um pequeno numero de dados,
utilizados repetidamente.
Este tipo de controle é feito, guardando alguns “bits de idade” em cada entrada da

13
cache. Quando uma desta entrada é utilizada, todas as outras tem seus “bits de idade”
incrementados, tornando-as assim mais “velhas”.
Logo este algoritmo necessita que a memória cache contenha um espaço adicional
para guardar os “bits de idade”, porem como já vimos, todo espaço de memória cache é
caro. Logo, quanto mais informações quisermos guardar, para que a Cache tenha maiores
chances de realizar uma boa escolha, mais custosa esta Cache será.
Em sistemas onde o custo de implementação do LRU tornariam este tipo de algoritmo
proibitivo, como por exemplo em Caches de alta associatividade, podemos usar uma
variação do LRU, conhecida como Pseudo-LRU que consome apenas 1 bit por elemento da
Cache. Caso seja suficiente que apenas uma das entradas mais antigas, não
necessariamente a mais antiga, possa ser descartada então o Pseudo-LRU pode vir a ser
uma boa escolha.
Em Caches associativas de 2 vias, podemos ainda utilizar uma especialização do LRU,
aonde apenas 1 bit é guardado para cada duas entradas, indicando qual entrada é a menos
utilizada atualmente. Algumas vezes este tipo de especialização é necessária, em sistemas
muito velozes onde até mesmo o Pseudo-LRU acaba sendo lento.

Most Recently Used (MRU):


Esta abordagem para algoritmo, utiliza uma implementação praticamente idêntica ao
LRU, porem ele descarta a última – mais recente – entrada da Cache.
As Caches com MRU tem um melhor desempenho onde as cargas de trabalho tem
uma tendência maior a acessar entradas mais antigas.

Least-Frequently Used (LFU):


Os algoritmos que utilizam a técnica de LFU, tentam sempre manter as entradas mais
utilizadas na Cache. Caso ocorra algum empate, então ele utiliza um algoritmos de LRU para
o desempate.
A grande desvantagem deste algoritmo é quando uma entrada é muito utilizada durante
um espaço de tempo, porem depois nunca mais é. Como a contagem de vezes que ela foi
utilizada é alta, o LFU irá demorar até conseguir substitui-la por outra que esteja sendo
utilizada mais recentemente.

Algortimo de Belady (Algoritmo Perfeito):


Um algoritmo perfeito para uma Cache seria aquele que conseguisse descartar sempre
a entrada que não seria re-utilizada por mais tempo. Este resultado ótimo é conhecido como
Algoritmo Ótimo de Belady.
Como não é possível prever o futuro e ver quais entradas seriam necessárias
novamente, este algoritmo não conhece implementação prática.

14
6. Níveis de Cache

Vamos tentar melhorar o desempenho da cache vista até aqui. Temos duas
possibilidades: acelerar o tempo de resposta a cache ou aumentar o seu tamanho. Tentando
melhorar as duas coisas ao mesmo tempo, criou-se hierarquia de cache.
Para que uma memória cache possua a velocidade esperada, é necessário variar
alguns parâmetros. Um deles é a aproximação da cache com a CPU. Isso traz um problema
clássico: dissipação de energia. Outro problema é o custo. Para que a cache seja realmente
rápida, faz-se necessário um refinamento da tecnologia e isso custa caro, muito caro. Por
esses motivos a cache que fica mais próxima da CPU deve ter um tamanho reduzido. Esta
cache é chamada de cache primária ou nível 1 ou ainda L1. Como a cache mais rápida é
muito pequena, o número de cache miss é alto. Para tentar reduzir as penalidades do cache
miss, existe a cache secundária ou nível 2 ou L2. Sua tecnologia não é tão refinada
permitindo assim o aumento do seu tamanho sem elevar muito o custo.
Como a latência da memória principal ainda é muito alta, algumas arquiteturas
implementam o L3. Ela é mais utilizada em sistemas multiprocessados.

Funcionamento:
Quando a CPU requisita um dado, e ele está na L1, então ouve um cache hit e o
processador continua trabalhando em altíssima velocidade. Caso o dado não esteja na L1, a
requisição é passada para a L2 e se o dado não estiver lá, o dado deverá ser buscado na
memória principal, o que resulta na pior penalidade.

Manutenção do dados:
Em sistemas com cache multi-nível a forma como os dados são mantidos nas caches é
muito importante, pois podem existir copias de um dado espalhadas pelas caches e deve-se
ter cuidado para não haver incoerência. Por exemplo, a cache L1 está marcando o endereço
X como inválido e a L2 como válido. Para resolver esse conflito existem basicamente três
políticas de manutenção dos dados: a estritamente inclusiva, a exclusiva e a inclusiva.
A estritamente inclusiva garante que todos os dados que estão na L1 também devem
estar na L2. Já a exclusiva garante que os dados que estão na L1 não devem estar na L2. A
inclusiva não obriga que os dados da L1 estejam ou não estejam na L2.
Uma vantagem da exclusiva é que ela armazena mais dados por não ter redundância
de informação. Esta vantagem diminui se L2 é muito maior do que L1. Uma desvantagem é
que quando há um cache miss em L1 e cache hit em L2, o bloco encontrado em L2 é trocado
com um bloco da L1. Esta operação é mais custosa do que simplesmente copiar o bloco para
a L1.

15
Uma vantagem da estritamente inclusiva é que não há troca de blocos entre L1 e L2.
Além disso, quando um dispositivo externo ou um outro processador(ver coerência de cache)
necessitam invalidar um bloco ele só precisa checar a L2. Uma desvantagem é a
redundância de informação.

7. Especialização de Cache

Até o 386, os processadores da família x86 eram capazes de processar apenas uma
instrução de cada vez. Uma instrução simples podia ser executada em apenas um ciclo de
relógio, enquanto instruções mais complexas demoravam vários ciclos de relógio para serem
concluídas. Buscando diminuir o tempo médio de acesso a memória principal, uma memória
cache era utilizada para assistir o processador.

Para melhorar o desempenho do 486, a Intel resolveu usar o pipeline, uma técnica
inicialmente usada em processadores RISC, que consiste em dividir a instrução em em
vários estágios distintos e independentes, executando-os paralelamente no processador.
Desta maneira, conseguimos que o processador seja capaz de processar simultaneamente,
em um único ciclo de relógio, várias etapas de diversas instruções diferentes, que
normalmente demorariam vários ciclos para serem processadas.
O uso dos 5 estágios de pipeline no 486 não chegava a multiplicar por cinco a
performance do processador, na verdade a performance não chegava nem mesmo a dobrar,
mas o ganho é bem significativo.

16
Como os estágios são diferentes e bem definidos, podiam haver memórias dedicadas a
armazenar informações específicas para cada estágio. A idéia seria definir memórias cache
responsáveis em auxiliar cada um dos estágios do pipeline que envolvessem acesso a
memória.
● Cache de Instrução (L1i): Responsável por assistir o estágio de “instruction
fetch”, ou seja, a busca na memória pela próxima instrução a ser executada.
● Cache de Dados (L1d): Responsável por assistir o estágio de “data fetch”, ou
seja, a busca na memória pelos operandos necessários pela instrução atual, se
houver.

Em sistemas multiprocessados, cada processador possui sua própria organização


interna, onde compartilham somente a memória principal. Já em sistema multi-cores, cada
núcleo de processamento (“core“) possui sua cache de nível 1 (L1i e L1d), inacessível por
outro núcleo de processamento, e compartilham a cache de nível 2 e 3 (L2 e L3).

Na figura acima, está representado um sistema multi-processado composto por dois


processadores (representado pelo retângulo cinza claro), onde cada um deles possui dois
núcleos de processamento (representado pelos retângulos cinza escuro). Em cada núcleo de
processamento (“core”), há duas threads em execução, onde estas compartilham a cache de
nível 1 (L1d e L1i).

17
Buffer de Tradução de Endereços (TLB - Translation Lookaside Buffer):

Objetivando o uso e controle de forma eficiente da memória principal, os sistemas


operacionais modernos utilizam o conceito de memória virtual. A memória virtual consiste
num conjunto de recursos de Hardware e Software que possui três funções básica:

● Assegurar que cada processo tenha seu próprio espaço de endereçamento.


● Proteção da memória principal, para impedir que um processo utilize um
endereço de memória que não lhe pertença.
● Possibilitar que uma aplicação utilize mais memória do que a fisicamente
existente.

A memória física é dividida em blocos de bytes contíguos, em geral com 4 KB ou 8 KB


de tamanho, denominados páginas ("page frames"). Por sua vez, o espaço de memória de
um processo é dividido em páginas, que são fisicamente armazenadas em páginas, sempre
ocupando uma páginas por completo. Para acessar estas regiões, é utilizado um endereço
virtual.
Um endereço virtual é gerado durante o processamento da aplicação e encaminhado
para a Unidade de Gerenciamento de Memória (MMU), um dispositivo do processador cuja
função é transformar o endereço virtual em endereço físico. A conversão de endereços
virtuais em físicos baseia-se em Tabelas de Páginas, que são estruturas de dados mantidas
pelo sistema operacional.
As tabelas de páginas descrevem cada página pertencente à um processo, indexada
pelo endereço virtual, onde contém o endereço físico para acessar o espaço de memória
correspondente. Como o acesso à tabela de páginas é muito lento, pois está em memória.
Visando aumentar o tempo médio de acesso à tabela de páginas, a MMU possui uma cache
associativa chamada Buffer de Tradução de Endereços (TLB - Translation Lookaside Buffer),
que consiste em uma pequena tabela contendo os últimos endereços virtuais solicitados e
seus correspondentes endereços físicos.

18
19
Bibliografia:

1. Cache – Wikipedia:
http://en.wikipedia.org/wiki/Cache
2. CPU Cache – Wikipedia:
http://en.wikipedia.org/wiki/CPU_cache
3. Memory part 2: CPU caches – LWN:
http://lwn.net/Articles/252125/
4. Understanding CPU caching and performance - Ars Technica:
http://arstechnica.com/old/content/2002/07/caching.ars
5. Cache algorithms – Wikipedia:
http://en.wikipedia.org/wiki/Cache_algorithms
6. The Cache Memory Book, Jim Handy - 1998 - segunda edição
7. “Cache Memories” Alan Jay Smith, ACM Computing Surveys, Volume 14 Issue 3,
September 1982

8. HENESSY, John L.; PATTERSON, David A. Arquitetura de computadores: uma


abordagem quantitativa. Rio de Janeiro: Campus, 2003.

9. TANENBAUM, Andrew S. Sistemas operacionais modernos. Rio de Janeiro LTC.


1999.

10. Microarquiteturas de Alto Desempenho - Hierarquia de Memória, Gabriel P. Silva:


http://www.dcc.ufrj.br/~gabriel/microarq/Hierarquia.pdf

20

Вам также может понравиться