Reducir la memoria del runtime en Windows 8

Ciertos aspectos fundamentales, como el uso de la memoria, son claves en el diseño de Windows 8. En el desarrollo de Windows 8 hemos reducido notablemente la memoria necesaria para el conjunto del runtime del núcleo del sistema. Siempre es bueno para todos y especialmente en un mundo en el que la gente quiere ejecutar más y más aplicaciones al mismo tiempo o hacerlas funcionar en sistemas con tan solo 1 ó 2 Gb de memoria. El portátil del que hablamos en este artículo es exactamente el mismo que mencionábamos en la Windows 7 PDC de 2008 –un netbook pelado, de primera generación con procesador Intel ATOM y 1 GB de memoria. En este artículo explicamos nuestros esfuerzos por reducir el consumo de memoria y ha sido redactado por Bill Karagounis, el program manager de nuestro grupo de Performance.

--Steven

El consumo de memoria del runtime en Windows 8 es un factor importante a la hora de definir los requisitos del sistema operativo y del enorme abanico de dispositivos que van a poder ejecutar Windows 8. Como sabes, estamos trabajando para incorporar toda la experiencia completa de Windows 8 en dispositivos basados en la tecnología SoC (“System on a Chip”) que se caracterizan por su bajo consumo eléctrico. Esto hace que sea aún más importante reservar cuanta más memoria mejor para múltiples aplicaciones concurrentes y para mantener la capacidad de respuesta general de los dispositivos.

Lo que no es tan evidente es que al reducir el consumo de memoria en plataformas de bajo consumo, la batería dure más tiempo. ¿Ah, si? En cualquier PC, la RAM consume electricidad de forma permanente. Si un S.O. utiliza mucha memoria, obliga a los fabricantes a incorporar más memoria RAM física. Cuanta más memoria RAM instalemos en la placa base, mayor será el consumo, y menos durará la batería. Tener más memoria RAM en un Tablet PC puede, en ciertos casos, recortar en varios días el tiempo que la propia tableta puede mantenerse en tu mesita de café aparentemente apagada, pero en realidad vivita y coleando.

Los objetivos del uso de memoria

Nuestro objetivo con Windows 8 desde el primer momento fue mantener los mismos requisitos del sistema que con Windows 7. Sabemos que podremos ir más lejos todavía si conseguimos liberar más recursos para las aplicaciones aun manteniendo sin cambios los requisitos publicados. Resulta divertido pensar en qué consistía un hardware de “gama baja” en 2009 y cómo ahora ni siquiera podemos encontrar módulos de 256 Mb de memoria en ningún sitio. Queríamos asegurarnos de que la gente que tiene hardware de los tiempos de Windows 7 podría actualizar sin dificultad estas máquinas a Windows 8 y aprovechar plenamente la funcionalidad que les ofrece. Además esperamos que muchas máquinas que han funcionado con Windows 7 sigan haciéndolo con Windows 8, basándonos en las experiencias obtenidas con otras máquinas viejas que, de manera intencionada, hemos mantenido en nuestra infraestructura de pruebas de rendimiento.

Una tarea importante a resolver con Windows 8 era hacer sitio para nuevas funcionalidades sin perder ocasión para reducir la memoria que consumen las funcionalidades actuales y el sistema en general. Windows 8 parece ir por el buen camino en el objetivo que nos hemos marcado.

Comparación de uso de memoria en el Administrador de Tareas

La manera más sencilla de tener una comparación del uso de memoria entre Windows 7 y Windows 8 y que nos pueda servir de referencia es instalar ambos sistemas operativos en una máquina con 1Gb de RAM (el mínimo exigido por el S.O.) y compararlos después de unos cuantos reinicios y al cabo de un tiempo de inactividad.

El Administrador de Tareas de Windows nos aporta la vista principal de la memoria del sistema por medio de su estadística “En uso” (descrita en detalle en este documento). En el gráfico siguiente se compara el consumo de memoria en el notebook de Steven, que tiene 3 años de antigüedad y que ha utilizado hace poco para las sesiones de la conferencia BUILD, con Windows 7 en estado de reposo, y después, en la misma máquina, con Windows 8.

Windows 7 Task Manager. CPU usage: 5%, Memory: 404 MB

Figura 1 – Uso de memoria con Windows 7 SP1

Windows 8 Task Manager. CPU usage: 1%, Memory: 281 MB

Figura 2 – Uso de memoria con Windows 8

Los componentes concretos de hardware de cada máquina, el uso de memoria por parte de los drivers, e incluso el tiempo de actividad pueden dar lugar a una gran variación en estos datos, así que los resultados de consumo de memoria pueden diferir entre máquinas distintas (e incluso en la misma máquina en momentos diferentes). De todas formas, vemos aquí que Windows 8 se maneja bien en comparación con Windows 7.

Podemos divertirnos un poco más en una máquina de pruebas si vamos al administrador de dispositivos y desactivamos el adaptador de pantalla (desactivar el driver de gráficos). Nunca utilizaríamos una máquina en estas condiciones, pero así conseguimos una aproximación aún más precisa al uso de memoria del sistema Windows puro. Al desactivar el driver de gráficos, la máquina reduce la memoria ocupada por debajo de los 200 Mb al cabo de un rato de inactividad.

NOTA: en el caso de Windows 8, una instalación limpia contiene también la tecnología extendida de Windows Defender, que por primera vez integra toda la funcionalidad antimalware completa, y está también optimizado para un uso eficiente de la memoria y los recursos de hardware, como podéis leer en el blog de Jason sobre protección del sistema frente al malware. (Esta funcionalidad no viene con las instalaciones limpias de Windows 7, en las que nos recomienda que instalemos un software de seguridad).

Haciendo hueco en Windows 8

Hemos hecho cientos de cambios para reducir el consumo de memoria del S.O. en Windows 8. Voy a mencionar algunas de las áreas concretas en donde los ahorros de memoria han sido más notables.

Combinación de memoria

A la hora de evaluar los contenidos de la memoria RAM en un PC normal en ejecución, vemos que muchas partes de la memoria tienen el mismo contenido. Las copias redundantes de datos en la RAM del sistema suponen una buena oportunidad par reducir el consumo, incluso en el caso de los servicios y componentes del S.O.

¿Y cómo puede ser que ocurra esto? A veces las aplicaciones reservan memoria para usos futuros y la inicializan toda ella con el mismo valor. La aplicación puede que nunca llegue a utilizar la memoria, puesto que se ha reservado como anticipo de una funcionalidad que posiblemente el usuario nunca utilice. Si hay varias aplicaciones ejecutándose haciendo esto a la vez, tenemos copias redundantes en la memoria del sistema.

La combinación de memoria es una técnica mediante la cual Windows evalúa de manera más eficiente el contenido de la RAM del sistema durante el periodo de actividad normal y detecta contenidos duplicados. Windows libera los duplicados y mantiene una sola copia. Si la aplicación intenta escribir en el futuro en la memoria, Windows le asigna una copia privada. Todo esto sucede en la trastienda, lo hace el gestor de memoria, sin afectar a las aplicaciones. Con esta técnica liberamos decenas y cientos de megas de memoria (dependiendo de cuántas aplicaciones se ejecutan de forma concurrente).

Cambios y recortes en los servicios

Los servicios del S.O. configurados para ejecutarse todo el tiempo son grandes consumidores de memoria. Cuando, durante la planificación de Windows 8, empezamos a evaluar el conjunto de servicios del S.O., decidimos eliminar una serie de ellos (hasta 13), pasar otra parte de los servicios a inicio “manual” y dejar otra parte de los servicios de “ejecución permanente” dentro de un modelo de “inicio bajo demanda”. En este caso, cuando se activa un “trigger” del S.O. (por ejemplo la inserción de un dispositivo o la disponibilidad de una dirección de red), se producen las acciones siguientes:

  1. Arranca el servicio.
  2. El servicio hace lo que tenga que hacer (la actividad que le corresponda)
  3. Se queda colgado un tiempo para asegurarse de que no tiene nada más que hacer y
  4. El servicio se detiene.

Seguramente has caído en la cuenta de que Plug and Play, Windows Update y el servicio de marco de controladores en modo usuario son servicios que se arrancan bajo demanda en Windows 8, en contraste con lo que suceden en Windows 7, donde estos servicios están permanentemente activos.

Por supuesto, hemos añadido un montón de nuevas funcionalidades (y código nuevo) a Windows 8. Algunas de estas nuevas funciones vienen en la forma de nuevos servicios. De estos nuevos servicios, dos son de arranque automático. Los demás son o bien manuales o de arranque bajo demanda.

Hacer lo mismo con menos memoria

Cuando Windows ejecuta las aplicaciones y sus propios procesos internos del sistema, los archivos de programa y datos se cargan desde el disco a la memoria principal. Durante el desarrollo de Windows 7 y en lo que llevamos de Windows 8, hemos ido analizando los trozos (páginas) de memoria durante una ejecución normal y la frecuencia con que se referencian. La idea aquí es que si vamos a pagar un cierto precio por asignar una parte de la memoria, lo mejor sería que el número de veces que se referencia sea elevado. Si no accedemos a esa porción de la memoria con frecuencia pero la necesitamos, una buena solución sería consolidarla con algo más.

Al poco de publicar Windows 7, empezamos a aplicar una técnica parecida a algunos de los componentes de bajo nivel de Windows que se remontaban a los primeros tiempos de NT (allá por los primeros años 90). El trabajo supuso un rediseño completo del código y cambiar las estructuras de datos para independizar totalmente ciertas partes “calientes” de la memoria (las que se referencian frecuentemente) de las partes “frías”. Al consolidar densamente los fragmentos calientes, conseguimos reducir sensiblemente el consumo de memoria global del runtime.

Dada la naturaleza de los cambios (los componentes de bajo nivel del S.O.), queríamos terminar la tarea lo antes posible para disponer de tiempo suficiente para ponerlos a prueba. A día de hoy estos cambios llevan ya funcionando en Windows 8 casi dos años, y miles de empleados de Microsoft utilizan el producto para sus actividades cotidianas. Hemos obtenido resultados consistentes que demuestran una reducción en el uso de memoria de decenas de megabytes en máquinas normales.

Inicialización “perezosa” del escritorio

El pasado mes de junio, vimos a Steven y Julie presentar la interfaz de usuario Metro por vez primera. Esperábamos ver a mucha gente con tablets dedicar un buen rato a utilizar este entorno, básicamente con aplicaciones estilo Metro. Dentro de aquella demostración, también mostramos que en Windows 8 se pueden seguir utilizando las aplicaciones actuales y utilizarlas en el entorno de escritorio que todo el mundo conoce.

Desde el punto de vista de uso de memoria, hemos aprovechado la circunstancia de que vamos a tener una serie de dispositivos con los que los usuarios se van a manejar con la interfaz Metro prácticamente todo el tiempo. En este caso, Windows 8 solamente inicializará los componentes de S.O. exclusivos del entorno de escritorio cuando sea necesario. Esta es otra manera de ahorrar memoria, aproximadamente unos 23 Mb por ahora. (El Administrador de Tareas se ejecuta en el escritorio, por lo que los datos de memoria que se veían en las capturas anteriores incluyen también ese consumo).

Asignación de prioridades más detallada

Windows 8 dispone de un mejor esquema para asignar prioridades a la hora de responder a las asignaciones de memoria desde las aplicaciones y componentes del sistema. Esto supone que Windows decide mejor qué memoria se mantiene activa y cuál se libera antes.

Por ejemplo, los programas antivirus realizan varias comprobaciones sobre los archivos cuando otros programas los van a abrir. La memoria que asigna el antivirus para verificar las firmas de virus normalmente se hace una sola vez (es improbable que esa memoria concreta se necesite en un momento posterior). En Windows 7, la memoria se trata como si tuviera la misma prioridad en el sistema que cualquier otra parte de la memoria (pongamos por ejemplo, memoria asignada por una instancia de Microsoft Excel en ejecución). Si la memoria empieza a escasear, Windows 7 podría empezar a liberar la memoria que utiliza para ayudar a otra aplicación en ejecución (como Excel) para responder rápidamente al usuario, el cual no sería la mejor opción para la capacidad respuesta del sistema, en este caso.

En Windows 8, cualquier programa tiene posibilidad de asignar memoria como de “baja prioridad”. Es una señal importante para Windows, ya que en caso de que lo necesite, Windows puede liberar esta memoria de baja prioridad para tener más espacio y ello no afectaría a otras zonas de memoria necesarias para mantener la capacidad de respuesta del sistema.

Por resumir, he explicado nuestra filosofía y la estrategia que hemos seguido para reducir el consumo de memoria en Windows 8. Has podido ver algunos ejemplos de los resultados y hemos rascado un poco en la superficie de parte del trabajo de ingeniería que llevamos hecho hasta ahora en este campo. Una cosa de la que no he hablado en absoluto es del modelo de aplicación de Windows 8 ni de los cambios realizados en el ciclo de vida de los procesos para conseguir que las nuevas aplicaciones de Windows 8 sean más “consideradas” con la memoria. Puedes ver más detalles en las sesiones de BUILD y en artículos que iremos publicando más adelante, ya que es una parte realmente importante del trabajo de rediseño de Windows.

Sin duda hemos avanzado ya un trecho muy largo, pero todavía nos queda.

--Bill Karagounis

FUENTE: Steven Sinofsky - https://blogs.msdn.com/b/b8/archive/2011/10/07/reducing-runtime-memory-in-windows-8.aspx

 

Saludos,

El equipo MSDN España