2011-06-23 15 views

Respuesta

7

Conozco los conceptos de stop-the-world, incrementales, paralelos, concurrentes, (blandos/duros) 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. :-)

Según tengo entendido, GC del mundo se refiere a un algoritmo que suspende todos los hilos del mutador durante toda la duración de un ciclo de GC, p. al marcar 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 GC menor, p. "rodajas principales" en el GC de OCaml. Paralelo significa que el GC usa múltiples hilos para acelerar el proceso de recolección de basura. GC concurrente significa que el GC se ejecuta al mismo tiempo que los mutadores, p. 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 sin permitir 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.

2

Puede encontrar una descripción accesible en el documento "Mostly Parallel Garbage Collection" de 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), pp. 157 -164).

escriben:

Supongamos que somos capaces de mantener un conjunto de bits sucios virtuales, que son ajusta automáticamente siempre que las correspondientes páginas de memoria virtual se escriben. (Una implementación aceptable de esta característica puede ser obtenida mediante páginas protectoras de escritura y capturar las fallas de escritura resultantes, sin modificaciones en el kernel del sistema operativo subyacente; una implementación de en el núcleo del sistema operativo sería, por supuesto, más eficiente.) 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 seguimiento tradicional en paralelo con el mutador. Los bits sucios virtuales se actualizarán para reflejar las escrituras del mutador. Después de completar 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 están marcados y la basura puede recuperarse de manera segura.

...

En este algoritmo, la fase de rastreo paralelo proporciona una aproximación al verdadero conjunto alcanzable. Los únicos objetos no marcados por que son accesibles en este proceso de rastreo en paralelo deben ser accesibles desde objetos marcados que se han escrito desde trazados. La fase de rastreo stop-the-world se realiza a partir de todos esos objetos, , de modo que, al final, ningún objeto verdaderamente alcanzable permanece sin marcar.

cuando se refieren a tracing garbage collectors, se están refiriendo a los colectores que se inician a partir designados "nodos raíz" (generalmente registros del programa) y seguir punteros a cada objeto accesible. 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 colector se estaba ejecutando. Por lo tanto, es "principalmente paralelo".

Cuestiones relacionadas