Pregunta

Qué haces cuando malloc ¿Devuelve 0 o nueva excepción de lanzamientos? ¿Solo detiene o intenta sobrevivir a la condición de OOM/guardar el trabajo del usuario?

¿Fue útil?

Solución

Evitaría a los Oom como evitar un choque.

Evite hacer un gran trabajo (y asigne una gran parte de la memoria) a la vez. Mantenga los datos en el disco, confíe en el caché del disco del sistema operativo y utilice el IO mapeado en la memoria tanto como sea posible, y solo opere en una pequeña parte de los datos a la vez. Si se necesitan grandes cantidades de datos en línea (servidos con baja latencia), manténgalos en la memoria en varias máquinas, como lo hacen todas las grandes compañías de motores de búsqueda. O comprar un SSD.

Otros consejos

La mayoría de las personas que responden a esta pregunta probablemente nunca han trabajado en sistemas integrados, donde el regreso de Malloc 0 es una posibilidad muy real. En un sistema en el que estoy trabajando actualmente, hay un total de 4.25k bytes de RAM (eso es 4352 bytes). Estoy asignando 64 bytes para la pila, y actualmente tengo un montón de 1600 bytes. Justo ayer estaba depurando una rutina de caminata de montón para poder seguir la asignación y la liberación de la memoria. La caminata del montón utiliza un pequeño búfer asignado estáticamente (30 bytes) para emitir a un puerto serie. Se apagará para la versión de lanzamiento.

Dado que este es un producto de consumo, es mejor que no se quede sin memoria una vez que se ha lanzado el producto. Estoy seguro de que lo hará durante el desarrollo. En cualquier caso, todo lo que puedo hacer es pitar al altavoz un par de veces y forzar un reinicio.

Para ser bastante honesto, en todos los proyectos que he hecho (tenga en cuenta que todavía no estoy trabajando en ningún lado), nunca he considerado que podría suceder, y por lo tanto, supongo que mis programas morirían de muerte muy rápida.

Además, el manejo de una OOM requiere que haya preellocado los recursos para mostrar el mensaje de error o para guardar todo, lo que puede ser un poco inconveniente.

Siento que en estos días, la memoria cuesta menos que los maní, no es algo que debería suceder con frecuencia. En los albores de la memoria protegida y antes, ¿tal vez eso era una preocupación, pero ahora? Los únicos errores OOM que he visto fueron de código erróneo.

Verificar los códigos de retorno de Malloc es UsUall inútil de todos modos.

Los sistemas operativos modernos comprometen la memoria exagerada: dan a los procesos más memoria de la que realmente está disponible. La memoria que se otorga su proceso es virtual, todo asignado a una sola página a cero.

No es hasta que escribes en la memoria que se asigna una página física y única para tus procesos. Si esta asignación falla, el kernel terminará un proceso (¡quizás el suyo!) En un intento por encontrar memoria. En ese momento, no hay nada que puedas hacer más.

A menos que esté desarrollando para sistemas integrados, sistemas en tiempo real o sistemas que sean tan críticos que las fallas pueden costar vidas o miles de millones de dólares ... entonces probablemente no valga la pena financieramente para preocuparse por las condiciones de la memoria.

En la mayoría de los casos, se puede hacer poco cuando está fuera de la memoria de todos modos, ya que no hay memoria para crear ningún objeto nuevo o realizar tareas que puedan hacer algo. Debe sopesar el costo del manejo de la aplicación OOM versus el beneficio que obtiene al hacerlo.

Siempre verificaría el error. Si algo devuelve una condición de error, entonces su programa debe manejarlo. Incluso si se trata de un mensaje que dice "¡Fuera de memoria, tengo que ir!", Es mejor que "violación de acceso", "arrojado núcleo", o lo que sea. Una es una condición de error que maneja, la otra es un error. Y el usuario lo percibirá como tal también.

Para su caso específico, puede intentar revertir la operación, liberando recursos que ha asignado hasta que alcance el punto de falla, informando el error y la ejecución continua (tal vez cuando intente renunciar a la aplicación, puede dar el opción para salir de inmediato). De esta manera, el usuario puede decidir qué hacer, o tratar de liberar algo de memoria jugando, cerrando archivos, etc. Por supuesto, cómo puede manejar la situación depende en gran medida de su programa, un programa que no se supone que debe Sea interactivo, probablemente solo necesite registrar el error y dejar de fumar o continuar.

Licenciado bajo: CC-BY-SA con atribución
scroll top