J'ai hérité du code que j'ai besoin de maintenir qui peut être moins que stable à certains moments. Les personnes précédentes ne sont plus disponibles pour demander pourquoi ils ont exécuté l'application dans un environnement avec un ensemble de piles illimité, je suis curieux de savoir ce que les effets de cela pourraient être? L'application semble avoir quelques bogues de mémoire imprévisibles que nous ne pouvons pas trouver et l'exécution de l'application sous Valgrind n'est pas une option car elle ralentit tellement l'application que nous ne pouvons pas réellement l'exécuter. Donc toutes les pensées sur ce que les effets de cela pourraient être sont appréciées.Quel est l'effet de l'exécution d'une application avec la taille "Unlimited Stack"?
Répondre
S'il s'agit d'un type de programme standard à un seul filetage, la limitation de la taille de la pile n'est en fait qu'une précaution de sécurité. Cela empêchera une récursion infinie de manger toute votre mémoire avant qu'elle ne meure. En définissant la limite sur illimité, vous pourrez simplement continuer à allouer sur la pile jusqu'à ce qu'elle piétine le tas.
Dans la mode Unix classique, le tas et la pile partent des côtés opposés de l'espace mémoire et s'attribuent l'un à l'autre, c'est-à-dire que l'un grandit et l'autre grandit. Quand ils frappent, vous n'obtiendrez pas d'erreur, vous écraserez simplement les données jusqu'à ce que quelque chose de mauvais arrive.
Habituellement, vous n'avez pas besoin d'une grosse pile, mais l'allocation de gros objets sur la pile ou la récursion profonde peut être un problème pour certains programmes, ils ont alors besoin d'une plus grande pile.
Modifier: Juste pour ajouter au point à propos d'être un seul thread. Dans les programmes multithreads, vous devez allouer plusieurs piles. Ce genre de gâcher la croissance des deux extrémités vers l'approche du milieu. Dans ce cas, les piles sont allouées dans des blocs max-stack-size-ish à partir du côté pile de l'espace mémoire. Ensuite, lorsque vous faites exploser votre pile, vous piétinez la pile d'un autre thread. En fonction de votre architecture, vous pourrez peut-être ajouter une protection de page pour limiter cela mais c'est probablement TMI à ce stade ;-)
La pile croissante va toucher les objets partagés mappés en mémoire beaucoup plus tôt qu'elle ne l'atteindra . Sur Linux 64 bits, la pile va croître avec un maximum de 15 GiB avant de se contracter avec les librairies dans l'espace d'adressage. Vous pouvez le vérifier avec la commande 'pmap'. –