web-dev-qa-db-fra.com

que se passe-t-il dans le noyau pendant malloc?

On m'a posé cette question lors d'une interview. Ce qu'ils voulaient savoir, c'est quand l'utilisateur appelle malloc (4) pour allouer 4 octets de mémoire, comment le système d'exploitation (Linux) réagit-il? Quel sous-système répond à cet appel système?

Je lui ai dit que malloc () serait desservi par le sous-système de gestion de la mémoire. L'implémentation malloc () passera par la liste de la mémoire libre (mémoire physique), nous l'appellerons liste libre, et trouverons un bloc approprié supérieur ou égal à 4 octets. Une fois qu'il trouve un tel morceau, il sera supprimé de la liste gratuite et ajouté à une liste utilisée. Ensuite, cette mémoire physique sera mappée à la structure vma du tas de processus. Il ne semblait pas très satisfait de cette réponse. Comment le système de jumelage s'inscrit-il dans cela? Toute aide serait grandement appréciée.

48
liv2hak

Lorsque les applications de l'espace utilisateur appellent malloc(), cet appel n'est pas implémenté dans le noyau. Au lieu de cela, il s'agit d'un appel de bibliothèque (implémenté glibc ou similaire).

La version courte est que l'implémentation malloc dans la glibc obtient la mémoire de l'appel système brk()/sbrk() ou de la mémoire anonyme via mmap(). Cela donne à la glibc un gros morceau de mémoire contigu (en ce qui concerne les adresses de mémoire virtuelle), que l'implémentation malloc découpe et découpe en petits morceaux et distribue à votre application.

Ici est une petite implémentation de malloc qui vous donnera l'idée, ainsi que de nombreux liens.

Notez que rien ne se soucie encore de la mémoire physique - qui est gérée par le système de mémoire virtuelle du noyau lorsque le segment de données de processus est modifié via brk()/sbrk() ou mmap(), et lorsque la mémoire est référencée (par une lecture ou une écriture dans la mémoire).

Résumer:

  1. malloc() recherchera ses morceaux de mémoire gérés pour voir s'il y a un morceau de mémoire inutilisée qui satisfait les exigences d'allocation.
  2. A défaut, malloc() tentera d'étendre le segment de données de processus (via sbrk()/brk() ou dans certains cas mmap()). sbrk() se retrouve dans le noyau.
  3. Les appels brk()/sbrk() dans le noyau ajustent certains décalages dans le struct mm_struct du processus, le segment de données de processus sera donc plus grand. Au début, il n'y aura pas de mémoire physique mappée aux adresses virtuelles supplémentaires fournies par l'extension du segment de données.
  4. Lorsque cette mémoire non mappée est touchée pour la première fois (probablement une lecture/écriture par l'implémentation malloc), un gestionnaire de pannes se déclenchera et se piégera dans le noyau, où le noyau affectera de la mémoire physique à la mémoire non mappée.
62
nos

Il y a une erreur dans votre réponse - malloc ne traite pas la mémoire physique directement. Il s'agit de mémoire virtuelle paginée - même si je ne suis pas certain que ce soit vrai pour toutes les architectures.

Lorsque votre programme essaie d'allouer de la mémoire et que la liste gratuite ne contient pas de bloc de taille égale ou supérieure à la taille demandée, une nouvelle page entière est allouée. La taille de la page dépend de l'architecture (4096 octets sur x86). L'allocation de page est quelque chose que seul le noyau peut effectuer, donc un appel malloc peut provoquer un appel système. La nouvelle adresse est alors ajoutée à la liste libre, et malloc manipule la liste libre en fonction de son implémentation (vérifiez la glibc par exemple).

10
jweyrich