2010-05-18 20 views
5

No soy un tipo de ciencia de la competencia. Los recursos administrados se asignan en el montón. Pero me gustaría saber dónde se asignan los recursos no administrados. Si los recursos no administrados también se asignan en el montón, ¿es el mismo montón utilizado por los recursos administrados o uno diferente?Donde se asignan los recursos no administrados

Gracias de antemano.

Harsha

Respuesta

9

Básicamente, el montón es lo mismo hablando desde la vista del sistema operativo: el espacio de memoria asignado al proceso del sistema operativo.

La diferencia es que cuando el CLR (.net VM) se carga dentro de un proceso de Windows toma una parte de este montón y lo convierte en un montón administrado. Este espacio de memoria se convierte en el lugar donde todos los recursos administrados son asignados y conocidos por el recolector de basura.

Por ejemplo, puede ejecutar un error de falta de memoria si asigna una gran cantidad de memoria no administrada y se queda sin espacio para su montón administrado. O al revés.

Jeffrey Richter es el hombre que mejor explica estas cosas. Yo altamente recomiendo leer su explicación:

Puede utilizar los servicios del espacio de nombres System.InteropServices, la clase Marshal específicamente, para copiar datos entre la parte no administrado de la montón y el administrado.

+0

Es un artículo realmente bueno. Para completar, también agregué la segunda parte. – Oliver

+0

@Oliver: ¡excelente! gracias por editar la pregunta en lugar de solo publicarla en un comentario. –

+0

Sí, esa es una de las características agradables cuando ganaste suficiente reputación (como ya hiciste). ;) – Oliver

0

En la memoria. Como para cualquier proceso no administrado ... obviamente, el montón administrado es diferente del manejado.

+0

En realidad, los recursos no administrados pueden estar en cualquier lugar, no necesariamente en la máquina donde se encuentra el objeto que encapsula el recurso. Un par de ejemplos comunes de recursos fuera de la máquina sería un archivo en un servidor remoto, o una conexión TCP a un dispositivo con recursos muy limitados (por ejemplo, muchos dispositivos integrados solo admiten una conexión TCP a la vez). Si una rutina fuera adquirir dicho archivo o conexión TCP y no liberarlo inmediatamente, podría dejar ese recurso al menos temporalmente inaccesible por parte de los usuarios de otras máquinas. – supercat

+0

No. Consulte "un archivo en un servidor remoto" todavía se asigna localmente para la administración. Para mantenerlo abierto, necesita un recurso compartido de archivos que, por cierto, no aparece amgically, está vinculado a una operación de abrir archivos en la pila de administración de archivos del servidor local. Una conexión TCP también de alguna manera usa un socket local. – TomTom

+0

Aunque la mayoría de los sistemas operativos administrarán cosas como sockets TCP y manejadores remotos de archivos, y los limpiarán cuando salga una aplicación, lo que * escasea * es el recurso en la máquina remota. El hecho de que el sistema operativo de la máquina local mantenga una referencia al archivo remoto y pueda limpiarlo cuando sale de la aplicación no significa que los usuarios de otras máquinas, que no conocen ni se preocupan por nada de la máquina que abrió el archivo, no podría acceder al archivo en la máquina remota hasta que eso ocurra. – supercat

0

El CLR mantiene sus propios montones. Inicialmente, se crean dos: uno simplemente se llama managed heap (o montón de objetos pequeños) y el otro es large object heap (consulte también here). Estos montones administrados están físicamente separados de los montones nativos asignados por el CRT para su uso con new y malloc.

Puede usar VMMap para inspeccionar los diferentes montones asignados por un proceso.

0

Para tomar prestada una frase de un artículo de una revista que compara filtros lineales y no lineales, una comparación de recursos administrados y no administrados es como una comparación entre la biología del canguro y la biología del canguro.

En .net, los recursos gestionados son objetos de clase en el montón administrado. Siempre. Es posible que los tipos de valores contengan referencias a los recursos administrados, pero una instancia de tipo valor no puede "ser" un recurso administrado.

Por el contrario, un recurso no administrado puede ser casi cualquier cosa, y se puede almacenar casi en cualquier lugar. No necesita estar en la misma computadora, o incluso en el mismo planeta, que el programa que lo posee (no sé si cualquiera de las sondas enviadas a Marte expone cualquier tipo de interfaz de socket de comunicaciones que se comporte como un recurso no administrado, pero ciertamente uno podría diseñarlos para hacerlo).

Un objeto contiene un recurso no administrado si alguna entidad externa está haciendo algo en nombre de ese objeto, en detrimento de otros, y seguirá haciéndolo hasta que se lo detenga (o, posiblemente, hasta que se agote) . Hay muchos tipos de recursos no administrados, y pueden vivir prácticamente en cualquier lugar. Algunos de ellos (por ejemplo, bloqueos y suscripciones de eventos) pueden vivir completamente dentro del mundo administrado de .net. Algunos de ellos (por ejemplo, las conexiones del servidor) pueden existir fuera de la computadora que los "posee" en un momento dado. Algunos tipos de recursos no administrados pueden encapsular bloques de memoria del SO, separados del montón no administrado, pero no hay un lugar general donde los recursos no administrados estén "almacenados". Más bien, como se señaló, los recursos no administrados pueden ser casi cualquier cosa, y se pueden almacenar casi en cualquier lugar.

1

Para operar con el montón unmannaged utilizar la clase Marshal se describe en MSDN

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.71).aspx

montón no administrado no controlada por GC, por lo que toda la responsabilidad del uso de la memoria se encuentra en ti. Esencialmente para liberar memoria asignada para recursos no administrados, use la interfaz IDisposable y libere todos los recursos asignados por usted mismo. Todos los recursos no administrados como las conexiones de SQL y las diferentes operaciones de E/S utilizan este enfoque.

+0

Gracias por la respuesta – Harsha

Cuestiones relacionadas