7
votes

Taille de tas initiale allouée à un programme C ++ sur UNIX

Quelle est la taille initiale de la taille du tas allié typiquement à un programme C ++ en cours d'exécution sur un système d'exploitation basé sur UNIX?

Comment est-il décidé par le compilateur G ++ si elle a du tout un rôle à jouer à cet égard?


0 commentaires

4 Réponses :


5
votes

Le tas est étendu de manière dynamique en demandant au système d'exploitation pour plus de mémoire si nécessaire.

Ce n'est pas déterminé par le compilateur, exactement, mais par la bibliothèque.

Il est plus typique de fixer la taille du tas dans les langages dynamiques avec GC. En C et C ++, il est simple de demander au système d'exploitation pour plus de mémoire, car il est évident quand vous en avez besoin. En conséquence, la taille initiale du tas importe très peu et n'est qu'une décision de mise en œuvre de la part de la bibliothèque d'allocation.


3 commentaires

Merci pour la réponse DigitalRoss.


@DigitalRoss: Voulez-vous s'il vous plaît expliquer "ce n'est pas déterminé par le compilateur, exactement, mais par la bibliothèque". Je peux comprendre que ce n'est pas déterminé par Compiler, mais comment par bibliothèque? Merci.


Dans C et C ++, la politique du tas est entraînée par événement. Le compilateur génère des appels d'allocation de tas en C ++, pas dans C. Lorsque le compilateur génère un appel à un allocator, il est maintenant entre les mains de la bibliothèque, car une fonction réelle est appelée. Cette fonction tente d'allouer du tas (peut-être que quelque chose a été libéré récemment), mais si elle échoue, cela appelle simplement le système d'exploitation pour obtenir plus de mémoire pour le processus dans son ensemble et ajoute cette mémoire supplémentaire au tas.



7
votes

pour C ++, quelle que soit la plate-forme, le tas est presque toujours prolongé de manière dynamique en demandant au système d'exploitation pour plus de mémoire si nécessaire. Sur certaines plates-formes intégrées, ou certaines plateformes très anciennes, cela peut ne pas être vrai, mais vous avez probablement une bonne idée de la quantité de tas que vous avez à cause de la nature de l'environnement.

sur les plates-formes UNIX C'est doublement vrai. Même la plupart des plates-formes intégrées Unix fonctionnent de cette façon.

sur des plates-formes qui fonctionnent comme ceci, la bibliothèque n'a généralement aucune limite interne, mais s'appuie plutôt sur le système d'exploitation pour le dire qu'il ne peut plus avoir de mémoire. Cela peut arriver bien après que vous ayez réellement demandé plus de souvenirs que ce n'est disponible pour une variété de raisons.

sur la plupart des systèmes UNIX, il existe une limite difficile sur la quantité totale de mémoire qu'un processus peut avoir. Cette limite peut être interrogée avec l'appel système getrlimit . La constante correspondante est rlimit_as. Cette limite régit le nombre maximal de pages de mémoire pouvant être attribuées à un processus et limite directement la quantité d'espace de tas disponible.

Malheureusement, cette limite ne dit pas directement combien de tas vous pouvez utiliser. Les pages de mémoire sont attribuées à un processus à la suite d'appels de MMAP, pour contenir le code de programme lui-même et pour la pile de processus.

En outre, cette limite est fréquemment définie dans l'excédent de la mémoire totale disponible sur l'ensemble du système si vous ajoutez une mémoire physique et un espace d'échange. Donc, en réalité, votre programme fonctionnera fréquemment de mémoire avant que cette limite soit atteinte.

Enfin, certaines versions des pages UNIX Over-Attribuent. Ils vous permettent d'allouer un nombre massif de pages, mais ne trouvez que la mémoire pour ces pages lorsque vous leur écrivez. Cela signifie que votre programme peut être tué pour être manqué de mémoire, même si tous les appels de répartition de la mémoire réussissent. La justification est la possibilité d'allouer d'énormes tableaux qui ne seront jamais utilisés que partiellement.

Donc, en bref, il n'y a pas de taille typique et pas de bon moyen de savoir quelle est la taille vraiment.


0 commentaires

0
votes

En bref, il n'y a pas de moyen définitif de configurer la taille du tas. Mais nous avons un moyen de fort> impact fort> la taille de la mémoire en tas, car la taille de la mémoire en tas fait partie de la mémoire de disponibilité totale.

Vous pouvez obtenir la quantité totale de mémoire disponible dans le SYTEM par: P>

 sysctl -w vm.overcommit_memory=2


1 commentaires

Ceci est spécifique à Linux et ne concerne pas la mémoire de processus particulière, mais sur la façon dont le noyau Linux gère la mémoire virtuelle entre les processus. Traditionnellement UNIX SECTEGEMENT DE DONNÉES GESTIONS AVEC ULIMIT.



0
votes

Vous pouvez essayer d'écrire un petit programme avec une boucle (vraie). Après l'exécution, "CAT / PROC / {PID} / MAPS" Vous connaissez sa taille de tas initiale.


0 commentaires