2010-03-31 21 views

Respuesta

26

lo he usado para un registro en memoria con un tamaño restringido. Por ejemplo, la aplicación escribiría entradas de registro al procesar las solicitudes de los usuarios. Cada vez que se produce una excepción (que sería perjudicial para el procesamiento) los registros de registro actualmente en la memoria se descargarán junto con él.

El beneficio de un búfer circular es que no necesita cantidades infinitas de memoria, ya que las entradas más antiguas se anulan automáticamente. El "reto" es que necesitas encontrar un tamaño adecuado para tu caso de uso. En el ejemplo anterior, sería muy desafortunado que el registro de registro con la información más importante sobre la excepción ya hubiera sido anulado.

Algunos sistemas/aplicaciones tienen herramientas que le permiten extraer el contenido actual del búfer a pedido, y no solo cuando se extraería automáticamente (si es que lo hacía alguna vez).

Creo que ETW y los CLR stress log, entre muchos otros kernel del sistema o traza/registro de alto rendimiento, se implementan de esa manera.

El concepto de utilizar tales almacenamientos intermedios para el seguimiento/registro en memoria es bastante común (sin mencionar que este es el único uso, ciertamente no), porque es mucho más rápido que los registros escritos en un archivo/base de datos que es posible que nunca te interese a menos que ocurra un error. Y en una nota relacionada, conserva espacio en el disco duro.

+8

+1 para "He lo usé para ... "en lugar de" Podrías usarlo para ... " – ryeguy

6

Sé que esto es hacer trampa, pero la wikipedia tiene una muy buena explicación.

http://en.wikipedia.org/wiki/Circular_buffer

un buffer circular, tampón cíclico o búfer de anillo es una estructura de datos que utiliza una única memoria intermedia, de tamaño fijo, como si estuviera conectado de extremo a extremo. Esta estructura se presta fácilmente a datos de búfer arroyos

Un ejemplo que podría utilizar un sobrescribir memoria intermedia circular es con multimedia. Si el tampón se utiliza como el búfer limitado en el problema productor-consumidor, entonces es probablemente deseada para el productor (por ejemplo, un generador de audio) a datos antiguos de sobreescritura si el consumidor (por ejemplo, la tarjeta de sonido) no puede mantener el ritmo momentáneamente. Otro ejemplo es el método de síntesis de guía de onda digital que utiliza memorias intermedias circulares a para simular de manera eficiente el sonido de cuerdas vibratorias o instrumentos de viento.

Con respecto a la comparación de listas de doble enlace, imagino que realmente depende de lo que está usando la lista para ... La implementación de búferes circulares parece ser más compleja, por favor (otra vez) consulte la wiki página; esto explica la implementación, consideraciones, etc. y también muestra un código de ejemplo.

Gracias, Neil

+0

La respuesta a mi primera pregunta SO usó un buffer circular para un generador de audio http://stackoverflow.com/questions/664594/how-to-generate-a-guitar-note –

5

Un búfer circular es un buen mecanismo para mantener eficientemente una lista deslizante/móvil de valores/elementos de forma ordenada. Un ejemplo podría ser mantener un promedio móvil de los últimos N artículos. Supongamos que desea realizar un seguimiento del costo promedio de las últimas 100 operaciones de cálculo de algún valor. Para hacer esto, necesitaría eliminar el costo más antiguo y agregar el costo más nuevo.

Sin un búfer circular, un mecanismo costoso para hacer esto (estilo C) sería tener una matriz de 100 elementos. Cada vez que se calcula un nuevo costo, puede eliminar los 99 elementos y colocar el nuevo en la última posición. Esto es obviamente costoso. Utilizando una idea de búfer circular, simplemente rastrearía el "final" del búfer (posición 0-99). Marcaría la posición de la partida de costo más antigua (o la más reciente ... cualquiera que elija). Después de leer el valor anterior (para actualizar el promedio continuo), lo reemplaza con el valor más nuevo e incrementa la posición del búfer (si está en 99, lo establece de nuevo en 0 ... por lo tanto, la parte circular).

Compararlo con una lista doblemente vinculada en realidad no tiene sentido. Un búfer circular sin duda podría implementarse con una lista doblemente vinculada (o incluso una lista individualmente vinculada). Pero compararlos es un poco como comparar manzanas y naranjas, por así decirlo.

0

Lo he usado como una forma fácil de implementar la planificación por turnos. Básicamente, tenía varios objetos diferentes que pueden producir un valor que un consumidor podría luego procesar. Puse a todos los productores en un anillo y pregunté a cada uno por turno.

0

He usado un buffer en anillo en código multihilo. Básicamente, si todas las máquinas tragamonedas están llenas, los productores tienen que esperar. Los consumidores simplemente procesan los artículos en las máquinas tragamonedas que están "llenos".

Aquí hay un hilo que comencé en él. Tiene algunos buenos consejos sobre implementación.

.NET multi-threaded variable access

11

buffers circulares son buenos para los flujos de datos en serie en sistemas embebidos. Los microcontroladores a menudo tienen un UART para manejar un byte en serie que entra, estos deben almacenarse en orden y tratarse más tarde (los bytes a menudo entran a un ritmo más rápido de lo que pueden manejarse).

El búfer divide eficazmente la respuesta de temporización crítica requerida (cuando los bytes entran, en microsegundos) a la respuesta temporal no crítica al mensaje completo (por ejemplo, mostrar el mensaje que entró, en milisegundos), por ejemplo :

1) Al recibir un byte, el UART puede generar una interrupción a la cual el software responde tomando rápidamente el byte recibido y empujándolo al final del búfer.

2) Las rutinas de software de fondo pueden verificar regularmente si el búfer aún tiene algo y vaciarlo según sea necesario.

Como el tamaño del búfer circular se puede definir como una compilación previa, el tamaño es limitado. Esto ayuda a mejorar la eficiencia del espacio y debería eliminar la corrupción de la memoria a cambio de cuántos bytes se pueden recibir antes de que los datos comiencen a perderse.

Cuestiones relacionadas