9
votes

Différents programmes obtiennent-ils leur mémoire d'un tas commun ou d'un tas séparé?

Je suis un peu confus. Comment Glibc sur Linux alloue sa mémoire à divers programmes. Ce sont quelques questions:

  1. est-il alloué à un tas commun (c'est-à-dire un tas commun sur tous les processus de Linux) ou y a-t-il un tas alloué pour chaque processus du système.

  2. Supposons également si je compose une bibliothèque statique et que cela devient finalement lié de manière statique au processus principal, comment cela obtiendra sa mémoire? Est-il déjà associé à un autre tas (comme nous l'avons déjà compilé) ou obtiendra sa mémoire du tas du processus principal.


2 commentaires

Voici une réponse qui illustre le modèle de mémoire Linux: Stackoverflow.com / Questions / 2048007 / Linux-IA-32-Memory-Modèle


Voir Comment le noyau gère votre mémoire pour Un aperçu ... Et puis certains! Voilà pour être "simple" ;-)


3 Réponses :


5
votes
  1. Il n'y a pas de tas communs dans le sens Libc , cela violerait la protection des processus et les règles de mémoire virtuelle. Chaque processus maintient son propre tas. Le noyau (avec l'aide du MMU dans le processeur) maintient les tables de mémoire virtuelle qui correspondent aux adresses virtuelles à la mémoire réelle.

  2. Les bibliothèques statiques ne sont rien de plus que de relier le code à la compilation - il n'y a pas de concept de temps d'exécution d'une bibliothèque statique. C'est l'une et la même chose que le processus et utilisera son tas.


6 commentaires

À partir de votre point 2), les loons signifient qu'une mémoire partagée aura sa propre mémoire et elle est différente du tas utilisé par le processus principal du système?


Les bibliothèques partagées utiliseront le tas du processus, mais leur code sera partagé entre les processus.


Et qu'en est-il de la bibliothèque dynamique. Ils partagent également le tas du processus principal ou ont un tas différent pour eux.


a obtenu ma réponse à ce Stackoverflow.com/questions/1178127 / ... Tout pour votre soutien.


Je comprends la mémoire virtuelle et les tables de mémoire dans le noyau. Mais chaque processus a son propre tas? Imaginez que le tas par défaut est de 4 Mo au maximum. Chaque processus utilisera-t-il ces 4 Mo, même s'ils n'allouent rien du tout, ou le noyau contrôlera-t-il ce que le processus affecte? Le tas est-il similaire à la pile, par rapport à chaque processus ayant son instance?


@Spidey: Absolument. Sa garantie d'être unique. Notez que même si vous demandez et obtenez, disons 4 Mo, les systèmes modernes peuvent ne pas commettre beaucoup de mémoire. Vous pouvez lire beaucoup sur la mémoire surmonter.



0
votes

Le tas (et toute autre mémoire en écriture - pile, BSS, etc.) est séparé pour chaque processus. Dans le processus, la mémoire peut être partagée entre les threads et ne peut pas être (en cas de stockage local de fil). Cela est vrai pour les applications nouvellement créées. Pour une application Fork , la mémoire est partagée jusqu'à ce que l'un des processus écrit à celui-ci (copie-écriture).

Toute mémoire en lecture seule (comme une bibliothèque partagée ou exécuter la même application plusieurs fois) sera probablement partagée entre les processus. Ceci est une décision pour le chargeur exécutable du noyau.

Une bibliothèque statique est liée directement à l'exécutable. Il existe donc une copie séparée pour chaque exécution exécutable (à moins que ce soit plusieurs instances de la même exécutable).


0 commentaires

0
votes

Chaque processus a son propre tas virtuel. Cela peut toutefois partager la RAM physique, ou non, en fonction de l'accès. Voir copier-on-écrivez pour un certain fond.


0 commentaires