garbage collection - collector - ¿Cuál es el "recolector de basura mayoritariamente concurrente"?
garbage collector c# (2)
Puede encontrar una descripción accesible en el documento "Colección de basura en su mayoría paralela" por Bohem, Demers y Shenker (Actas de la Conferencia ACM SIGPLAN ''91 sobre diseño e implementación del lenguaje de programación, SIGPLAN Notices 26, 6 (junio de 1991), págs. 157-164).
Escriben:
Supongamos que somos capaces de mantener un conjunto de bits sucios virtuales, que se configuran automáticamente cada vez que se escriben las páginas correspondientes de la memoria virtual. (Una implementación aceptable de esta característica puede obtenerse protegiendo las páginas y capturando las fallas de escritura resultantes, sin modificaciones en el kernel del sistema operativo subyacente, una implementación en el núcleo del sistema operativo sería, por supuesto, más eficiente.) Para cualquier colector de seguimiento definido para la operación stop-the-world, considere el siguiente algoritmo de recopilación. Al comienzo de la colección, borre todos los bits sucios virtuales. Realice la operación de rastreo tradicional en paralelo con el mutador. Los bits sucios virtuales se actualizarán para reflejar las escrituras del mutador. Una vez completado el seguimiento, detenga el mundo y trace desde todos los objetos marcados que se encuentran en páginas sucias. (Los registros se consideran sucios.) En este punto, todos los objetos accesibles se marcan y la basura se puede recuperar de forma segura.
...
En este algoritmo, la fase de seguimiento en paralelo proporciona una aproximación al verdadero conjunto alcanzable. Los únicos objetos no marcados por este proceso de rastreo paralelo que son efectivamente alcanzables deben ser accesibles desde los objetos marcados que se han escrito desde que se rastrearon. La fase de seguimiento stop-the-world se remonta a todos los objetos, de modo que al final ningún objeto verdaderamente alcanzable permanece sin marcar.
Cuando se refieren al rastreo de recolectores de basura , se están refiriendo a recolectores que comienzan desde los "nodos raíz" designados (generalmente los registros del programa) y siguen punteros a cada objeto alcanzable. Todo lo inalcanzable es basura.
En resumen, un recopilador en su mayoría paralelo hace la mayor parte del trabajo en paralelo, luego detiene la ejecución del programa para corregir los cambios que el programa realizó mientras el recopilador estaba funcionando. Por lo tanto, es "principalmente paralelo".
Conozco los conceptos de stop-the-world, incremental, paralelo, concurrente, (soft / hard) recolectores de basura en tiempo real. Pero no puedo entender la mayoría de las veces concurrente GC. ¿Es diferente con GC concurrente? ¿Cual es la diferencia? ¿Por qué se llama en su mayoría ?
Conozco los conceptos de stop-the-world, incremental, paralelo, concurrente, (soft / hard) recolectores de basura en tiempo real. Pero no puedo entender la mayoría de las veces concurrente GC. ¿Es diferente con GC concurrente? ¿Cual es la diferencia? ¿Por qué se llama en su mayoría?
Al igual que muchos otros temas, la recolección de basura está envuelta en una niebla de ambigüedad terminológica. Boehm es particularmente famoso por usar términos convencionales de maneras no convencionales, pero debemos perdonarlo porque fue pionero en el campo en un momento en que los significados convencionales aún no se habían osificado. :-)
Tal como lo entiendo, el GC stop-the-world se refiere a un algoritmo que suspende todos los hilos del mutador durante toda la duración de un ciclo GC, por ejemplo, cuando se marca todo el montón. Por ejemplo, el .NET Server GC hace esto e incurre en grandes tiempos de pausa de 300ms como consecuencia. Los GC incrementales realizan un poco de trabajo principal de GC en cada ciclo de GC menor, por ejemplo, "cortes mayores" en el GC de OCaml. Paralelo significa que el GC usa múltiples hilos para acelerar el proceso de recolección de basura. Concurrent GC significa que el GC funciona al mismo tiempo que los mutadores, por ejemplo, la estación de trabajo .NET GC. El tiempo real es difícil de definir, originalmente significaba tiempos de pausa máximos acotados, pero ahora también significa la utilización mínima de los mutadores (MMU), para evitar el problema patológico de un GC que nunca pausa a un mutador por mucho tiempo, nunca permitiendo que se ejecute. Según el nuevo libro de Richard Jones, un GC sobre la marcha nunca suspende más de un mutador a la vez (es decir, no hay fase de detener el mundo) aunque sospecho que quiso decir que los mutadores están suspendidos independientemente el uno del otro. Finalmente, un GC mayoritariamente concurrente es aquel que suspende todos los subprocesos de los mutadores simultáneamente, pero solo durante un corto período de tiempo y no para un ciclo GC arbitrariamente largo. Por lo tanto, los mutadores pueden funcionar libremente la mayor parte del tiempo mientras el GC está funcionando y, por lo tanto, se llama GC "mayoritariamente concurrente".
La clasificación de "mayormente concurrente" es importante porque la mayoría (¿todos?) De los principales GC entran en esta categoría porque proporciona una buena compensación entre los tiempos de pausa y el rendimiento. Por ejemplo, la estación de trabajo .NET GC suspende todos los subprocesos de los mutadores al tomar una instantánea de las raíces globales, pero los reanuda mientras marca y barre.