12

Si estuviera diseñando un lenguaje de programación que presentara administración de memoria automática, ¿usaría el recuento de referencias para determinar las garantías de determinismo que no son posibles con un recolector de basura?Para la programación en tiempo real, ¿el recuento de referencias tiene una ventaja sobre la recolección de basura en términos de determinismo?

¿Habría una respuesta diferente a esta pregunta para los lenguajes funcionales frente a los imperativos?

Respuesta

14

¿Usaría el conteo de referencia para determinar las garantías de determinismo que no son posibles con un recolector de basura?

La palabra garantiza es fuerte.Estas son las garantías que puede proporcionar con el recuento de referencias:

  • Sobrecarga de tiempo constante en una asignación para ajustar recuentos de referencia.

  • Tiempo constante para liberar un objeto cuyo recuento de referencia va a cero. (La clave es que no se debe disminuir los niños de ese objeto de inmediato;. En cambio hay que hacerlo perezosamente cuando el objeto se utiliza para satisfacer una petición de asignación futura)

  • constante de tiempo para asignar un nuevo objeto cuando la lista libre relevante no está vacía. Esta garantía es condicional y no vale mucho.

Aquí hay algunas cosas que no se puede garantizar con el recuento de referencias:

  • constante de tiempo para asignar un nuevo objeto. (En el peor de los casos, el montón puede estar creciendo, y dependiendo del sistema, la demora para organizar la nueva memoria puede ser considerable. O peor, puede llenar el montón y no poder asignar.)

  • All inalcanzable los objetos se recuperan y reutilizan mientras se mantiene el tiempo constante para otras operaciones. (Un contador de referencia estándar no puede recoger la basura cíclico. Hay una variedad de soluciones ingeniosas, pero por lo general se invalida las garantías de tiempo constante para operaciones simples.)

ahora hay algunos recolectores de basura en tiempo real que proporcionan garantías bastante interesantes sobre los tiempos de pausa, y en los últimos 5 años ha habido desarrollos bastante interesantes tanto en el recuento de referencias como en la recolección de basura. Desde donde me siento como un extraño informado, no hay un ganador obvio.

Algunos de los mejores trabajos recientes sobre conteo de referencias son por David Bacon de IBM y por Erez Petrank de Technion. Si quiere saber qué puede hacer un sistema moderno y sofisticado de conteo de referencias, busque sus papeles. Entre otras cosas, están usando múltiples procesadores de maneras increíbles.

Para obtener información acerca de la administración de la memoria y las garantías en tiempo real en general, consulte International Symposium on Memory Management.

¿Habría una respuesta diferente a esta pregunta para los lenguajes funcionales frente a los imperativos?

Porque ha preguntado por garantías, no. Pero para el manejo de la memoria en general, las compensaciones de rendimiento son bastante diferentes para un lenguaje imperativo (muchas mutaciones pero bajas tasas de asignación), un lenguaje funcional impuro (casi ninguna mutación pero altas tasas de asignación) y un lenguaje funcional puro y perezoso (muchos de la mutación — todos aquellos que se actualizan — y altas tasas de asignación).

+1

"Todos los objetos inalcanzables se recuperan y reutilizan mientras se mantiene el tiempo constante para otras operaciones". Dado que la pregunta es sobre la creación de un nuevo idioma, puede optar por aplicar un montón unidireccional (por ejemplo, Erlang y Mathematica) para garantizar que todos los objetos inalcanzables se recuperen y reutilicen mientras se mantiene el tiempo constante para otras operaciones. –

+0

Es posible implementar el recuento de referencias en tiempo real (a un precio): consulte "Recuento de referencias para sistemas duros en tiempo real", por T Ritzau –

2

en tiempo real de recolección de basura de programación podría ser perjudicial, ya que no se sabe cuando el recolector de basura se recogerá ... así que sí, el recuento de referencias es definitivamente mejor en este contexto.

Como nota al margen, por lo general en el sistema en tiempo real, solo algunas partes necesitan procesamiento en tiempo real, por lo que podría evitar la recolección de basura solo en componentes sensibles. Un ejemplo del mundo real es un programa C# que se ejecuta en un destino Windows CE.

+0

Existen formas de implementar la recolección de basura para no requerir el comportamiento de "detener el mundo". En general, estos requieren que se desencadene la recolección de basura mientras hay suficiente espacio disponible para satisfacer cualquier solicitud que pueda llegar antes de que se complete la recogida de basura, y también perjudican el rendimiento incluso cuando la recogida de basura no está en curso, sino una compactación concurrente el recolector de basura puede ser superior a un sistema basado en conteo de referencia no compactable en algunos escenarios en tiempo real. – supercat

+0

Por ejemplo, un sistema puede requerir que cada vez que se almacena una referencia de objeto en algún lugar y el destino no se marque como "en vivo", se debe agregar a una lista de nuevos objetos en vivo; la fase de "marca" del GC inicializaría la lista para apuntar a todos los objetos enraizados, y luego iría a la lista y agregaría a la lista cada elemento anidado que aún no está marcado como "en vivo". Una vez que la lista esté vacía, la fase de "barrido" podría reubicar cada objeto que no estaba marcado como "activo", pausando cualquier momento en que movería un objeto que estaba siendo desreferenciado activamente. – supercat

4

Si nos fijamos en las especificaciones RTSJ (JSR-1), verá que hicieron una ronda de finalización del problema al proporcionar hilos en tiempo real sin montón. Al tener una categoría separada de subprocesos que no tiene permitido tocar ningún objeto que pueda requerir detener el subproceso para la recolección de elementos no utilizados, el lado JSR-1 eliminó el problema. No hay muchas implementaciones de RTSJ en este momento, pero el área de recolección de basura en tiempo real es un tema candente en esa comunidad.

+0

Por "toque" ¿quiere decir "escribir", o "escribir algo que no sea campos primitivos", o "examinar de cualquier manera"? ¿O hay algún tipo de almacenamiento indexado no en heap al que puedan acceder tanto los subprocesos en tiempo real como los no en tiempo real? No creo que los hilos en tiempo real sean muy útiles si se limitan a leer y escribir primitivas de tamaño fijo, pero puedo imaginar muchos mecanismos a través de los cuales cosas como las matrices podrían ser útiles. – supercat

+0

@supercat - por supuesto, no he tocado rtsj en algunos años, así que puede que me vaya en esto, pero aquí va; por 'toque' creo que quise decir 'acceso'. Básicamente los objetos de pila están prohibidos para hilos NHRT. Lo que * puedes * acceder con los subprocesos NHRT son objetos asignados desde 'memoria inmortal' o (creo) memoria 'con alcance'. RTSJ tipo de memoria hecha en Java algo complicado, en relación con el no RTSJ. – JustJeff

0

Desde cierta participación en varios proyectos migrando trozos significativos de código de C++ (con varias clases de punteros inteligentes, incluida la referencia contada) a basura recolectada Java/C#, observo que los principales puntos dolorosos parecen estar relacionados con las clases con destructores no vacíos (particularmente cuando se usa para RAII). Esta es una bandera bastante grande que se espera una limpieza determinista.

El problema es seguramente el mismo para cualquier lenguaje con objetos; No creo que los lenguajes híbridos OO-funcionales como Scala u Ocaml disfruten de ventajas particulares en esta área. La situación puede ser diferente para lenguajes funcionales más "puros".

+0

-1 La limpieza determinista se realiza fácilmente en cualquier lenguaje funcional y no tiene nada que ver con el tiempo real. –

7

¿usaría el conteo de referencia para determinar las garantías de determinismo que no son posibles con un recolector de basura?

No veo cómo. El proceso de reducción del recuento de referencias de un objeto no está limitado en el tiempo, ya que ese objeto puede ser la única raíz para un gráfico de objetos grandes arbitrario.

La única manera de abordar el problema de GC para sistemas en tiempo real es mediante el uso de un colector concurrente o uno incremental, y no importa si el sistema utiliza el recuento de referencias o no; en mi opinión, su distinción entre el recuento de referencias y la "recopilación" no es precisa de todos modos, p. los sistemas que utilizan el recuento de referencias pueden ocasionalmente realizar algún barrido de memoria (por ejemplo, para manejar ciclos).

Usted podría estar interesado en IBM's Metronome, y también sé que Microsoft ha realizado algunas investigaciones en dirección a una buena gestión de la memoria en tiempo real.

2

Para la programación en tiempo real, ¿el recuento de referencias tiene una ventaja sobre la recolección de basura en términos de determinismo?

Sí. La principal ventaja del conteo de referencias es la simplicidad.

Si estaba diseñando un lenguaje de programación que presentara administración de memoria automática, ¿usaría el conteo de referencias para determinar las garantías de determinismo que no son posibles con un recolector de basura?

Un GC como cinta de correr de Baker debe alcanzar el mismo nivel de garantías en cuanto determinismo que las ofertas de referencia de conteo.

¿Habría una respuesta diferente a esta pregunta para los lenguajes funcionales frente a los imperativos?

Sí. El conteo de referencia solo no maneja ciclos. Algunos lenguajes funcionales hacen que sea imposible crear ciclos por diseño (por ejemplo, Erlang y Mathematica) por lo que trivialmente permiten el recuento de referencia solo como un enfoque exacto para GC.

Cuestiones relacionadas