miércoles, 10 de noviembre de 2010

Manual: Heap!Heap!…Manager


Figure-6.1
Las dos últimas semanas han estado cargadas de novedades, y apenas hemos tenido tiempo ni de respirar.

Tras el lanzamiento de la ansiada 0.3.12 ,que ha demostrado estar al nivel esperado, es la hora de añadir código crítico a ReactOS.



Los lanzamientos aseguran un ReactOS con pocas regresiones, estable, debuggeado y pulido.



Es por tanto el momento perfecto de añadir nuevo código y de realizar las sincronizaciones con WINE, de tal manera que podamos corregir los nuevos fallos antes de la próxima versión: ¿0.3.13 ó 0.4?.


Ya hemos hablado de “Yarotows” que no solo simplificaba sino que añadia nuevas funcionalidades como por ejemplo el cambio de resolución en caliente.
Ahora es el turno de hablar del “Heap Manager ”…¿Lo quéeee?
Sigue leyendo para "diversificar el conocimiento”.



 

El Heap Manager


tres Si buscamos en un diccionario inglés-español veremos que Heap Manager es algo así como el “Manejador de Cacharros / Montones”. Ahora sí que está todo clarito, ¿verdad? [/ironic]
El Heap Manager es un manejador/ gobernador /administrador de Heaps. ¿Pero qué es un Heap?

Un Heap es un área de memoria reservada para los datos cuando una aplicación es lanzada. Lo del “area de memoria reservada” suena peor de lo que realmente es: Una zona de memoria que no puede ser utilizada por nadie, únicamente por la aplicación el proceso.


Algo así como un “Coto privado de caza” en el que nadie puede entrar salvo la propia aplicación para “cazar” memoria.

Una aplicación puede crear varios procesos o solo lanzar un único proceso.


(Muchas veces asociamos erróneamente el concepto de proceso con aplicación, una aplicación puede crear varios procesos que corren paralelamente creando un “Árbol de procesos”. Si vais al Administrador de Tareas, y hacéis click sobre la aplicación con el boton secundario del ratón veréis la opción de “Terminar árbol de procesos” )

Resumiendo: Una aplicación crea uno o varios procesos. Y cada proceso, al iniciarse, crea su propio “Process Heap”. El “Process Heap”, que como hemos dicho es un área reservada de memoria, se eliminará cuando el proceso termine. Si no se liberara, esa zona de memoria quedaría inaccesible para siempre (o hasta que apaguemos el ordenador). De ahí la importancia de eliminar el “Process Heap” cuando el “Process”(proceso) ha terminado.

El Proceso por defecto “acapara” 1MB de memoria para su Heap por defecto, aunque por supuesto podemos hacer que “acote” una mayor cantidad de memoria. (Esto está codificado en la propia aplicación que crea el proceso). Además puede expandirse si el proceso necesita almacenar más de 1MB de datos.
Imaginemos que el “Process Heap” está lleno de datos y que aún necesita almacenar algunos más.

//( Info extra para quien sepa algo de C:  el malloc() ,asignación dinámica de memoria,usa la memoria del Heap)

Repetimos: Imaginemos que el “Process Heap” está lleno de datos y que aún necesita almacenar algunos más.

Entonces podemos encontrarnos con dos posibilidades: Se devuelve un error al proceso indicando que la memoria está llena y que el “Coto Privado de Caza” se ha quedado sin Memoria o se solicita al Sistema Operativo otro MB adicional. Entonces el Process Heap pasaría a tener 2MB de espacio reservado. Y luego 3MB, y 4, 5….si fuera necesario.

¿Y quien se encarga de crear el Heap de un proceso, gestionar la solicitud de nuevos MB de memoria o de liberar del Process Heap cuando el proceso ha finalizado? El Heap Manager.

 



NT Heap Manager

 


default A estas alturas debería haber quedado patente la gran necesidad de tener un Heap Manager  muy compatible con el NT Heap Manager.
Tengamos en cuenta que las aplicaciones van a hacer (ab)uso de reserva de memoria dinámica y que todo esto va a estar gestionado por el Heap Manager.


Si existieran bugs en la implementación del Heap Manager podríamos hacer que la aplicación muriera súbitamente,ya sea porque no le hemos asignado la memoria extra que necesita o porque no le hemos indicado que “ya no hay más memoria disponible” para la misma.


También podemos encontrarnos con fallos a la hora de liberar memoria, que pudiera quedar marcada como “Utilizada” cuando realmente el proceso ya ha terminado.

El NT Heap Manager es , en definitiva, la interfaz entre el Manejador de Memoria (Memory Manager) y los procesos de una aplicación. Si el Memory Manager está lleno de bugs, nuestro NT Heap Manager se verá resentido (siendo incapaz de localizar memoria disponible, por ejemplo) lo que hará que la aplicación muera súbitamente. De igual manera un Memory Manager perfecto pero un Heap Manager repleto de bugs nos llevaría a un desastre similar. Filosofia barata: Una cadena se parte por el eslabón más debil aunque el resto sean perfectos.

 



ReactOS  Heap Manager


ReactOS está utilizando un Heap Manager compatible con el NT Heap Manager. Y compatible significa eso: similar, parecido, implementación propia, incompatible con ciertas aplicaciones. El Heap Manager de ReactOS tiene una compatibilidad limitada con el NT Heap Manager, o lo que es lo mismo, no es 100% compatible y esto afecta a las grandes aplicaciones.

Una gran aplicación hace mucho más uso del Heap que una aplicación pequeña, lo que empuja al limite de la compatibilidad a nuestro ReactOS Heap Manager. Las pequeñas aplicaciones, en principio, no necesitan extender su “Process Heap” lo que facilita la labor del Heap Manager, pero cuando constantemente se solicitan nuevos rangos de memoria se complica exponencialmente la gestión.






Y toda esta “interesantísima” explicación ¿Para qué?…
CONTINUARÁ


PS: Solicito la clemencia de todos los estudiantes/ingenieros informáticos por este resumen simplista del Heap y del Heap Manager.
PS: Solicito la clemencia de los que han llegado a CONTINUARÁ, prometo que en 2 días tendréis la Continuación ;)

2 comentarios:

  1. Esto de lo los "Continuará...." me suele pone nervioso. Jeje! (espero con ansia la segunda parte)

    Ha estado bien la explicación del Heap Manager. Un saludo de un Ingeniero tecnico informatico.

    ResponderEliminar
  2. Menos mal que terminó en el continuará, porque debería estar estudiando para el parcial que tengo mañana :P

    ResponderEliminar