domingo, febrero 26, 2006

Un almacén especial

Los sistemas NT como Windows 2000 o Windows XP disponen de un almacén de recursos de elementos de escritorio que en cierta medida supone una limitación del número de ventanas, menús o incluso servicios que se pueden ejecutar simultáneamente en Windows. Es lo que se conoce como desktop heap.

Dada la arquitectura y complejidad del shell de Windows, dentro de su subsistema gráfico reina una necesaria jerarquía: Existen estaciones de ventana, cada una de las cuales puede contener un cierto número de escritorios (o incluso no contener ninguno). A cada uno de estos escritorios (nótese que el concepto va más allá del espacio donde se sitúa un fondo de pantalla y unos iconos) se le asigna un montón (heap) donde almacenar cadenas, imágenes, menús, manejadores, etc. En total los montones de escritorio (desktop heaps) de un sistema Windows no pueden exceder los 48 MB.

En Windows existen las siguientes estaciones de ventana:

  • Winsta0: Es una estación de ventana interactiva, lo que quiere decir que cualquier elemento o servicio que se sitúe en ella podrá mostrar información visual y recibirla. En esta estación de ventana por defecto hay tres escritorios creados: Winlogon, encargado del inicio de sesión, Default, al que se "adhieren" por defecto todos los procesos y servicios iniciados por el usuario (los que interactúen con el escritorio) y Screen-saver, que se crea cuando el salvapantallas entra en funcionamiento.

  • Service-0x0-3e7$: Es una estación de ventana no interactiva, por lo que los procesos, servicios, etc. que se situén en ella no podrán mostrar una interfaz gráfica.

Diagrama simplificado de las estaciones de ventanas y escritorios del subsistema gráfico de Windows

Nota: Dispone de más información sobre las APIs CreateWindowStation y CreateDesktop (CreateDesktopEx) en los siguientes enlaces: CreateDesktop/CreateDesktopEx, CreateWindowStation.

Cada escritorio, según pertenezca a una estación interactiva o no interactiva tiene un tamaño máximo del heap asignado desde el Registro de Windows, concretamente en la clave HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems (valor Windows de la parte derecha):

Si modifica el segundo y el tercer parámetro de la cadena SharedSection=, el sistema podrá almacenar más recursos de escritorio en estaciones de ventana interactivas y no interactivas, respectivamente. Esto se consigue a costa de reducir el número de escritorios que se puedan generar en el sistema.

Nota: Los cambios requieren un reinicio del sistema operativo para que surtan efecto.

¿Y qué ocurre cuando se alcanza el límite del almacén? Cuando se alcanza el límite o bien le aparecerá en pantalla algún error referenciando a User32.dll (o Kernel32.dll) o bien se encontrará con un sistema gráficamente inservible. Eche un vistazo al siguiente vídeo que he realizado y que demuestra esto: Vídeo.

Nota: Si dispone de una conexión lenta a Internet quizá le venga mejor descargar el vídeo. Para ello seleccione el enlace con el botón derecho del ratón y pulse sobre Guardar destino como (Internet Explorer).

En el vídeo se ve que voy abriendo intempestivamente instancias de Internet Explorer. El sistema con pocas ventanas se comporta adecuadamente (vea que puedo acceder al menú contextual sin problemas), pero cuando llego a abrir 56 ventanas observará que no puedo abrir ninguna más, que los menús contextuales de la barra de tareas no llegan siquiera a mostrarse y que la última ventana sólo muestra el icono estándar de Internet Explorer, los menús no se muestran . Hemos llegado a un punto en el que la interfaz gráfica de Windows ha quedado "inutilizada" por alcanzar el máximo del almacén de recursos del escritorio.

Nota: Los sistemas de 64 bits como XP Professional x64 disponen de un tamaño de desktop heap bastante elevado, por lo que no existe el riesgo de agotarlo. Además, la clave de Registro mencionada anteriormente no es tenida en cuenta si en el fichero Boot.ini existe el parámetro /3GB.

3 comentarios:

Anónimo dijo...

Muy buen artículo. :-) Me he topado alguna vez con esto. Al menos la limitación se puede superar ajustando unos parámetros, no como el límite de recursos en los Windows 9x, que es fijo e inamovible. ;-)

En la KB de MS aparecen algunos artículos relacionados especialmente con este asunto:

126962 "Out of Memory" Error Message Appears When You Have a Large Number of Programs Running

142676 Overcoming User32.dll Initialization Failure Errors

184802 PRB: User32.dll or Kernel32.dll fails to initialize

824422 Unexpected behavior occurs when you run many processes on a computer that is running SQL Server

Anónimo dijo...

Esta muy interesante.... Una pregunta: a que valores se recomendaria cambiar esos parametros?

Anónimo dijo...

Gracias por estar ahi.
Explico la situacion: inicio,normal pero al minimizar, las ventanas no quedan retenidas en la barra, quedando los programas en ejecución. Al cerrar el mensaje es el siguiente.
dwwwin.exe-Error de inicialización de DLL
la aplicacion ha fallado al inicializarse debido a que la estación de ventana ha cerrado. ¿¿¿