2012-08-02 1 views
8

Je développe une application pour un système embarqué avec une mémoire limitée (Tegra 2) en C++. Je gère les résultats NULL de new et new[] dans tout le code qui se produit parfois mais l'application est capable de gérer cela.SIGKILL lors de l'allocation de mémoire en C++

Le problème est que le système tue le processus par SIGKILL si la mémoire s'épuise complètement. Puis-je en quelque sorte dire que new devrait juste retourner NULL au lieu de tuer le processus?

+1

Je ne sais pas, mais vous pouvez essayer d'utiliser "nouvelle (nothrow)" http://www.cplusplus.com/reference/std/ new/nothrow/ –

+0

Je fais dans la plupart des cas, sûrement quand j'alloue de plus grandes quantités de mémoire. Dans certains cas, j'étais trop paresseux pour réécrire new to new (std :: nothrow) mais je suppose que le processus se terminerait avec exception au lieu de SIGKILL. – Blackhex

Répondre

11

Je ne suis pas sûr de ce genre de système d'exploitation que vous utilisez, mais vous devriez vérifier si il prend en charge opportunistic memory allocation comme le fait Linux.

Si elle est activée, ce qui suit peut se produire:

  1. Votre new ou malloc obtient une adresse valide à partir du noyau. Même s'il n'y a pas assez de mémoire, car ...
  2. Le noyau n'alloue pas vraiment la mémoire jusqu'au moment du premier accès.
  3. Si toute la mémoire «surchargée» est utilisée, le système d'exploitation n'a aucune chance de tuer l'un des processus impliqués. (Il est trop tard pour dire au programme qu'il n'y a pas assez de mémoire.) Sous Linux, cela s'appelle Out Of Memory Kill (OOM Kill). De telles attaques sont consignées dans le tampon de messages du noyau.

Solution: Désactiver overcommitting de la mémoire: echo 2 > /proc/sys/vm/overcommit_memory

1

Deux idées me viennent à l'esprit. 1.12 Écrivez votre propre fonction d'allocation de mémoire plutôt que de dépendre directement de new. Vous avez mentionné que vous êtes sur un système embarqué, où les allocateurs spéciaux sont assez courants dans les applications. Exécutez-vous votre application directement sur le matériel ou exécutez-vous un processus sous une couche exécutive/système d'exploitation? Dans ce dernier cas, existe-t-il une API système pour l'allocation de la mémoire?

2.) Vérifiez C++ set_new_handler et voyez si cela peut vous aider. Vous pouvez demander qu'une fonction spéciale soit appelée lorsqu'une allocation new échoue. Peut-être que dans cette fonction vous pouvez prendre des mesures pour empêcher tout ce qui tue le processus d'exécution. Référence: http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

add 1) Oui, c'est un moyen de contourner le problème, mais j'étais trop fainéant pour aller jusque-là s'il pouvait y avoir une solution basée sur la configuration du système. C'est une distrubution Open Embedded donc un poids assez important comparé aux "vrais" systèmes embarqués. Je ne sais pas s'il existe une API pour les allocations de mémoire spéciales. Des indices? add 2) Bonne idée, je vais essayer ça. – Blackhex