ce qui se passe dans le noyau au cours de malloc?
J'étais posé cette question lors d'une interview. Ce qu'ils voulaient savoir quand l'utilisateur appelle la fonction malloc(4) à allouer 4 octets de mémoire comment fonctionne le système d'exploitation (Linux) répondre? Ce qui sous-système répond à cet appel système?
Je lui ai dit que malloc() seront desservis par la gestion de la mémoire sous-système. La fonction malloc() de la mise en œuvre passera par la liste de libérer de la mémoire(mémoire physique), nous l'appellerons liste libre, et de trouver un morceau qui est supérieure ou égale à 4 Octets. Une fois qu'il en trouve un morceau, il va être supprimé de la liste libre et ajouté à une liste utilisée. Alors que la mémoire physique sera mappé sur le processus tas de vma struct. Il ne semble pas être tout à fait satisfait de cette réponse.Comment fonctionne le système de jumelage dans ce processus? Toute aide serait grandement appréciée.
- il est tout à fait fou. malloc() est implémenté dans usermode.
- La plupart du temps. malloc pourrait appeler sbrk.
- Pas nécessairement. La réponse donnée ici implique que
malloc()
alloue de la mémoire physique qui est wrongish. - Également, "système d'exploitation" n'est pas la même que la "noyau"; je pense que, quand on parle d'unix, il est juste de les interpréter comme système d'exploitation "comme désignant" du noyau, bootloader, libc, et fondamental usermode programmes tels que l'init, getty, de connexion et d'amis. Selon exactement comment l'enquêteur l'a formulé sa question, de parler de ce que l'allocateur ne usermode pourrait être une réponse juste.
- J'imagine qu'il n'est pas satisfait avec votre mélange entre l'utilisateur d'appel de malloc et du noyau de la fonction malloc. Ce que vous avez décrit doit être la fonctionnalité de noyau de malloc.
- OS agnostique version: stackoverflow.com/questions/1119134/how-do-malloc-and-free-work
Vous devez vous connecter pour publier un commentaire.
Lorsque les applications de l'espace utilisateur appel
malloc()
, que l'appel n'est pas implémentée dans le noyau. Au lieu de cela, c'est un appel de la bibliothèque (mise en œuvre de la glibc ou similaire).La version courte est que la
malloc
mise en œuvre dans la glibc, obtient soit la mémoire de labrk()
/sbrk()
appel système ou mémoire anonyme viammap()
. Cela donne de la glibc un grand contigus (concernant les adresses de la mémoire virtuelle) partie de la mémoire, qui lemalloc
de mise en œuvre de plus de tranches et en dés dans de plus petits morceaux et les mains de votre application.Ici's un petit
malloc
de mise en œuvre qui va vous donner l'idée, avec beaucoup, beaucoup de liens.Notez que rien ne se soucie de la mémoire physique pour l'instant, qui sont gérées par le noyau d'un système de mémoire virtuelle lorsque le processus de segment de données est modifié par
brk()
/sbrk()
oummap()
, et lorsque la mémoire est référencé (en lecture ou en écriture à la mémoire).Pour résumer:
malloc()
recherche de ses géré morceaux de la mémoire pour voir si il y a un morceau de la mémoire inutilisée qui satisfont les besoins de répartition.malloc()
va essayer de prolonger le processus de segment de données(viasbrk()
/brk()
ou, dans certains cas,mmap()
).sbrk()
se termine dans le noyau.brk()
/sbrk()
appels dans le noyau ajuster certains décalages dans lestruct mm_struct
du processus, de sorte que le processus de segment de données sera plus grande. Au premier abord, il n'y aura pas de physique mappés en mémoire, à l'ajout d'adresses virtuelles qui, prolongeant le segment de données a donné.malloc
mise en œuvre) un gestionnaire de panne donnera un coup de pied dans le piège et vers le bas pour le noyau, où le noyau va affecter la mémoire physique pour le mappage de la mémoire.Il y a une erreur dans votre réponse -
malloc
ne pas physiques de la mémoire directement. Il traite avec mémoire virtuelle paginée - bien que je ne suis pas certain si c'est vrai pour chaque architecture de là-bas.Lorsque votre programme tente d'allouer de la mémoire et de la liste libre ne contient pas un morceau d'égale ou de plus grande taille que la taille demandée, une toute nouvelle page est affectée. La taille de la page est dépendants de l'architecture (4096 octets sur x86). Répartition de Page est quelque chose que seul le noyau peut effectuer, donc un
malloc
appel peut provoquer un appel système. La nouvelle adresse est alors ajouté à la liste libre, etmalloc
manipule la liste libre en fonction de sa mise en œuvre (vérifier la glibc par exemple).