2012-08-02 20 views
8

Estoy desarrollando una aplicación para un sistema integrado con memoria limitada (Tegra 2) en C++. Estoy manejando los resultados NULOS de new y new[] en todo el código que a veces ocurre pero la aplicación puede manejar esto.SIGKILL al asignar memoria en C++

El problema es que el sistema mata el proceso por SIGKILL si la memoria se agota por completo. ¿Puedo decir de alguna manera que new debería simplemente devolver NULL en lugar de matar el proceso?

+1

No estoy seguro, pero se puede tratar de usar "nueva (nothrow)" http://www.cplusplus.com/reference/std/ new/nothrow/ –

+0

Lo hago en la mayoría de los casos, seguramente cuando estoy asignando grandes cantidades de memoria. En algunos casos, yo era demasiado flojo para reescribir lo nuevo en nuevo (std :: nothrow), pero supongo que el proceso terminaría con excepción en lugar de SIGKILL. – Blackhex

Respuesta

11

no estoy seguro de qué tipo de sistema operativo que está utilizando, pero usted debe comprobar si es compatible con opportunistic memory allocation como Linux hace.

Si está habilitada, puede ocurrir lo siguiente:

  1. Su new o malloc para crear una dirección válida desde el núcleo. Incluso si no hay suficiente memoria, porque ...
  2. El núcleo realmente no asigna la memoria hasta el momento del primer acceso.
  3. Si se utiliza toda la memoria "comprometida en exceso", el sistema operativo no tiene ninguna posibilidad, pero mata a uno de los procesos involucrados. (Es demasiado tarde para decirle al programa que no hay suficiente memoria). En Linux, esto se llama Out Of Memory Kill (OOM Kill). Tales asesinatos se registran en el búfer de mensajes del kernel.

Solución: La sobrecarga de la memoria Desactivar: echo 2 > /proc/sys/vm/overcommit_memory

1

Dos ideas vienen a la mente.

1.) Escriba su propia función de asignación de memoria en lugar de depender de new directamente. Mencionaste que estás en un sistema integrado, donde los asignadores especiales son bastante comunes en las aplicaciones. ¿Está ejecutando su aplicación directamente en el hardware o está ejecutando en un proceso bajo una capa ejecutiva/SO? Si es este último, ¿hay una API del sistema para la asignación de memoria?

2.) Consulte C++ set_new_handler y vea si puede ayudarlo. Puede solicitar que se invoque una función especial cuando falla una asignación de new. Tal vez en esa función pueda tomar medidas para evitar que lo que está matando al proceso se ejecute. Referencia: http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

add 1) Sí, esta es una forma de solucionarlo, pero era demasiado flojo para ir de esta manera hasta el momento si pudiera haber una solución basada en la configuración del sistema. Es una distribución abierta e incrustada, por lo que es bastante pesada en comparación con los sistemas integrados "reales". No sé si hay alguna API para asignaciones de memoria especiales. ¿Algún consejo? agregar 2) Gran idea, lo intentaré. – Blackhex

Cuestiones relacionadas