2010-03-13 22 views
44

Entiendo que la memoria debe reservarse antes de comprometerse. Y cuando está reservado, ningún otro proceso puede usarlo. Sin embargo, la memoria reservada no cuenta contra la RAM disponible. ¿Pero no debería? Porque si nadie más puede usarlo, ¿de qué sirve estar "disponible"?¿Cuál es la diferencia entre la memoria reservada y la comprometida?

¿O hay alguna diferencia más grande?

+0

¿Podría proporcionar una referencia de dónde encontró esa definición de "reservado"? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

Echa un vistazo a la presentación de Mark Russinovich en PDC 10. Se llamaba 'PDC10: Misterios de la administración de memoria de Windows revelados: parte Uno.' Él habla extensamente sobre esto. http://player.microsoftpdc.com – NigelTufnel

Respuesta

44

En el contexto de Win32, "reservado" significa que el espacio de direcciones se asigna dentro del proceso que lo solicitó. Esto se puede usar, por ejemplo, para reservar espacio para un buffer grande que no se necesita de inmediato, pero cuando se necesita, debe ser contiguo.

La memoria de reserva no interactúa con otros procesos, ya que cada proceso tiene su propio espacio de direcciones privadas. Por lo tanto, la afirmación de que "cuando está reservada, ningún otro proceso puede usarla" no tiene sentido, ya que los procesos normalmente no pueden asignar memoria en el espacio de direcciones de otro proceso de todos modos.

Cuando se solicita que se comprometan las páginas reservadas (almacén de respaldo asignado para ellas), esa operación puede fallar debido a la falta de memoria física (o archivo de paginación).

+1

"tienda de respaldo asignada para ellos": ¿Quiere decir cuando los datos que solo se almacenan en caché se llaman reservados, y cuando se escriben en la RAM o en el archivo de paginación se llaman comprometidos? – idbrii

+7

@pydave: No, "caché" y "reservado" son conceptos no relacionados. Reservar memoria es una especie de desarrollador de propiedades que reclama tierras que luego contendrán casas. No hay nada allí todavía, pero nadie más puede construir casas allí tampoco. Comprometerse en realidad es construir las casas y establecer la infraestructura como electricidad y alcantarillado. Por otro lado, la memoria caché es una optimización para hacer que las CPU se ejecuten más rápido, todos los datos todavía se almacenan en algún lugar de la memoria RAM. –

+1

Entonces, ¿escribir datos en una página de memoria ocasiona que esa página se comprometa? (Entonces la diferencia entre reservado y comprometido es que se ha asignado el reservado, pero se ha utilizado el cometido). – idbrii

4

La memoria virtual de proceso (espacio de direcciones) y la RAM real son ambas diferentes. puede tener 512 MB de RAM física, pero aún así su proceso puede abordar el espacio de direcciones virtuales de 4 GB (espacio de usuario de 2 GB) . Todas las direcciones de un proceso se pueden considerar gratuitas, reservadas o comprometidas en cualquier momento.

comienza un proceso con todas las direcciones libres, lo que significa que son libres de estar comprometidos a la memoria o reservado para la futura use.Before cualquier dirección libre puede ser utilizado, habrá que situarlo como reservada O cometido. Pero no necesita ser reservado para que pueda ser comprometido.

reservar memoria significa reservar el espacio de direcciones virtaul para propósitos futuros. no está asociado con la RAM física (asignada a direcciones de RAM). En donde la memoria comprometida significa que se asociará con la RAM real para que pueda almacenar datos en ella.

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

Una objeción: la memoria virtual no necesita ser reservada _como un paso separado_ antes de que se haya cometido. VirtualAlloc puede reservar y comprometerse en una sola llamada. Pero la "reserva" tiene que hacerse. Además, comprometerse no "asigna" RAM; solo un error de página subsiguiente lo hace. Yo (¿lo intenté?) Edito "se asociará" a "se puede asociar" en consecuencia. También agregaría la siguiente oración al final: "La memoria RAM actual no se asigna hasta que acceda a la región comprometida, y se realiza página por página". Y otra cosa: otra forma de usar páginas libres es para la memoria mapeada. –

7

me gusta ver Reserved como reservar la dirección de espacio para que nadie más puede asignarlo (pero no se puede utilizar la memoria en esa dirección, ya que todavía no está disponible). Y Committed como mapeo que espacio de direcciones a memoria física para que pueda ser utilizado.

¿Por qué querría reservar? ¿Por qué no solo obtener memoria comprometida? Hay varias razones por las que tengo en mente:

  1. Algunos aplicación necesita un rango de direcciones específico, digamos de 0x400000 a 0x600000, pero no necesita la memoria para almacenar nada. Se usa para atrapar el acceso a la memoria. Por ejemplo, si algún código accede a dicha área, será atrapado. (Útil por alguna razón.)

  2. Algunos hilos necesitan almacenar progresivamente datos en expansión. Y los datos deben estar en un pedazo contiguo de memoria. Se prefiere no comprometer memoria física grande de una vez porque no es necesaria y sería un desperdicio. La memoria puede ser utilizada por algunos otros hilos primero.La memoria física se compromete solo a pedido.

Cuestiones relacionadas