Ne malloc paresseusement créer la sauvegarde des pages pour une allocation sur Linux (et d'autres plates-formes)?
Sur Linux si je malloc(1024 * 1024 * 1024)
, ce qui ne malloc faire réellement?
Je suis sûr qu'il attribue une adresse virtuelle à l'attribution (en parcourant la liste d'espace libre et la création d'une nouvelle cartographie si nécessaire), mais faut-il réellement créer 1 GiB vaut la peine de changer l'ordre des pages? Ou faut-il mprotect
la plage d'adresses et de créer les pages lorsque vous avez réellement toucher comme mmap
n'?
(Je suis en précisant Linux parce que la norme est silencieuse sur ces sortes de détails, mais je serais intéressé de savoir ce que les autres plateformes de faire aussi bien.)
- Question intéressante; je serais curieux de connaître le comportement sur d'autres plates-formes, mais bravo pour le verrouillage de cette question vers le bas pour Linux.
- il fut un temps où ce qui semblait avoir beaucoup de mémoire...
Vous devez vous connecter pour publier un commentaire.
Linux différé de répartition de page, aka. optimiste de l'allocation de mémoire'. Le mémoire que vous obtenez de retour de malloc n'est pas étayée par rien, et quand vous la touchez, vous pourriez obtenir un OOM condition (si il n'y a pas d'espace de swap pour la page que vous demandez), auquel cas un processus est résilié sans ménagement.
Voir, par exemple, http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html
9. De mémoire (partie de Le noyau Linux, Quelques remarques sur le Noyau Linux par Andries Brouwer) est un bon document.
Il contient les programmes suivants qui démontrent Linux de la gestion de la mémoire physique et réelle de la mémoire et de explique le noyau lui-même.
En général, le premier programme de démonstration permettra d'obtenir une très grande quantité de mémoire avant de malloc() renvoie la valeur NULL. Le deuxième programme de démonstration permettra d'obtenir une plus petite quantité de mémoire, maintenant que précédemment obtenu mémoire est effectivement utilisé. Le troisième programme sera le même montant que le premier programme, et puis il est mort lorsqu'il veut utiliser sa mémoire.
Programme de démonstration 1: allouer de la mémoire sans l'utiliser.
Programme de démonstration 2: allouer de la mémoire et fait toucher tous.
Programme de démonstration 3: alloue d'abord, et de les utiliser plus tard.
(Sur un système qui fonctionne bien, comme Solaris, les trois programmes de démonstration obtenir la même quantité de mémoire et ne se bloque pas, mais voir malloc() renvoie NULL.)
J'ai donné cette réponse à un autre post sur le même sujet:
Certains d'allocateurs de paresseux?
Cela commence un peu hors sujet (et puis je vais l'attacher à votre question), mais ce qui se passe est similaire à ce qui se passe quand vous la fourche d'un processus dans Linux. Lorsque la fourche il y a un mécanisme appelé la copie sur écriture qui ne copie que la mémoire de l'espace pour le nouveau processus lorsque la mémoire est écrit trop. De cette façon, si la fourche processus exec est un nouveau programme tout de suite, alors vous avez sauvé la surcharge de la copie de l'original des programmes de la mémoire.
Pour en revenir à votre question, l'idée est similaire. Comme d'autres l'ont souligné, demandant à la mémoire vous fait de l'espace de mémoire virtuelle immédiatement, mais les pages ne sont attribués lors de leur écrire.
Quel est le but de tout cela? Il rend fondamentalement mallocing de la mémoire plus ou moins constante de temps de l'opération Big O(1) au lieu d'un Grand O(n) opération (similaire à la façon dont le Linux planificateur de spreads, c'est le travail au lieu de le faire dans un gros morceau).
Pour démontrer ce que je veux dire j'ai fait l'expérience suivante:
La bigmalloc programme alloue 20 millions d'entiers, mais ne pas faire n'importe quoi avec eux. deadbeef écrit un int à chaque page, résultant dans 19531 écrit et justwrites alloue 19531 ints et les zéros de l'en sortir. Comme vous pouvez le voir deadbeef prend 100 fois plus de temps pour exécuter que bigmalloc et environ 50 fois plus longtemps que justwrites.
.
.
Malloc alloue de la mémoire de blocs gérés par la libc. Lorsque de la mémoire supplémentaire est nécessaire, la bibliothèque va vers le noyau à l'aide de l'appel système brk.
Le noyau alloue les pages de mémoire virtuelle du processus appelant. Les pages sont gérées comme des ressources possédées par le processus. Pages physiques ne sont pas affectées lorsque la mémoire est brk avais. Lorsque le processus accède à un emplacement de mémoire dans l'un des brk avais pages d'un défaut de page se produit. Le noyau permet de vérifier que la mémoire virtuelle a été alloué et procède à une carte physique de la page à la page virtuelle.
Page allocation n'est pas limitée à l'écrit et est tout à fait distincte de la copie sur écriture. Tout d'accéder, de lire ou d'écrire les résultats dans un défaut de page et de la cartographie d'une page physique.
Noter que la pile de la mémoire est automatiquement adressé. C'est, explicitement brk n'est pas nécessaire de mapper des pages de mémoire virtuelle qui est utilisé par la pile.
Sur Windows, les pages sont engagés (qui est, la quantité de mémoire disponible va vers le bas), mais il ne sera pas alloué jusqu'à ce que vous touchez les pages (lecture ou écriture).
Sur la plupart des systèmes de type Unix, il gère les brk limite. La VM ajoute des pages lorsqu'il est frappé par le processeur. Au moins Linux et Les bsd ce faire.