algoritmo real (III): las estructuras de datos de colas de análisis de alto rendimiento y algoritmos detrás disruptor

algoritmo real (III): las estructuras de datos de colas de análisis de alto rendimiento y algoritmos detrás disruptor

Disruptor es una cola de mensajes de memoria es una cola para el paso de mensajes entre los hilos

Cómo hacer disruptor es un alto rendimiento? La estructura de datos subyacente depende de qué?

"- modelo de consumo productor", basada en cola circular

En este productor - modelo de consumo, a los datos de producción productor, el centro de datos en un contenedor de almacenamiento, después de que los retira de consumo desde el recipiente de almacenamiento del centro de datos consumo

Centro de contenedores de almacenamiento que almacena los datos de lo que es la estructura de datos utilizada para lograr?

El más comúnmente usado para lograr una estructura de datos es un centro de almacenamiento de contenedores cola, los datos apoyan las colas FIFO, los datos se producen mucho tiempo se ha sido durante mucho tiempo el consumo. Hay dos colas implementadas idea, uno se basa en la cadena implementado lista de la cola, y el otro se basa en una implementación matriz de colas fin, diferentes necesidades, la elección de una implementación diferente.

Sin límites aplicar una cola, el tamaño de la cola que se sabe de antemano por la lista de selección de lograr, ya que las listas apoyan expansión dinámica rápida. Si se quiere lograr una cola acotada, que tamaño de la cola se determina de antemano, cuando la cola está llena de datos, los productores tienen que esperar a que los consumidores de pasar los datos, entonces no hay espacio en la cola para poner datos en la posición de los productores. cantidad ilimitada de ocupación cola de memoria no es controlable, ya que pueden conducir a la memoria sigue creciendo OOM (Memoria insuficiente) de error.

colas acíclicos con el fin de añadir, borrar los datos del proyecto, implica operaciones de datos en movimiento, puede reducirse el rendimiento, el movimiento de datos cola circular sólo para resolver el problema, por lo que la mayor parte de las escenas utilizadas en la cola de orden, el orden de selección cola circular cola, la memoria cola circular es el prototipo de una cola de mensajes, cola circular consigue por medio de un simple "productor - modelo de consumo", utilizando "cuando la cola está llena, el productor va a esperar en rotación," cuando la cola está vacía después de que el consumidor espera en rotación

public class Queue {
  private Long[] data;
  private int size = 0, head = 0, tail = 0;
  public Queue(int size) {
    this.data = new Long[size];
    this.size = size;
  }

  public boolean add(Long element) {
    if ((tail + 1) % size == head) return false;
    data[tail] = element;
    tail = (tail + 1) % size;
    return true;
  }

  public Long poll() {
    if (head == tail) return null;
    long ret = data[head];
    head = (head + 1) % size;
    return ret;
  }
}

public class Producer {
  private Queue queue;
  public Producer(Queue queue) {
    this.queue = queue;
  }

  public void produce(Long data) throws InterruptedException {
    while (!queue.add(data)) {
      Thread.sleep(100);
    }
  }
}

public class Consumer {
  private Queue queue;
  public Consumer(Queue queue) {
    this.queue = queue;
  }

  public void comsume() throws InterruptedException {
    while (true) {
      Long data = queue.poll();
      if (data == null) {
        Thread.sleep(100);
      } else {
        // TODO:...消费数据的业务逻辑...
      }
    }
  }
}

"- consumidor modelo de productor de" concurrencia a base de bloqueo

Si tan sólo los datos de escritura en un productor de cola, un consumidor lee los datos de la cola, el código anterior no es ningún problema, si hay múltiples productores en cola de datos de escritura simultánea, la cola de los concurrentes múltiples consumidores los datos de consumo, no va a funcionar

  • Los datos se escriben varios productores podrían cubrir
  • Los consumidores pueden leer datos más duplicados

Dos hilos añadieron simultáneamente a los datos de cola correspondiente a dos hilos de ejecución Queue clase add () de función, que se supone que el tamaño del tamaño de cola es 10, la cola actual índice que apunta a 7, la cabeza subíndice 3 puntos, es decir, cola de también hay un espacio libre, esta vez un llamadas de rosca add () función, añadir datos a un valor de cola 12, el hilo 2 llamadas añaden () es una función para añadir datos a la cola 15, el extremo puede ser un datos agregado con éxito, otro de datos puede ser sobrescrito

Cola en add () Función:

public boolean add(Long element){
if((tail + 1) % size == head) return false;
data[tail] = element;
tail =(tail + 1) % size;
return true;
}

La tercera fila a la asignación de datos [cola], sólo para la línea 4 incrementos el valor de una cola, y operación de asignación de procesamiento no es una operación atómica, una operación atómica no se refiere interrumpido operación hilo mecanismo de programación, una vez que se inicia esta operación se ejecuta hasta su finalización, el medio no tendrá ningún cambio de contexto (para cambiar a otro hilo), el resultado será: cuando un hilo 1 y el hilo 2 se ejecutan al mismo tiempo la función add (), el hilo 1 para completar la implementación de la tercera línea declaración, el data[7](tail=7)valor se establece en 12, antes de que el hilo 1 no se ha realizado a los estados cuarta línea, es decir, sin la cola + 1, antes de que el hilo 2 realiza la primera de tres haría data[7] = 15es decir hilo 2 en la rosca de datos de cobertura de datos 1

La forma más fácil es para bloquear el código, al mismo tiempo permitiendo sólo un hilo ejecuta añadir la función (), que también puede reducir el tamaño de la cerradura con CAS (comparar y canje de comparar y de intercambio) operación,

"- consumidor modelo de productor de" concurrencia a base de bloqueo

Disruptor es una cola y el cambio "productor - consumidor modelo," la realización de las ideas

Cola sólo admite dos operaciones, adición y eliminación de datos y función de los datos de lectura, el código add () y poll (), respectivamente, y el uso de otra implementación idea disruptor, para los productores, que es antes de añadir la cola de datos, la unidad de almacenamiento libre se puede utilizar para solicitar y aplicando una células de memoria mayor n continuos, al aplicar al conjunto de ubicaciones de memoria contiguas, el elemento posterior agrega a la cola, no se puede bloquear, y desde la memoria esta unidad es un exclusivo hilo, está bloqueado requiere proceso de solicitud de la celda de memoria

Para los consumidores, vaya a aplicar una serie de unidad de almacenamiento legible continuo, el proceso de aplicación es la necesidad de bloqueo, después de la finalización de la aplicación posterior de una operación de lectura puede no bloqueo

Las desventajas son: A si productor para aplicar un conjunto de posiciones de memoria contiguos, las células de memoria etiquetados 3-6, el índice de productor B es seguido por la unidad de almacenamiento de aplicaciones 7-9, no es completamente en 3-6 antes de escribir datos, los datos no se puede leer 7-9

resumen ampliado

Supongamos que hay ocho tablas se utiliza para almacenar la información de usuario, esta vez para cada campo ID de usuario de la tabla no puede ser generada a partir del modo de crecimiento, de lo contrario hará que los valores de ID de usuario entre diferentes tablas repetidas, necesitamos implementar un generador de Identificación generar un número de identificación único para todos los usuarios de la tabla, cómo diseñar un alto rendimiento, soporte para el generador concurrente, ID capaz de generar un identificador único global que?

Bulk bloqueo generación ID, sin necesidad de utilizar la cerradura

Publicado 75 artículos originales · ganado elogios 9 · vistas 9161

Supongo que te gusta

Origin blog.csdn.net/ywangjiyl/article/details/104893392
Recomendado
Clasificación