Pourquoi les plates-formes mobiles ne prennent-elles pas en charge la récupération de place générationnelle?


11

Windows Phone / Xbox et Android ne prennent pas en charge la récupération de place générationnelle. C'est frustrant pour beaucoup de programmeurs. Il semble y avoir une raison d'ingénierie légitime, mais je ne peux pas le comprendre.

Les téléphones actuels ont plus de mémoire et probablement de meilleurs processeurs que les ordinateurs de bureau / portables exécutant .NET 1.1 avec GC générationnel en 2001, et je ne peux penser à aucune raison pour laquelle les processeurs ARM seraient plus mauvais au GC générationnel que x86. Il y a également moins de besoin de multitâche sur les téléphones et les consoles, donc il y a relativement plus d'espace libre.

Alors qu'est-ce qui donne?

Edit: Quelques points à clarifier:

  • Ces plates-formes utilisent exclusivement la récupération de place pour les applications, donc ma question n'est pas de savoir pourquoi GC n'est pas pris en charge; ma question est de savoir pourquoi la collecte des ordures générationnelle ne l'est pas.
  • La raison pour laquelle les gens sont frustrés par le manque de GC générationnel est que le GC non générationnel est extrêmement inefficace. (Cela signifie que la durée de vie de la batterie n'est pas la raison.)
  • Je crois qu'il y a une raison technique honnête au manque de support générationnel du GC. Ce n'est pas une question rhétorique.

Le téléphone Windows (la génération actuelle) a une récupération de place. Il ne fonctionne que lorsque la mémoire de l'appareil est insuffisante msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@TomSquires Le GC sur WP7 s'exécute en fait une fois tous les 1 Mo d'allocations. Je pense que vous pensez peut-être au gestionnaire de tâches de crénage des anciens processus.
Rei Miyasaka

Réponses:


5

Je pense que le plus gros problème est la durée de vie de la batterie. La collecte des ordures est une commodité pour les développeurs achetée au prix de cycles CPU supplémentaires sur l' ordinateur de l'utilisateur . Lorsque votre processeur est branché (ordinateur de bureau) ou dispose d'une batterie relativement grande (ordinateur portable), vos utilisateurs sont plus disposés à payer pour la commodité des développeurs avec l'énergie supplémentaire consommée par le processeur lors de la collecte des ordures. Lorsque la batterie est relativement petite, les utilisateurs peuvent ne pas être aussi généreux. Ils peuvent vouloir cette barre supplémentaire pour eux-mêmes - peut-être pour parler à leurs amis, ou pour tuer quelques porcs supplémentaires dans une rencontre mortelle avec des oiseaux en colère.

Quelles que soient les raisons des utilisateurs, les développeurs de systèmes d'exploitation ne veulent pas se faire une idée que les appareils exécutant leur système d'exploitation déchargent la batterie plus rapidement que ceux qui exécutent le système d'exploitation de leurs concurrents. Ils achètent donc une meilleure perception de la durée de vie prévue de la batterie de leurs appareils au prix de la commodité des développeurs: pour eux, votre douleur n'est pas grave, tant que les utilisateurs sont satisfaits des appareils.


3
Le GC générationnel est beaucoup plus efficace dans la plupart des cas, en fait, vous pensez donc que cela réduirait le nombre de cycles d'horloge. Cela n'explique pas non plus pourquoi quelque chose comme Xbox n'a pas de GC générationnel, car les Xbox sont branchées.
Rei Miyasaka

Eh bien, c'est ce que j'ai entendu sur Stack Overflow. Je ne connais cependant pas grand-chose aux XBox.
dasblinkenlight

3
Cela ne répond toujours pas à la question. Même si la récupération de place a utilisé plus de puissance que l'allocation explicite (ce qui est très discutable - et je n'y entrerai pas), la question n'est pas si / pourquoi l'allocation explicite est meilleure que GC sur mobile, c'est si / pourquoi non GC générationnel est meilleur que GC générationnel sur mobile.
Rei Miyasaka

1
@Rei: Les jeux exigent généralement que tout soit déterministe; au moins, ils ont besoin de performances prévisibles. Quelques nanosecondes gaspillées ici et quelques nanosecondes gaspillées là-bas - à des moments imprévisibles - peuvent gâcher une expérience de jeu. Les ramasseurs de déchets générationnels sont imprévisibles.
Ant

2
@djacobson Je ne pense pas que ce soit vrai. Comme je l'ai dit dans la question, si ce n'étaient que les plates-formes de Microsoft qui négligent le GC générationnel, ce serait probablement juste une raison logistique / bureaucratique, et je ne prendrais pas la peine de demander. Mais Android souffre également du même problème, c'est donc probablement une raison technique, ce qui signifie que quelqu'un sur P.SE pourrait avoir une réponse définitive.
Rei Miyasaka

3

Ma meilleure supposition serait que ce n'est pas une raison technique, mais que les développeurs de ces plateformes téléphoniques n'ont tout simplement pas encore fait l'effort. Je sais que ce n'est pas la réponse que vous espérez, mais si vous avez fait un développement mobile, vous avez probablement remarqué qu'il y a beaucoup de fruits à suspendre. Ils n'ont probablement tout simplement pas eu le temps d'écrire plusieurs implémentations GC, de les affiner toutes et de sélectionner celle qui fait le mieux. Pourquoi est-ce que quelqu'un passerait du temps à réinventer la roue alors qu'il pourrait à la place libérer de nouvelles API flashy et mal pensées? ;)

FWIW, et comme confirmation de ma théorie, le nouveau runtime d'Android (ART) a un GC générationnel et ils prévoient d'avoir un GC de compactage à l'avenir .


2

Il y a un coût supplémentaire pour la collecte des ordures générationnelle.

Le collecteur générationnel doit pouvoir savoir quand des objets plus anciens pointent vers des objets plus récents. Nous ne pouvons pas retracer l'objet plus ancien pour trouver ces cas, car cela irait à l'encontre du but de la collecte générationnelle. Au lieu de cela, nous devons en quelque sorte détecter quand cela se produit et en prendre note pour la phase de collecte. Quelle que soit la façon dont vous allez procéder, cela ajoutera des frais généraux au processus de collecte.

Sur un système de bureau, votre système d'exploitation est occupé à faire toutes sortes de choses avec de la mémoire dans les coulisses. Il prend en charge des fonctionnalités telles que le partage de pages entre les processus, l'écriture de pages inutilisées sur le disque, le mappage de la mémoire entre les processus, etc. D'après ce que je comprends, certaines des fonctionnalités utilisées permettent de suivre plus efficacement les pointeurs modifiés. L'opération se préoccupe déjà de ce que vous modifiez en mémoire, donc l'utilisation de ces informations à de nouvelles fins n'est pas un problème.

Je soupçonne que les systèmes mobiles ne font pas la même chose dans les coulisses. En conséquence, ils n'ont pas le même niveau d'informations qu'un bureau. Par conséquent, les frais généraux liés à la mise en œuvre d'une collection générale sont plus élevés et moins susceptibles d'en valoir la peine.


Pour tirer le meilleur parti des générations GC, il faut utiliser des barrières d'écriture pour détecter quand des objets de génération plus ancienne sont écrits. D'un autre côté, même si la partie "marque" du GC ne pouvait pas bénéficier des générations, je pense que l'on pourrait encore améliorer les performances en ne déplaçant les choses que dans les générations plus récentes (en fait, en faisant la phase "tag" sur les générations plus anciennes comme ainsi que les plus récents pourraient être utiles s'ils permettaient de savoir combien de mémoire récupérable existait à chaque génération).
supercat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.