Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
09/12/1996

< Memórias XVI: >
< Acelerando a Escrita >


Semana passada vimos como o cache pode acelerar o procedimento de leitura da memória RAM mantendo cópias dos dados em uma porção de memória de acesso mais rápido. Mas será que também a escrita na memória pode ser igualmente acelerada? Bem, isto depende. Porque, no que diz respeito à escrita de dados, há dois tipos de cache: o "write through" e o "write back". Vejamos as diferenças.

O tipo mais comum é o "write through", um cache que funciona nas operações de leitura (como descrevemos semana passada) mas não interfere nas de escrita: quando se trata de escrever um dado na memória RAM, isto é feito do modo convencional (ou seja, envolvendo os eventuais estados de espera e tudo o mais). Assim, no que toca à escrita na memória, a única diferença entre máquinas que usam cache write through e máquinas que não usam cache algum é que nas primeiras, enquanto o dado é escrito na memória RAM, toda a "linha" onde ele foi gravado é copiada no cache. Assim, se mais adiante for solicitada sua leitura, a cópia já estará no cache e a leitura será mais rápida.

O cache do tipo "write back" acelera tanto o procedimento de leitura quanto o de escrita. Pois quando a CPU ordena que um dado seja escrito em um certo endereço da memória RAM, o circuito controlador do cache intercepta a solicitação e, ao invés de escrever o dado nos lentos chips DRAM da memória principal, o escreve nos rápidos chips SRAM do cache e segue em frente. Mais adiante, quando a CPU estiver ocupada ruminando os dados e der uma folga nos acessos à memória, a memória principal é atualizada copiando-se nela os dados previamente escritos no cache.

Evidentemente controlar um sistema destes é muito mais complicado. E a razão é simples: o controlador de cache tem que manter um rigorosíssimo controle do que está no cache e do que está na memória RAM, pois enquanto a memória RAM não é atualizada, posições de memória de mesmo endereço no cache e na memória RAM contêm valores diferentes e não cópias do mesmo dado. É preciso então recorrer a um bit adicional no tag store, o "dirty bit" (bit sujo). Sempre que um dado é escrito apenas no cache e ainda não na memória principal, o controlador de cache faz o dirty bit correspondente assumir o valor um. Mas assim que a memória RAM é atualizada e o dado é nela copiado, o dirty bit reassume o valor zero. Assim, para saber se o mesmo endereço no cache e na memória RAM contêm dados iguais ou diferentes, basta verificar o dirty bit: se vale um, os dados são diferentes e devem ser atualizados. Se zero, são cópias idênticas, como é de se esperar em um cache honesto.

Caches do tipo write back são mais rápidos e eficientes que caches write through. Porém são mais caros (devido à lógica mais complexa de controle) e menos seguros (devido aos períodos em que os mesmos endereços de cache e memória RAM armazenam dados diferentes). Estas duas razões (mais a primeira que a última) fazem com que sejam menos comuns.

Aparentemente o fato do cache ser write back diz respeito apenas às operações de escrita e não afeta as de leitura. Mas basta pensar um pouco para perceber que isto nem sempre é verdade. De fato, durante uma operação de leitura, se ocorre um cache hit, ela é feita exatamente como descrito na semana passada e tanto faz que o cache seja write through ou write back. Mas quando ocorre um "cache miss", ou seja, quando não existe no cache uma cópia do dado contido no endereço que a CPU solicitou que fosse lido, a coisa muda de figura. Se o cache é do tipo write through, basta ler o dado na memória RAM da forma convencional (ou seja, com todos os eventuais estados de espera) e, ao mesmo tempo, copiar no data store toda a linha onde ele se situa, atualizando o tag store com o índice do bloco de onde ele foi lido (assim, caso mais tarde venha a ser solicitada a leitura de um byte vizinho, sua cópia já estará no cache). Mas se o cache é do tipo write back, a coisa complica. Porque quando ocorre um cache miss, é provável que já exista no data store uma linha que ocupa a mesma posição relativa, porém em um bloco de memória diferente. Então, antes de descartá-la, substituindo-a pela linha que está prestes a ser lida, é preciso verificar seu dirty bit. Se vale zero, há uma linha idêntica na memória RAM e a do cache pode simplesmente ser substituída pela nova. Mas se vale um, que maçada: a linha está "suja", ou seja, os dados do cache e os da linha correspondente na memória RAM são diferentes e, antes de substitui-la é preciso copiar seus dados do cache para a memória RAM - com todos os eventuais estados de espera necessários. Felizmente cache misses são raros, e cache misses em linhas "sujas" são ainda mais raros.

Assim funciona o cache do tipo "direct mapped". Que era o tipo ideal quando não havia ainda os sistemas operacionais multitarefa. Mas o que tem a ver o sistema operacional com o tipo de cache? Calma, que isto é assunto da semana que vem.

PS: amanhã, como toda segunda terça-feira de cada mês, às 19hs, mais uma reunião do Grupo de Usuários do OS/2 no RDC da PUC. Se você é usuário, compareça.

 

B. Piropo