¿Cómo funciona la cache de iconos en Windows Vista?

Nota: Los detalles de implementación podrían variar completamente en una siguiente versión de Windows, o incluso en un próximo Service Pack. Por lo tanto, nunca base sus desarrollos en aspectos concretos de implementación. Este artículo pretende ser únicamente informativo.

En computación, el término cache se refiere a una forma de almacenamiento de muy rápido acceso pero pequeña capacidad que sirve para reducir drásticamente el tiempo de acceso a datos que están próximos en ubicación o en tiempo. Este artículo trata sobre una importante cache presente en Windows desde hace ya bastantes años, pero que no ha parado de mejorar: la cache de iconos.

En Windows Vista la cache de iconos está implementada en memoria principal y en disco, la mayoría de sus funciones residen en la DLL Shell32.dll y básicamente consta de un conjunto de listas de imágenes y varias tablas utilizadas para reducir al máximo el tiempo de búsqueda del icono correspondiente.´

Las búsquedas internamente se pueden realizar por nombre de fichero o por una cadena cualquiera, por lo que se mantienen sendas tablas en memoria. Una tercera tabla sirve como “manual” para que el shell sepa exactamente cómo extraer el correspondiente icono. Por ejemplo, una entrada de dicha tabla podría ser similar a esto:

3 Programa.exe 2

Es decir, la entrada número 3 de la tabla dice que el imagen proviene del ejecutable “Programa.exe” y concretamente es el icono de índice número 2 (consulte la documentación de la API ExtractIcon y similares para más información). Si, por ejemplo, el shell necesitara un icono para el acceso directo en el escritorio que el usuario ha hecho para “Programa.exe”, lo que hará en primer lugar es generar un hash del fichero para comprobar si tiene alguna correspondencia en la primera tabla, con el mismo contenido y tamaño (de ahí la necesidad del hash). Si es así, la primera tabla le dirá exactamente en qué entrada de la tercera tabla está la información correspondiente (recuerde que las entradas de la tercera tabla almacenan la representación propiamente dicha). En este caso le dirá que es la entrada 3 y el sistema no habrá visto penalizado su rendimiento porque no ha tenido que acceder al disco a por el icono. ¿Qué ocurre cuando el icono no está en la cache? Cuando un icono no está en cache, la función de dispersión acabará por determinar que el elemento a buscar no está en ninguna de las dos tablas, ni la indizada por nombre de fichero ni la indizada por cadenas. En este caso, no queda otra opción que acceder al disco para extraer el icono correspondiente (nótese que esto es similar a lo que ocurre cuando el procesador tiene que acceder a memoria a por una instrucción porque ésta no se encuentra en su primer nivel de cache). El shell crea una nueva entrada en la tercera tabla:

4 Programa_nuevo.exe 3

y crea las correspondientes entradas en las dos primeras tablas para poder acceder rápidamente. Para terminar, con una llamada a la API GetIconInfoEx de User32.dll se obtiene la información correspondiente al mapa de bits del icono y se almacena en la cache.

Como toda cache, la cache de iconos tiene su propia política de reemplazamiento; es decir, en el caso de que esté llena y haya que introducir un nuevo elemento, ¿cuál reemplazamos? La política típica en las caches es la LRU (Least Recently Used, es decir, se reemplaza el que más tiempo hace que ha sido accedido); la cache de iconos del shell no iba a ser menos y sigue más o menos la misma política, se reemplaza el icono que más tiempo ha tardado en ser accedido.

La cache de iconos tiene apoyo en el disco

La cache de iconos reside en todo momento en memoria principal, pero en ciertas circunstancias es necesario que se almacene en el disco, para preservar su contenido cuando el usuario apague el sistema. Cuando el usuario se dispone a apagar o reiniciar su equipo, el sistema observa si la cache ha experimentado cambios desde la última vez que se trajo del disco a memoria. Se dice que una cache está “sucia” si ha ocurrido esto. En ese caso, el sistema guardará una copia de la cache en disco, en el fichero de sistema IconCache.db del directorio %USERPROFILE%\AppData\Local\. El sistema genera el tamaño final de este fichero desde un principio para evitar la fragmentación del disco.

En una fase de la inicialización de Explorer.exe (tema que se tratará en detalle en un próximo artículo), se determina si la cache de iconos almacenada en disco tiene el tamaño y profundidad de color apropiados según la configuración actual; si es así, se copiará su contenido a memoria principal y permanecerá allí hasta el próximo apagado o reinicio.

Algunas preguntas frecuentes sobre la cache de iconos:

¿Se puede ampliar el tamaño de la cache de iconos?

Es posible ampliar el tamaño de la cache de iconos, tanto en XP como en Vista, modificando la clave de Registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current Version\Explorer, valor Max Cached Icons. Si este valor no existe, el shell tomará por defecto un valor de 500. Si usa la versión de depuración de XP/Vista (versión checked), este valor es menor (200) para poder experimentar más fácilmente con el llenado de la cache de iconos.

¿Cómo se refresca la cache de iconos en Windows Vista?

Un método sencillo de refrescar la cache de iconos en Windows Vista es cambiar momentáneamente la profundidad de color de 32 bits a 16 bits, por ejemplo. Tenga en cuenta que si tiene activada la composición de escritorio, momentáneamente se desactivará hasta que revierta la profundidad de color a 32 bits. Esto es por diseño. Eche un vistazo a este artículo para más información: http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/aero_rules.doc.

2 thoughts on “¿Cómo funciona la cache de iconos en Windows Vista?

  1. En win Xp siempre me funciono perfecto, llegando a tener un IconCache.db de 45MB.
    El problema es con windows 7 no funciona esta clave de registro.
    Probe diferentes valores 2000 4000 8000 y no hay cambios.
    Incluso los iconos en menu de incio tardan es cargar.

    Alguna solucion para win7?

Leave a Reply

Your email address will not be published. Required fields are marked *