1

J'ai appris qu'avec la liaison d'adresse d'exécution, le programme peut se voir attribuer des trames dans la mémoire physique de manière non-contiguë. En outre, comme décrit here et here, chaque segment du programme dans l'espace d'adressage logique est contigu, mais tous les segments ne sont pas placés côte à côte. Les segments text, data, BSS et heap sont placés ensemble, mais pas le segment de pile. En d'autres termes, il existe des pages entre les segments de tas et de pile (entre le saut de programme et le sommet de la pile) dans l'espace adresse logique qui ne sont pas mappés à des trames dans l'espace d'adressage physique. -contiguous dans le cas d'une liaison d'adresse d'exécution.La disposition de la mémoire d'un programme dépend-elle de la technique de liaison d'adresse?

enter image description here

Mais qu'en est la mise en page de la mémoire dans le cas de la compilation ou la charge de temps de liaison? Maintenant que l'espace d'adressage logique n'est pas un espace d'adressage abstrait mais l'espace d'adressage physique réel, comment un programme est-il disposé dans la mémoire physique? Plus précisément, comment le segment de pile est-il placé dans l'espace d'adressage physique d'un programme? Est-il placé avec le reste des segments ou séparément comme dans le cas de la liaison à l'exécution?

Répondre

0

Pour répondre à vos questions, je dois d'abord expliquer un peu sur l'allocation stack et heap dans les systèmes d'exploitation modernes. La pile comme son nom l'indique est l'allocation de mémoire continue, où cpu utilise les commandes push et pop pour ajouter/supprimer des données du haut de la pile. Je suppose que vous savez déjà comment fonctionne la pile. magasins de processus - adresse de retour, arguments de fonction et variables locales sur la pile. Chaque fois qu'une fonction est appelée, plus de données sont poussées (cela pourrait finalement conduire à un débordement de pile si aucune donnée n'est sautée - une récursion infinie?). La taille de pile est fixée pour un programme lorsqu'il est chargé dans la mémoire. La plupart du langage de programmation vous permet de décider de la taille de la pile lors de la compilation. Sinon, ils décideront d'un défaut. Sous Linux, la taille maximale de la pile (limite stricte) est limitée à ulimit. Vous pouvez vérifier et définir la taille par ulimit -s. L'espace du tas n'a cependant pas de limite supérieure dans les systèmes * nix (dépend, confirmez-le en utilisant ulimit -v), chaque programme commence avec une quantité de tas par défaut/définie et peut augmenter autant que nécessaire. L'espace de tas dans un processus est en fait deux listes liées, free et used blocs. Chaque fois qu'une allocation de mémoire est requise à partir de tas, un ou plusieurs blocs libres sont combinés pour former un bloc plus grand et affectés à la liste utilisée en tant que bloc unique. Libérer signifie supprimer un bloc de la liste utilisée à la liste libre. Après avoir libéré les blocs, tas peut avoir une fragmentation externe. Maintenant, si le nombre de blocs libres ne peut pas contenir l'ensemble des données, le processus demandera plus de mémoire à partir du système d'exploitation. Généralement, les nouveaux blocs sont alloués à partir d'une adresse plus élevée. Ainsi, nous montrons le diagramme de direction vers le haut pour la croissance du tas. Je reformule - Tas n'alloue pas de mémoire en continu dans une direction plus élevée.

Maintenant, pour répondre à vos questions.

Avec la compilation ou de l'adresse de charge de temps de liaison, comment la pile et les segments de segment de mémoire placé dans l'espace d'adressage physique d'un programme?

La pile fixe est allouée au moment de la compilation, avec une certaine quantité de mémoire. Comment sont placés ont été expliqués ci-dessus.

est l'espace entre le tas et la pile réservée au programme ou est disponible pour le système d'exploitation à utiliser pour d'autres programmes?

Oui c'est réservé au programme. Le processus peut cependant demander plus de mémoire pour ajouter des blocs libres dans son tas. C'est différent de partager son propre tas.

Note: Il y a beaucoup de sujets qui peuvent être traités ici car la question est large. Certains d'entre eux sont - la collecte des ordures, la sélection de bloc, la mémoire partagée etc. Je vais bientôt ajouter les références ici.

Références: -