2010-09-24 8 views
8

Estoy escribiendo un programa (un probador de teoremas tal como sucede) cuyo requisito de memoria es "tanto como sea posible, por favor"; es decir, siempre puede hacerlo mejor usando más memoria, para fines prácticos sin límite superior, de modo que lo que realmente necesita hacer es usar tanta memoria como esté disponible, ni más ni menos. Puedo descifrar cómo priorizar los datos para eliminar las cosas de menor valor cuando la memoria se agota; el problema que estoy tratando de resolver es cómo saber cuándo está sucediendo esto.Manteniendo el uso de la memoria dentro de la cantidad disponible

Idealmente me gustaría una llamada al sistema que devuelva "cuánta memoria queda" o "¿todavía no tenemos memoria?"; por lo que puedo decir, ¿no existe tal cosa?

Por supuesto, malloc puede señalar que la memoria está fuera de servicio al devolver 0 y que puede llamar a un manejador; estas no son señales ideales, pero sería mejor que nada. Sin embargo, un problema es que realmente quiero saber cuándo se está agotando la memoria física, por lo que puedo evitar profundizar en el intercambio y hacer que todo se detenga por completo; Supongo que no hay forma de preguntar "¿tenemos que cambiar aún?" o decirle al sistema operativo "no intercambie en mi cuenta, simplemente falle mis solicitudes si se trata de eso"?

Otro enfoque sería averiguar cuánta RAM hay en la máquina y controlar cuánta memoria está usando el programa en este momento. Hasta donde yo sé, generalmente no hay forma de decir lo primero. También me da la impresión de que no hay una manera confiable de decir esto último excepto envolviendo malloc/free con una función de contador (que luego es más problemática en C++).

¿Hay algún enfoque que me falta?

Lo ideal sería una solución portátil, pero sospecho que eso no va a suceder. De lo contrario, una solución que funcione en Windows y otra que funcione en Unix sería agradable. De lo contrario, podría salir adelante con una solución que funciona en Windows y otra que funciona en Linux.

+0

Bueno, todo lo que puedo decir con certeza es que no encontrará una solución portátil. Ah, y que esta no es la tarea más fácil. – sbi

+1

en Linux: http://linux.die.net/man/2/getrusage quizás? En Windows: ¿GetProcessMemoryInfo quizás? –

Respuesta

6

Creo que la forma más útil y flexible de usar toda la memoria disponible es permitir que el usuario especifique cuánta memoria usar.

Deje que el usuario lo escriba en un archivo de configuración oa través de una interfaz, luego cree un asignador (o algo similar) que no proporcione más que esta memoria.

De esta manera, no tiene que encontrar estadísticas sobre la computadora actual, ya que esto siempre estará sesgado por el hecho de que el sistema operativo también podría ejecutar otros programas también. Ni siquiera hable sobre la forma en que el sistema operativo administrará el caché, las diferencias entre 32 y 64 bits hacen que el espacio de dirección limite sus asignaciones, etc.

Al final, la inteligencia humana (suponiendo que el usuario conozca el contexto de uso) es más económica de implementar cuando la proporciona el usuario.

+0

Este es el camino correcto a seguir: la presión de la memoria podría ser causada por otras aplicaciones en ejecución, de todos modos. – caf

1

La mejor solución que se me ocurre es consultar cuántas faltas de página se han producido, por ejemplo, en el último segundo. Si hay una gran cantidad de intercambio en curso, probablemente debería liberar algo de memoria, y si no, puede intentar asignar más memoria.

En Windows, WMI probablemente pueda darle algunas estadísticas que puede utilizar.

Pero es un problema difícil, ya que no hay un límite estricto que pueda solicitarle al sistema operativo y luego quedarse abajo. Puedes seguir asignando memoria mucho más allá del punto donde te quedaste sin memoria física, lo que significa que vas a paralizar tu proceso con un intercambio excesivo.

Así que lo mejor que puedes hacer realmente es algún tipo de aproximación.

0

Puede seguir asignando memoria más allá del punto en que es útil hacerlo, es decir, la que requiere que el sistema operativo intercambie o entregue información importante. El problema es que no es necesariamente fácil decir dónde está esto.

Además, si su tarea tiene un IO (significativo), necesitará dejar algo para los búferes del sistema operativo.

Recomiendo simplemente examinar cuánto hay en la máquina, luego asignar una cantidad en función de eso (proporción, o dejar algo de libertad, etc.).

2

Depender de malloc para devolver 0 cuando no hay memoria disponible podría causar problemas en Linux, porque Linux overcommits memory allocations. malloc generalmente devolverá un puntero válido (a menos que el proceso esté fuera del espacio de direcciones virtuales), pero acceder a la memoria a la que apunta puede desencadenar el "OOM killer", un mecanismo que mata su proceso u otro proceso en el sistema. El administrador del sistema puede tune this behavior.

Cuestiones relacionadas