stop solucion reiniciarse producido problema necesita management inicia español error code bluescreen memory-management

memory management - solucion - ¿Liberar o liberar alguna vez la memoria vuelve al "sistema"?



se ha producido un problema en su pc y necesita reiniciarse windows 10 memory management (8)

Aquí está mi pregunta: ¿Liberar o liberar llamadas libera memoria alguna vez al "sistema"? Por sistema, quiero decir, ¿alguna vez reduce el segmento de datos del proceso?

Consideremos el asignador de memoria en Linux, es decir, ptmalloc.

Por lo que sé (corríjanme si estoy equivocado), ptmalloc mantiene una lista libre de bloques de memoria y cuando llega una solicitud de asignación de memoria, intenta asignar un bloque de memoria de esta lista gratuita (lo sé, el asignador es mucho más complejo que eso, pero solo lo estoy poniendo en palabras simples). Sin embargo, si falla, obtiene la memoria del sistema usando las llamadas al sistema saybr o brk. Cuando se libera una memoria, ese bloque se coloca en la lista libre.

Ahora considere este escenario, en la carga máxima, se han asignado muchos objetos en el montón. Ahora cuando la carga disminuye, los objetos se liberan. Entonces mi pregunta es: una vez que el objeto está libre, el asignador hará algunos cálculos para determinar si debe mantener este objeto en la lista libre o, dependiendo del tamaño actual de la lista libre, puede decidir devolver esa memoria a el sistema es decir, disminuye el segmento de datos del proceso utilizando sbrk o brk.

La documentación de glibc me dice que si la solicitud de asignación es mucho mayor que el tamaño de página, se asignará utilizando mmap y se volverá a liberar directamente al sistema una vez que se libere. Guay. Pero digamos que nunca pido una asignación de tamaño superior a, por ejemplo, 50 bytes y solicito muchos de esos objetos de 50 bytes en la carga máxima en el sistema. Y que ?

Por lo que sé (corríjanme por favor), una memoria asignada con malloc nunca será devuelta al sistema hasta que el proceso finalice, es decir, el asignador simplemente lo mantendrá en la lista libre si lo libero. Pero la pregunta que me preocupa es, entonces, si utilizo una herramienta para ver el uso de la memoria de mi proceso (estoy usando pmap en Linux, ¿qué usan?), Siempre debe mostrar la memoria utilizada en la carga máxima ( ya que la memoria nunca se devuelve al sistema, excepto cuando se asigna con mmap)? Esa es la memoria utilizada por el proceso nunca debe disminuir (excepto la memoria de la pila)? Lo es ?

Sé que me estoy perdiendo algo, así que por favor arroja algo de luz sobre todo esto.

Expertos, aclaren mis conceptos con respecto a esto. Estaré agradecido. Espero haber podido explicar mi pregunta.


No.

En realidad, es una mala estrategia por una serie de razones, por lo que no sucede, excepto que, como usted nota, puede haber una excepción para asignaciones grandes que se pueden hacer directamente en páginas.

  • Aumenta la fragmentación interna y, por lo tanto, puede desperdiciar memoria. (Solo puede devolver las páginas alineadas al sistema operativo, por lo que sacar las páginas alineadas de un bloque generalmente creará dos bloques garantizados para ser pequeños (más pequeños que una página, de todos modos) a cada lado del bloque. sucede mucho, terminas con la misma cantidad total de memoria asignada de manera útil más muchos bloques pequeños inútiles).

  • Se requiere una llamada al kernel , y las llamadas al kernel son lentas, por lo que ralentizaría el programa. Es mucho más rápido simplemente tirar el bloque de vuelta al montón.

  • Casi todos los programas convergerán en una huella de memoria de estado estable o tendrán una huella creciente hasta la salida. (O, hasta cerca de la salida). Por lo tanto, todo el procesamiento adicional que necesita un mecanismo de devolución de página se desperdiciará por completo.


Aquí hay algunas "ventajas" de nunca liberar memoria al sistema:

  • Habiendo usado mucha memoria, es muy probable que lo haga nuevamente, y
    • cuando liberas memoria, el sistema operativo tiene que hacer bastante papeleo
    • cuando lo necesite de nuevo, su asignador de memoria tiene que reinicializar todas sus estructuras de datos en la región que acaba de recibir
  • La memoria liberada que no es necesaria se propaga al disco donde no hace mucha diferencia
  • A menudo, incluso si liberas el 90% de tu memoria, la fragmentación significa que realmente se pueden liberar muy pocas páginas, por lo que el esfuerzo requerido para buscar páginas vacías no está muy bien gastado.

Creo que el asignador de memoria en glibc puede devolver la memoria al sistema, pero dependerá o no de los patrones de asignación de memoria.

Digamos que haces algo como esto:

void *pointers[10000]; for(i = 0; i < 10000; i++) pointers[i] = malloc(1024); for(i = 0; i < 9999; i++) free(pointers[i]);

La única parte del montón que se puede devolver de manera segura al sistema es el "trozo de desierto", que está al final del montón. Esto puede devolverse al sistema utilizando otra llamada del sistema sbrk, y el asignador de memoria glibc hará eso cuando el tamaño de este último fragmento exceda algún umbral.

El programa anterior haría 10000 pequeñas asignaciones, pero solo liberaría las primeras 9999 de ellas. El último debería (suponiendo que nada más haya llamado malloc, lo cual es improbable) estar sentado justo al final del montón. Esto evitaría que el asignador devuelva cualquier memoria al sistema.

Si tuviera que liberar la asignación restante, la implementación malloc de glibc debería ser capaz de devolver la mayoría de las páginas asignadas al sistema.

Si está asignando y liberando pequeños trozos de memoria, algunos de los cuales son de larga duración, podría terminar en una situación en la que tiene una gran cantidad de memoria asignada desde el sistema, pero solo está usando una pequeña fracción de eso


Creo que tiene toda la información que necesita para responder su propia pregunta. pmap muestra la memoria que actualmente está siendo utilizada por el proceso. Por lo tanto, si llama a pmap antes de que el proceso logre una memoria pico, entonces no mostrará la memoria pico. si llama a pmap justo antes de que el proceso salga, entonces mostrará la memoria pico para un proceso que no usa mmap. Si el proceso utiliza mmap, entonces si llama a pmap en el punto donde se usa la memoria máxima, mostrará el uso máximo de la memoria, pero este punto puede no estar al final del proceso (podría ocurrir en cualquier lugar).

Esto se aplica solo a su sistema actual (es decir, basado en la documentación que ha proporcionado de manera gratuita y mmap y malloc), pero como ha indicado el afiche anterior, el comportamiento de estos depende de la implementación.


Es totalmente dependiente de la implementación. En Windows, los programas de VC ++ pueden devolver la memoria al sistema si las páginas de memoria correspondientes contienen solo bloques libres.


Esto varía un poco desde la implementación hasta la implementación.

Piensa en tu memoria como un bloque largo masivo, cuando lo asignas te quitas un poco de la memoria (etiquetado ''1'' a continuación):

111

Si asigno más memoria con malloc, obtiene algo del sistema:

1112222

Si ahora libero ''1'':

___2222

No será devuelto al sistema, porque dos están en frente de él (y la memoria se da como un bloque continuo). Sin embargo, si se libera el final de la memoria, esa memoria se devuelve al sistema. Si libero ''2'' en lugar de ''1''. Me gustaría obtener:

111

el bit donde ''2'' era sería devuelto al sistema. El principal beneficio de liberar memoria es que ese bit se puede reasignar, en lugar de obtener más memoria del sistema. p.ej:

33_2222


Muchos administradores de memoria pueden realizar operaciones TRIM donde devuelven bloques de memoria completamente inutilizados al sistema operativo. Sin embargo, como varias publicaciones aquí han mencionado, es completamente dependiente de la implementación.

Pero digamos que nunca pido una asignación de tamaño superior a, por ejemplo, 50 bytes y solicito muchos de esos objetos de 50 bytes en la carga máxima en el sistema. Y que ?

Esto depende de su patrón de asignación. ¿Liberas TODAS las pequeñas asignaciones? Si es así, y si el administrador de memoria maneja las asignaciones de bloques pequeños, entonces esto puede ser posible. Sin embargo, si asigna muchos elementos pequeños y luego solo libera todos los elementos dispersos, puede fragmentar la memoria y hacer que sea imposible para los bloques TRIM puesto que cada bloque tendrá solo algunas asignaciones dispersas. En este caso, es posible que desee utilizar un esquema de asignación diferente para las asignaciones temporales y persistentes para que pueda devolver las asignaciones temporales al sistema operativo.


No hay mucha sobrecarga para malloc, por lo que es poco probable que consigas ningún ahorro de tiempo de ejecución. Sin embargo, hay una buena razón para implementar un asignador sobre malloc, y eso es para poder rastrear las pérdidas de memoria. Por ejemplo, puede liberar toda la memoria asignada por el programa cuando sale, y luego verificar si su asignador de memoria llama al saldo (es decir, el mismo número de llamadas para asignar / desasignar).

Para su implementación específica, no hay ninguna razón para free () ya que malloc no se liberará en la memoria del sistema y, por lo tanto, solo liberará la memoria a su propio asignador.

Otra razón para usar un asignador personalizado es que puede asignar muchos objetos del mismo tamaño (es decir, tiene alguna estructura de datos a la que está asignando mucho). Es posible que desee mantener una lista libre separada para este tipo de objeto, y liberar / asignar solo desde esta lista especial. La ventaja de esto es que evitará la fragmentación de la memoria.