July 2008 - Posts

Una de las novedades de Windows Vista y Windows Server 2008 es la posibilidad de reducir y ampliar el tamaño de un volumen sin perder ningún dato. Hasta ahora, esto solo era posible utilizando aplicaciones de terceros. Al abrir el nuevo Administrador de discos de Windows Vista, seleccionar un volumen con el botón derecho y hacer clic sobre Reducir volumen, nos aparece este cuadro de diálogo:

Cuadro de diálogo para reducir un volumen

Una de las consultas más frecuentes es por qué el tamaño máximo que se puede reducir es, en el caso de la figura, de 9.048 MB, si el volumen es posible que disponga de mucho más espacio libre.

A la hora de computar el tamaño máximo que se puede reducir en un volumen, se tienen en cuenta tres aspectos:

  1. El espacio libre en el volumen.
  2. El espacio dedicado a las copias sombra (puntos de restauración).
  3. La posición de ciertos archivos que no se pueden mover (como el archivo de paginación).

El tamaño máximo que se puede reducir será el mínimo entre el espacio libre en el volumen y el máximo de espacio que se podría reducir teniendo en cuenta estos dos aspectos: las copias sombra (puntos de restauración) y la posición más desplazada de un archivo que no se pueda mover. Al tamaño total se le suele añadir un cierto número de MB para dar un margen de espacio tras la reducción.

Para Administrador de discos, los ficheros que no se pueden mover son los siguientes: Pagefile.sys (el archivo de paginación), Hiberfil.sys (el fichero de hibernación), Crashdmp.sys y los ficheros internos NTFS $bitmap, $mftmirr, $secure, $usnjrnl y $logfile. Por tanto, si alguno de esos ficheros se sitúa en una posición casi al final del volumen, el tamaño para reducir será muy pequeño. Vea este ejemplo:

Diagrama de un volumen con poco espacio para reducir

Como observa en el diagrama, el disco tiene 25 GB ocupados, por lo que el espacio libre en disco son 95 GB. Sin embargo, dado que el fichero Pagefile.sys se sitúa casi al final del volumen, el espacio máximo disponible para reducir será de solo 9 GB.

Puede ver gráficamente la disposición de los clústers usando alguna herramienta de desfragmentación de terceros, como Diskeeper o similares.

Posted by dmartin | 14 comment(s)
Filed under:

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.

Posted by dmartin | with no comments
Filed under:

Bienvenid@s a mi nuevo blog. Trataré en él los temas más interesantes que me vaya encontrando en foros y grupos de noticias, y también en mi uso cotidiano de Windows. Puede echar un vistazo a mi anterior blog en la dirección http://rinconwindows.blogspot.com.

Espero que les guste.

Posted by dmartin | 2 comment(s)