Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
09/06/2008

< Vista: o SuperFetch >


Na coluna anterior tivemos uma visão geral dos três “aceleradores” de Windows Vista e discutimos com algum detalhe um deles, o “ReadyDrive”. Hoje examinaremos os outros dois, “SuperFetch” e “ReadyBoost”.

Começando com o que diz o sítio do Windows Vista da MS sobre o SuperFetch. Trata-se de uma explicação para leigos, portanto bastante sucinta, que pode ser encontrada em
< http://www.microsoft.com/windows/products/windowsvista/features/details/superfetch.mspx >
“Learn about the features – SuperFetch”. Aqui vai um resumo dela em uma tradução livre:

“Windows SuperFetch permite que programas e arquivos sejam carregados muito mais rapidamente do que seriam em máquinas com Windows XP.

“Há tarefas, como programas de cópia de segurança automática e varredura em busca de vírus, que rodam em segundo plano, quando você não está usando ativamente o computador e perturbam menos seu trabalho. Estas tarefas consomem memória do sistema e podem usar o espaço utilizado pelos programas que estavam sendo executados. Isto torna o desempenho muito mais lento quando você tenta retomar seu trabalho.

“SuperFetch monitora que aplicativos são mais usados por você e os carrega previamente na memória de tal maneira que eles já estejam disponíveis quando você os solicitar. Além disso, os programas que Vista executa em segundo plano, como desfragmentadores de disco e Windows Defender, rodam no modo de baixa prioridade, de tal forma que seu trabalho sempre recebe atenção primeiro”.

Isto dá uma idéia bastante razoável do que faz o SuperFetch: funciona como uma espécie de “cache proativo”. Não entendeu? Então tentemos destrinchar.

Se você está lendo esta série de colunas, provavelmente tem uma boa noção do que vem a ser “cache” e como ele funciona, portanto não caberia aqui detalhar o assunto. Mas refrescar a (nossa) memória não custa nada. Então vamos lá.

Há memórias e memórias (e quem duvida sugiro uma leitura na série de colunas sobre memórias aqui mesmo no FPCs ou na seção “Coluna em ForumPCs” da página < http://www.bpiropo.com.br/escritos.htm > “Escritos” do Sítio do Piropo, onde elas se encontram em ordem cronológica, começando em Computadores XXXI: A lenda da Gralha Azul publicada em 16/04/2007 e terminando em Computadores XLIII: Localizando a MP, publicada em 08/10/2007). E as mais importantes distinções entre elas são a rapidez de acesso, a capacidade de armazenamento e o custo.

Infelizmente essas três características se combinam de forma bastante desfavorável para nós, usuários. Pois ocorre que, generalizando conceitos, memórias rápidas são caras e de pequena capacidade, memórias baratas são lentas e de pequena capacidade e memórias de grande capacidade são caras e lentas. Então, para obter um desempenho decente, há que combinar diferentes tipos de memórias. O que levou ao conceito de cache.

A idéia é simples: interpor entre uma memória relativamente lenta (por exemplo, memória RAM) e quem a acessa (por exemplo, a UCP) um pequeno trecho de memória (ou “cache”) muito mais rápida que a primeira, onde se copiam os conteúdos de algumas posições da memória mais lenta na esperança que os acessos seguintes venham a ser feitos justamente nestas posições. Se forem, há um “acerto no cache” (“cache hit”) e o conteúdo da posição de memória é lido rapidamente, já que a leitura é feita diretamente da cópia no cache. Já se os futuros acessos vierem a ser feitos a posições de memória cujos conteúdos não estão copiados no cache, há uma “falha de cache” (“cache miss”) e perde-se algum tempo fazendo o acesso diretamente à memória mais lenta e, de lambuja, copiando no cache o conteúdo daquela posição e de suas vizinhas.

Embora a capacidade do cache seja, em geral, mais de mil vezes menor que a da memória RAM, por incrível que pareça a coisa funciona: em média mais de 98% dos acessos à memória são “acertos no cache”. Como isso é possível discutiremos algum dia, quando eu der continuidade à série de colunas “Computadores”, que foi interrompida justamente quando eu estava a ponto de abordar o cache. Mas a teoria do cache se apóia em dois princípios básicos denominados “diferença de rapidez” e “localidade” e em uma combinação inteligente de algoritmos que escolhe quais trechos da memória principal serão copiados no cache visando aumentar a probabilidade de “acertos” e reduzir a de “falhas”.

Note que não é apenas a memória principal que é passível de ser copiada em cache. Pelo contrário: qualquer memória lenta que forneça dados a um “freguês” mais rápido pode melhorar significativamente o desempenho com a interposição de uma memória cache entre ambos. Um bom exemplo é o “cache de disco”, trechos de memória volátil (e, ultimamente, até mesmo de não volátil, como nos discos híbridos mencionados na coluna anterior) acrescentados à controladora do disco, onde são copiados os setores que têm maior probabilidade de serem solicitados baseados nos últimos setores acessados.

Em suma: memória cache é um trecho de memória rápida onde se copia seletivamente trechos de memória mais lenta na esperança que os próximos acessos sejam feitos às posições de memória copiadas no cache.

Eu disse que não dá para explicar os critérios usados pelo sistema para escolher os trechos de memória a serem copiados no cache mas, dois parágrafos acima, mencionei que no cache de disco a cópia é feita “baseada nos últimos setores acessados”. No cache de memória não é muito diferente: a escolha é feita nas últimas posições de memória que foram acessadas. Ou seja: o funcionamento do cache é um mecanismo tipicamente reativo: dependendo do que ocorreu recentemente, o sistema reage copiando no cache isto ou aquilo.

Quem leu a coluna “Vista: Para que tanta memória RAM?” há de lembrar-se da funcionalidade (erroneamente) denominada “cache na RAM” que consiste, meramente, em “lembrar” que trecho da RAM está ocupado pelo código de um programa recentemente encerrado e “apontar” diretamente para ele caso a recarga do programa seja solicitada imediatamente após encerrá-lo (o efeito é semelhante ao do cache porque evita que todo o código do programa seja lido novamente na lenta memória secundária – geralmente disco rígido – mas se você comparar esta funcionalidade com a de um “cache” de verdade verá que, embora parecidas, são coisas diferentes). E talvez lembre também da funcionalidade acrescentada ao Windows XP denominada “prefetch”. Se não lembra, sugiro uma consulta à coluna. Mas, para facilitar, aqui vai um resumo dela: registrar em um pequeno banco de dados interno os programas que Windows carrega na memória durante a partida do sistema visando reduzir o tempo de inicialização do sistema carregando antecipadamente na memória o código dos programas previamente registrados. Uma boa idéia, porém com um defeito: como o “prefetch” não analisa as mudanças que ocorrem ao longo do tempo, na medida que mudam os hábitos dos usuários e os programas carregados durante a inicialização, a lista de programas registrados cresce indefinidamente, se sobrecarrega e acaba por atrasar a carga do sistema ao invés de adiantá-la.

Pois bem: o SuperFetch é um “prefetch” aperfeiçoado, que funciona como um cache proativo (ou seja, que em vez de reagir às ações dos usuários, se antecipa a elas prevendo que programas serão solicitados e carregando-os antecipadamente na memória). Destrinchemos.

Nos idos dos anos oitenta do século passado, discos rígidos eram caros. Mas memória RAM era muito, mas muito mais cara. Para quem se acostumou a pagar perto de cinqüenta reais por GB de memória RAM, como hoje em dia, o espaço de memória em RAM era inacreditavelmente mais caro que em disco rígido. E, mais ou menos na metade daquela década, quando graças aos velhos chips que precederam ao Pentium, sistemas multitarefa chegaram ao alcance do bolso de gente comum, a necessidade de aumentar a capacidade instalada de memória primária tornou-se crucial. Como rodar tantos programas ao mesmo tempo se não havia RAM?

A solução, nascida (na linha PC) com o i286, foi a chamada “memória virtual”. Para mitigar a sede de memória primária dos sistemas multitarefa que freqüentemente solicitavam mais memória do que a máquina tinha a oferecer, o sistema operacional podia usar algoritmos de gerenciamento de memória que “abriam espaço” na memória primária copiando trechos inteiros de memória RAM em um arquivo no disco rígido denominado “arquivo de troca” (“swap file”, modernamente conhecido como “page file”). O problema é que os trechos que iam para o disco rígido “pertenciam” a programas que, embora não os estivessem acessando quando foram movidos, cedo ou tarde precisariam deles. E, quando isso ocorria, havia que abrir novos espaços na memória para continuar “trocando” (por isso o nome de “arquivo de troca”) o que lá estava pelos trechos copiados em discos (modernamente esta troca é feita em trechos de 4 KB denominados “páginas”, por isso o nome alternativo de “page file” para o arquivo de troca).

O gerenciamento de memória na linha PC nestes últimos vinte e poucos anos tem se baseado neste alvitre (denominado “memória virtual”) de aumentar artificialmente a capacidade da memória primária, ou RAM, estendendo-a virtualmente para um arquivo na memória secundária (disco rígido) e trocando o conteúdo de uma com o outro sempre que programas exigiam seu código onde ele efetivamente deveria estar: na memória RAM.

Tudo vinha funcionando razoavelmente bem, exceto por um detalhe: discos rígidos (ou memória magnética) são mais lentos que memória RAM (ou de semicondutores). Na verdade “mais lentos” é pouco. São cerca de mil vezes mais lentos. E, em sistemas com pouca memória primária instalada, onde o trânsito de “páginas” entre memória RAM e disco rígido é intenso, a impressão do usuário é que quando isto ocorria (e ocorria freqüentemente), a máquina passava a funcionar em câmara lenta.

Mas, felizmente, os tempos mudaram. E os preços caíram. Tanto os da memória secundária quanto os da primária. Mas estes últimos caíram muito mais depressa. O resultado é que, freqüentemente, as máquinas modernas dispõem de muito mais memória RAM do que realmente necessitam. Afinal, o ganho em desempenho instalando memória primária adicional é tão grande e os custos caíram tanto que poucas providências apresentam uma relação custo/benefício tão favorável quando instalar um ou dois módulos adicionais de memória RAM.

Tornar a memória RAM mais barata tem duplo efeito: aumenta a facilidade de comprá-la e conduz os desenvolvedores a fazer dela um uso mais liberal. E, quanto mais memória se instala, de mais memória se precisa.

Mas, ao fim e ao cabo, o que importa é o desempenho do sistema. Portanto por que não aproveitar a tendência das novas máquinas de dispor de uma capacidade relativamente grande de memória RAM instalada para acelerar o sistema?

Pois, apesar das reclamações pungentes de alguns leitores cuja maioria (dos que reclamam) provavelmente desconhece o que realmente ocorre, foi exatamente isso que fez Windows Vista com seu SuperFetch.

 Para entender como, aqui vai uma tradução livre de um trecho do documento
< http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/perfaccel.doc >
“Windows PC Accelerators” da MS.

“Memórias maiores e mais baratas e programas mais exigentes resultaram em capacidades de memória grandemente aumentadas nos PCs de hoje. Embora ainda seja possível usar toda a memória física nos PCs de hoje, o mais comum é dispor de uma quantidade significativa de memória não usada. O desafio para Windows Vista foi como ser mais eficiente e proativo no que diz respeito a gerenciamento de memória.

“SuperFetch usa um algoritmo leve e sofisticado para acompanhar que páginas (de memória) cada usuário acessa com maior freqüência. Na medida que o usuário desempenha suas atividades diárias, SuperFetch constrói um histórico das informações que têm maior probabilidade de serem necessárias. Para montar uma lista de páginas eficiente, SuperFetch acompanha diversos aspectos das sessões de uso da máquina, incluindo – mas não limitada a – lista de aplicativos usados em primeiro plano, horários e dias da semana em que são costumeiramente invocados e até mesmo os horários em que o usuário não está trabalhando com a máquina.

“Quando o PC não ocupa toda a memória, SuperFetch traz as páginas de uso mais provável para um trecho da memória principal usado como cache, de tal forma que Windows Vista possa movê-las diretamente para a arena de trabalho sem a necessidade de “puxá-las” do disco. Isto provê o dado quando o usuário necessita dele, tornando o PC mais hábil a reagir imediatamente, eliminando o atraso causado por acessos ocasionais a disco”.

[No original: Cheaper memory and larger, more demanding programs have resulted in greatly increased amounts of physical memory in current PCs. Although it is still possible to use all the physical memory in current PCs, it is more common to have a significant amount of memory that is unused. The challenge for Windows Vista became how to be more proactive and efficient about memory management.

SuperFetch uses a lightweight, sophisticated tracking algorithm to determine which pages a user uses most frequently. As a user goes about her daily activities, SuperFetch builds a history of what information is most likely to be needed. To build an effective page list, SuperFetch tracks several aspects of the user’s computing session including but not limited to foreground application, time of day, day of the week, and even whether the user is currently using the PC.

When the PC has free physical memory, SuperFetch places candidate pages into the physical memory cache so Windows Vista can move them directly into the working set instead of pulling them from disk. This provides data when the user needs it, makes the PC more responsive, and eliminates delays caused by random disk I/O].

Para exemplificar, o documento cita um cenário hipotético – mas recorrente – no qual um usuário interrompe o uso do PC para almoçar habitualmente no mesmo horário e retorna após um intervalo sempre igual (ou quase). Quando Vista “percebe” que a máquina tornou-se ociosa no horário de sempre, começa imediatamente a rodar prioritariamente tarefas de manutenção que rotineiramente são executadas em segundo plano (como desfragmentação de disco, cópia de segurança, varredura de vírus e mais umas tantas outras que Vista permite automatizar), se necessário movendo para o disco as páginas referentes aos aplicativos que o usuário estava usando. Windows XP também é capaz de fazer algo parecido, mas como não tem noção da importância relativa dos programas ou dos horários em que são normalmente usados, depois de transferidas, deixa que permaneçam em disco as páginas de memória correspondente aos aplicativos com os quais o usuário estava trabalhando antes do almoço. Isto força uma espera considerável quando ele retoma o trabalho, já que somente então as páginas de seus aplicativos retornarão do disco. Já o SuperFetch do Vista, por conhecer as rotinas de comportamento do usuário, “sabe” quando ele costuma retomar o trabalho e traz antecipadamente as páginas do aplicativo de volta para a memória RAM.

Figura 1: Uso da memória sob Vista.

Veja, na Figura 1, como a coisa funciona. Com indica o “Tempo de Atividade” do grupo “Sistema” esta máquina que vos fala está em uso há quase dez horas (o que quer dizer que estou trabalhando demais). Ela tem instalados 4 GB de RAM dos quais o sistema só “enxerga” 3,24 GB (3324 MB correspondem a 3,25 GB porque 1 GB = 1024 MB) como mostrado em “Total” do grupo “Memória Física” (se não sabe o porquê da discrepância leia a coluna “Vista: por que Vista32 não “enxerga” 4 GB?”). Os aplicativos carregados na memória ocupam apenas 1,09 GB como mostra a seta vermelha apontada para o gráfico. No entanto, a quantidade de memória “Livre” assinalada é de apenas 35 MB quando, em tese, deveria passar de 2 GB.

O que está ocupando tanta memória? As páginas carregadas em RAM correspondentes aos aplicativos que o sistema espera que eu venha a precisar mais adiante.

É evidente que, caso eu decida fugir a meus hábitos e pretenda carregar um programa que uso raramente, seu código executável terá que ser carregado do disco. Mas, além da natural demora da leitura em disco, o sistema não perde um único nanossegundo com isto: basta copiá-las “por cima” dos trechos de RAM ocupados pelas páginas que estavam em cache.

O que eu tenho percebido dos comentários às colunas anteriores é que alguns usuários instalam Vista em uma máquina com, digamos, 3 GB de memória RAM, usam o sistema por algumas horas e, por curiosidade, vão verificar quanto de sua preciosa memória permanece livre. Abrem o Gerenciador de tarefas, consultam a aba “Desempenho” e ficam horrorizados ao constatar que “sobram” apenas poucas dezenas de MB. E, sem fazer a menor idéia em que “tanta memória” está sendo usada, ensaiam um triste coro de protestos alegando que Vista é um voraz consumidor de RAM.

Por outro lado, como não deram tempo para que o algoritmo do SuperFetch analise seus hábitos de uso, não percebem qualquer melhoria no desempenho do sistema (leve em conta que um sistema que baseia sua análise de utilização de memória em um modelo que toma em consideração os horários e os dias da semana precisa de algum tempo para estabelecer um padrão minimamente confiável de uso da máquina). E, por absoluta falta de informação, reclamam em altos brados e abandonam o sistema.

Quem sabe agora esses usuários desavisados passem a ter um pouco mais de paciência e comecem a encarar o “uso exagerado” de memória com outros olhos? Afinal, ocupar toda a memória RAM com código que talvez venha a ser solicitado no futuro não causa qualquer prejuízo (a máquina não gasta mais tempo com isto, já que o SuperFetch trabalha sempre em segundo plano e com baixa prioridade, e ocupar ou não trechos de RAM não implica maior ou menor consumo de energia). E, se fizer alguma diferença, será positiva: reduzir o tempo de carga dos programas habituais.

Quem reclama disso, francamente, ou é por ignorância (sem ofensa: “ignorância”, neste contexto, tem a acepção de “desconhecimento”) ou por má fé.

Como se vê a diferença entre o SuperFetch de Vista e o “prefetch” do XP é brutal. Enquanto este último cria uma lista de programas em espera (“Standby List”) baseada apenas na utilização de programas no passado recente cuja prioridade de execução se baseia nesta mesma utilização, SuperFetch otimiza sua lista ao longo do tempo levando em conta a freqüência com que as páginas são usadas, o contexto das demais páginas carregadas na memória e consegue se adaptar a padrões de uso, incluindo cenários complexos. Ou seja: enquanto o “prefetch” se baseia na utilização pretérita, o Superfetch consegue “prever” a utilização futura e trazer para a memória o programa que o usuário irá necessitar antes mesmo que ele venha a invocá-lo.

Deu para entender agora o sentido do termo “proativo”? Deu para perceber por que Vista, aparentemente, ocupa sempre mais memória do que precisa? Deu para compreender porque em Vista “o disco rígido não pára” mesmo quando a máquina parece não estar em uso?

Pois bem: na próxima coluna veremos como o terceiro acelerador, o ReadyBoost, coopera com o SuperFetch para acelerar ainda mais o desempenho do sistema.

 

B. Piropo