10
votes

Y a-t-il un moyen de déterminer l'espace de pile disponible au moment de l'exécution?

Je sais que la taille de la pile est corrigée. Nous ne pouvons donc pas stocker de gros objets sur la pile et nous passons à des allocations dynamiques (par exemple MALLOC). En outre, la pile est utilisée lorsqu'il y a la nidification des appels de fonction afin d'éviter également les fonctions récursives pour cette raison. Y a-t-il un chemin à l'exécution pour déterminer la quantité de mémoire de pile est utilisée jusqu'à présent et combien reste-t-il?

Ici, je suppose que Linux Environment (Compilateur GCC) avec une architecture X86.


0 commentaires

6 Réponses :


2
votes

Il suffit de lire% ESP et de vous rappeler que sa valeur diminue. Vous connaissez déjà votre taille Max de défaillance de l'environnement, ainsi que votre point de départ de votre threads.

GCC a un excellent soutien de montage, contrairement à des flocons là-bas.


3 commentaires

Qu'en est-il du segment de tas? J'ai entendu dire que les segments de pile et de tas grandissent les uns des autres? Cela affectera-t-il la taille effective de la pile? Corrigez-moi si je me trompe ici.


Pour votre problème, vous pouvez le traiter comme orthogonal .. Le magasin gratuit ou le tas n'est pas l'espace de la pile et «croissance en face» n'est pas une façon utile d'y penser. À la pointe de l'allocation de tas (new-ing de vos types), la taille de la pile est susceptible d'être touchée brièvement / temporairement, mais ce n'est pas le problème que vous êtes confronté ..


Ce n'est pas aussi simple que "ils grandissent les uns des autres". GLIBC peut simplement utiliser MMAP () pour demander une zone de mémoire virtuelle supplémentaire et la mai en théorie vivant n'importe où sur l'espace d'adressage de la mémoire virtuelle, de sorte que Malloc () n'utilisera pas nécessairement un espace qui serait utilisé par la pile. La méthode d'allocation utilisée par GLIBC pour MALLOC () peut varier en fonction de nombreux facteurs (par exemple, il peut utiliser SBRAK () ou peut utiliser MMAP ()).



0
votes

C'est très en fonction de votre système d'exploitation et de sa gestion de la mémoire. Sur Linux, vous pouvez utiliser procfs . C'est quelque chose comme / proc / $ pid / mémoire. Je ne suis pas sur une boîte Linux en ce moment.

GCC ajoute généralement 16 bits pour les registres (pour revenir au contexte de la fonction mentionné) sur le cadre de la pile. Normalement, vous pouvez obtenir plus d'informations sur la manière dont le programme est compilé exactement en le désassemblant. Ou des utilisations pour obtenir l'assemblage.


0 commentaires

1
votes

Si votre application doit être sûr, il peut être sûr d'utiliser X MB de mémoire, l'approche habituelle est destinée au processus d'attribue à l'heure de démarrage (et ne démarrez pas s'il ne peut pas attribuer l'exigence minimale).

Ceci bien sûr, c'est que l'application doit employer sa propre logique de gestion de la mémoire.


2 commentaires

@Diciu, je voulais savoir sur la mémoire sur la pile non attribuée de manière dynamique la mémoire. La pile est allouée par le système et sa taille du correctif.


Pas ce n'est pas de taille fixe. Voir Ulimit - il vous permet de contrôler la taille de la pile qu'un système d'exploitation attribue un processus.



0
votes

TCL avait un chèque de pile à un moment donné, pour éviter de s'écraser en raison d'une récursion illimitée ou d'une autre question de pile. N'était pas trop portable, par exemple s'est écrasé sur l'un des BSDS ..., mais vous pouvez essayer de trouver le code qu'ils utilisaient.


0 commentaires

1
votes

Vous pouvez voir l'état de la zone de mémoire virtuelle de pile en regardant / proc / / smaps . La pile VMA se développe automatiquement lorsque vous utilisez plus de spa de pile. Vous pouvez vérifier la quantité d'espace de pile que vous utilisez vraiment en vérifiant la distance % ESP provenant de la limite supérieure de la zone de pile sur SMAPS (car la pile grandit). Probablement la première limite que vous toucherez si vous utilisez trop d'espace de pile sera celle définie par ulimit .

Mais rappelez-vous toujours que ces détails de faible niveau peuvent varier sans aucun préavis. Ne vous attendez pas à ce que toutes les versions du noyau Linux et toutes les versions Glibc ont le même comportement. Je ne ferais jamais mon programme sur ces informations.


1 commentaires

Note, je parle de Linux sur x86 seulement.



5
votes

Il y a une API Pthread pour déterminer où se trouve la pile: xxx

sur i386, la pile commence en bas et se développe vers le haut.

Donc Sachez que vous avez ($ ESP - Stackaddress) des octets disponibles.

dans mon système, j'ai un wrapper autour de pthread_create (), donc chaque thread commence dans ma fonction privée. Dans cette fonction, je trouve la pile telle que décrite ci-dessus, puis trouvez la partie inutilisée, puis initialisez cette mémoire avec un motif distinctif (ou "Patton", alors que mon beau-père Somerville, MA a-t-il dirait).

Alors, lorsque je veux savoir combien de la pile a été utilisée, je commence au sommet et recherchez vers le bas de la première valeur qui ne correspond pas à mon modèle.


0 commentaires