Les ramasse-miettes doivent visiter tous les objets vivants, afin de trouver la mémoire qui peut être récupérée. (Avoir de nombreuses générations retarde juste un peu cela)
Toutes choses étant égales par ailleurs, il est clairement préférable de visiter d'abord l'objet qui est déjà paginé dans la RAM, avant de paginer un autre bloc et donc de paginer un objet.
Une autre possibilité est que lorsque le système d'exploitation souhaite retirer une page de RAM du processus, il est d'abord demandé au GC s'il a une page qui peut être abandonnée sans avoir besoin d'être paginée. Le GC peut être principalement effectué avec le déplacement d'objets d'une page, donc peut effacer cette page dans le délai imparti au système d'exploitation pour avoir besoin d'une page.
Pourtant, je ne me souviens d'aucun garbage collector qui s'intègre au système de pagination du système d'exploitation qui détermine l'ordre dans lequel le GC fonctionne.
la source
Réponses:
Si je me souviens bien, les collecteurs de copie sont censés être compatibles avec la pagination, car le traçage par copie a tendance à améliorer la localisation des références de pointeur. Cela a un effet positif sur le programme (mutateur) qui causera moins de défauts de page lors du suivi des liens, et améliorera également le prochain cycle de collecte car le traçage provoquera également moins de défauts de page. Le programme de suivi (quels pointeurs doivent être traités en premier) peut avoir un impact sur l'efficacité de l'amélioration de la localisation des données. Cela peut être amélioré en mesurant les statistiques sur le nombre d'accès à différents pointeurs dans différents types de cellules.
Maintenant, si vous envisagez un collecteur de traçage en général, vous devez généralement conserver une structure qui conserve la trace des pointeurs qui n'ont pas encore été tracés. Il peut être possible d'organiser cette structure afin que tous les pointeurs en attente pointant sur la même page soient conservés ensemble (bien que cela puisse prendre plus de place, dans certains cas, selon les techniques disponibles pour conserver la liste de ces pointeurs). Une stratégie possible consiste alors à toujours tracer d'abord le plus grand ensemble de pointeurs en attente pointant vers la même page, lorsqu'il n'y a plus de pointeur en attente vers les pages en mémoire.
En ce qui concerne la question du troisième paragraphe, qui a été ajoutée après que j'ai répondu, la collecte de copies est à nouveau une réponse. Le système d'exploitation peut réduire le nombre de pages physiques allouées au moment de la collecte, car les pages sont entièrement libérées. Avec un collecteur de marques et de balayages, l'événement d'une page entière gratuite est probablement beaucoup plus rare, ne valant donc pas un machanisme spécifique à prendre en compte.
Ce genre d'idées est naturel et est probablement décrit dans certains articles. Mais je ne m'en souviens pas tout de suite. Je pense que les premiers articles sur Lisp GC contiennent certaines de ces idées (telles que: voiture ou cdr doit-il être suivi en premier?).
La bonne nouvelle dans ce rôle de copie-collection est également que la pagination est conviviale pour copier la collection car elle augmente l'espace de stockage disponible. Rappelons que le collecteur de copie nécessite en principe deux fois plus d'espace que celui utilisé pour le stockage réel des données. Désormais, l'effet de la pagination dépend également de l'espace d'adressage de la machine et de la mémoire physique disponible. Dans les ordinateurs plus anciens, la mémoire physique était bien inférieure à l'espace d'adressage disponible, de sorte que la pagination était vraiment un bonus d'espace, permettant des politiques telles que la copie du GC. Même lorsque l'espace physique est aussi grand que l'espace d'adressage, on peut vouloir le partager, de sorte que le processus utilisant un GC ait moins d'espace d'adressage sans pagination (voir pagination). Ces remarques sont quelque peu dépassées par l'utilisation de collecteurs générationnels. Ils utilisent généralement la collection de copies pour la jeune génération précisément en raison de ces qualités et parce que la jeune génération est généralement de courte durée.
Ensuite, vous avez toutes les interactions du GC générationnel avec le système de cache, qui ont été discutées dans une question précédente: les récupérateurs de génération sont - ils intrinsèquement compatibles avec le cache?
Pour plus d'informations sur ces problèmes, je rechercherais sur le Web avec, par exemple, les mots clés garbage collection et locality .
la source
Emery Berger, Matthew Hertz et Yi Feng ont travaillé sur ce sujet.
Ceci est une vidéo de la conversation d'Emery à ce sujet, et il a écrit un document Garbage Collection Without Paging
Pour certaines raisons, il ne semble pas y avoir beaucoup de travail plus tard, ni aucune utilisation du «monde réel». À la fin de l'article, il est écrit «Nous développons une variante simultanée de l'algorithme de collecte de signets» , mais je ne peux pas le retrouver.
CRAMM: la prise en charge de la mémoire virtuelle pour les applications récupérées sur les déchets cherche à modifier le système d'exploitation pour que le GC crée moins de pagination.
Utilisation de Page Residency pour équilibrer les compromis dans le traçage de la récupération de place
la source