2010-07-02 6 views
4

Y a-t-il des implémentations CLR qui ont une récupération de place déterministe?GC déterministe dans le CLR?

Les pauses non déterministes dans le MS CLR GC empêchent .Net d'être un environnement approprié pour le développement en temps réel.

Metronome GC et BEA JRockit dans Java sont deux implémentations GC déterministes que je connais.

Mais y a-t-il des équivalents .Net?

Merci

+0

Beaucoup d'informations connexes: http://stackoverflow.com/questions/85283/how-to-avoid -garbage-collection-en-temps-réel-c-application –

+6

Windows n'est pas un système d'exploitation temps réel, donc évidemment le Microsoft CLR aura du mal à fournir un environnement approprié pour les applications en temps réel. –

+0

@Brian extensions tierces à Windows XP peuvent en faire un système d'exploitation en temps réel. –

Répondre

5

Il n'y a aucun moyen de rendre le GC déterministe, attendez-vous évidemment à appeler GC.Collect() exactement chaque seconde en utilisant un timer ;-).

Le GC contient cependant un mécanisme de notification (depuis .NET 3.5 SP1) qui vous permet d'être averti quand une collecte de gen 2 est sur le point de se produire. Vous pouvez lire à ce sujet here.

Le CPG contient maintenant également plusieurs modes de latence qui permettent d'empêcher toute collecte de CPG. Bien sûr, vous devriez être très prudent avec cela, mais est particulièrement utile pour les systèmes en temps réel. Vous pouvez en lire plus à ce sujet here.

+0

Excellente idée. J'ai mis GC.Collect() sur le minuteur 250ms. Merci beaucoup. – DayOne

+1

Juste pour ajouter, cela ne le rend pas déterministe - il peut toujours s'appeler chaque fois qu'il aime et vous n'avez aucune idée de ce qu'il va GC, ou combien de temps ça va prendre. Et votre minuterie ne pourra pas cocher * exactement * toutes les 250ms. –

+4

J'espérais que le smiley à la fin de cette phrase m'indiquait clairement que je n'étais pas sérieux. Mais sérieusement, appelez 'GC.Collect()' toutes les 250 ms. C'est une très mauvaise idée. Tout en ayant les collectes à des intervalles déterministes, vous auriez de très mauvaises performances car vous déclenchez de nombreuses collectes de gen 2. – Steven

2

Non, il y a non. D'après mon expérience, .net ne peut pas être utilisé pour créer des systèmes en temps réel pour de nombreuses raisons, pas seulement pour la collecte des ordures. C ou C++ sont un meilleur choix. De même, les systèmes d'exploitation modernes ne fournissent pas de planification déterministe et concernent toutes les applications, quelle que soit la langue.

0

Vous devez contrôler le CPG vous-même afin d'obtenir un comportement prévisible en temps réel, mais si vous le faites, vous pouvez également ne pas utiliser un langage géré.

Pour les systèmes en temps réel, vous devez contrôler tout ce qui est en cours d'exécution. Il y a des modifications tierces à Windows XP qui le rendent en temps réel (je ne me souviens pas si c'est dur ou dur en temps réel).

Option totalement irréalisable. Regardez dans Cosmos OS - écrit en C# et compilé à l'assembleur je pense - pourrait être en mesure de faire quelque chose avec ça :)

Questions connexes