La comprensión en profundidad del modelo de memoria de Java (b) - reordenamiento

dependencias de datos

Si tanto el acceso de la misma operación variable y tanto las operaciones de una operación de escritura, entonces no hay dependencia de datos entre las dos operaciones. dependencia de datos min después de tres tipos:

nombre El código de ejemplo explicación
Leer después de escribir a = 1, b = a; Después de escribir una variable, lea esta posición.
Después Escribir Comentario a = 1; A = 2; Después de escribir una variable, escribir esta variable.
La lectura de la escritura a = b; b = 1; Después de leer una variable, escribir esta variable.

Lo anterior tres casos, siempre y cuando la orden de ejecución de la operación de dos reordenamiento, el resultado de la ejecución del programa será cambiado.

Como se mencionó anteriormente, el compilador y el procesador pueden tener que hacer la operación de reordenamiento. Compilador y un procesador en el pedido, cumplirán con la dependencia de datos, y el compilador no cambia el orden de ejecución de la dependencia de datos del procesador existe dos operaciones.

Tenga en cuenta que las dependencias de datos entre operaciones y la secuencia de un solo hilo de instrucciones de dichos dependencia de datos en el presente documento se realiza sólo para un único procesador que ejecuta en un procesador y un subproceso diferente no se considera diferentes compiladores y procesadores.

como-si-serie semántica

como-si-serie medios significado semántico: no importa cómo de reordenamiento (compilador y el procesador a fin de mejorar el grado de paralelismo), el resultado de la ejecución (single-roscado) programa no se puede cambiar. Compilador, tiempo de ejecución y los procesadores deben cumplir con la semántica como-si-serie.

Con el fin de cumplir con la semántica como-si-serie, el compilador y el procesador no hace que la operación de reordenación de dependencias de datos, puesto que tal reordenamiento puede cambiar el resultado. Sin embargo, la ausencia de datos de dependencias entre operaciones si estas operaciones podrían ser reordenados compilador y un procesador. Para ilustrar, considere la siguiente área de muestra de código de un círculo se calcula:

doble pi = 3,14; // Una 
doble r = 1,0; // B 
doble área = pi * r * r; //C

Lo anterior tres operaciones de dependencia de datos como se muestra a continuación:

Se muestra, hay dependencia de datos entre la figura anterior A y C, también hay una dependencia de datos entre B y C. Por lo tanto, en la secuencia final de instrucciones ejecutadas, C puede reordenarse en frente de la A y B (C trasladó hasta la A y B, los resultados del programa serán cambiados). Pero no hay dependencias de datos entre A y B, el compilador y el procesador pueden realizar la reordenación de la secuencia entre la A y B. La cifra es dos órdenes de ejecución del programa:

como-si-serie semántica de los programas de un solo subproceso para proteger hasta cumplir como-si-serie semántica compilador, tiempo de ejecución y procesadores juntos para crear una ilusión para el programador de escribir programas de hilo único: el programa se basa en programas de un único subproceso ejecución de órdenes. como-si-serie semántica de la necesidad programador de un solo subproceso no se preocupe por la reordenación de interferir con ellos, no hay necesidad de preocuparse por problemas de visibilidad memoria.

reglas de secuencia del programa

Las reglas de secuencia del programa sucede- antes, hay tres sucede- antes de calcular la relación entre el código de ejemplo anterior área del círculo:

  1. A sucede- antes de B;
  2. B ocurre- antes de C;
  3. A sucede- antes de C;

Aquí sucede- antes de la tercera relación se deduce a partir de la transferencia de la sucede- antes.

Donde A sucede- antes de B, pero en realidad puede programar la ejecución B (véase después de reordenar el orden de ejecución arriba) antes de A. Mencionado en el primer capítulo, si A ocurre- antes de B, JMM no se requiere necesariamente que ser realizada antes de la A B. JMM ex requiere solamente una operación (resultado ejecutado) después de la operación de una operación anterior visible y se secuenció antes de la segunda operación. Un resultado de la operación realizada aquí no necesita ser visible para el operador B; y reordenar el resultado de la ejecución de la operación A y Procedimiento B, consistente con los resultados de la operación A y B operación ejecutada en sucede- orden antes. En este caso, JMM pensar que este reordenamiento no es ilegal (no ilegal), JMM permite tal reordenamiento.

En el ordenador, la tecnología de software y tecnología de hardware que tienen un objetivo común: el programa sin cambiar los resultados de la premisa, en la medida de lo posible el desarrollo de paralelismo. Los compiladores y procesadores de cumplir con este objetivo, por definición sucede- antes de que podamos ver, JMM cumplir con el mismo objetivo.

El impacto de la reordenación de subprocesos múltiples

Ahora vamos a ver si reordenamiento cambiará los resultados de la implementación de programas multihilo. Considere el siguiente código de ejemplo:

class ReorderExample {
int a = 0;
boolean flag = false;

public void writer() {
    a = 1;                   //1
    flag = true;             //2
}

Public void reader() {
    if (flag) {                //3
        int i =  a * a;        //4
        ……
    }
}
}

variable de indicador es una etiqueta utilizada para identificar si una variable se ha escrito. Se supone que hay dos hilos A y B, un método de primera ejecuta escritor (), entonces el hilo B a continuación, realiza método Reader (). El hilo B 4 mientras se realiza la operación, la capacidad de ver un par de variables compartidas en una operación de rosca Una escritura?

La respuesta es: no necesariamente ver.

Desde la operación 1 y la operación 2 no hay dependencias de datos, el compilador, y los dos procesadores pueden funcionar reordenación; Del mismo modo, 3 y operación 4 operación no hay dependencias de datos, el compilador y el procesador puede operar los dos pesada Ordenar. Vamos a echar un vistazo a cuando el operador operación 1 y 2 reordenamiento puede producir el efecto? Considere el siguiente diagrama de temporización de ejecución del programa:

Como se muestra arriba, la operación 1 y la operación 2 reordenamiento hecho. Cuando se ejecuta el programa, el hilo Un primer indicador variable de indicador, entonces el hilo B lee esta variable. Puesto que la condición es verdadera, el hilo B lee la variable a. En este momento, no hay una variable que se ha escrito un hilo A, donde fue destruido reordenar la semántica de un programa de multiproceso!

※ Nota: Este artículo está unificada con una línea roja flecha punteada indica un error de una operación de lectura, una operación de lectura indica la línea de flecha verde virtual adecuado.

A continuación veamos, cuando el reordenamiento funcionamiento y operación 3 4 tendrá ningún efecto (este medio de reordenamiento pueden controlarse Por cierto dependiente). La siguiente es la operación después de 3 y 4 operación de reordenamiento, un diagrama de temporización de un programa ejecutado:

En el proceso, existe la dependencia de control de funcionamiento 3 y la operación 4. Cuando el código está presente la dependencia de control, que afectará el grado de paralelismo en la secuencia de ejecución de las instrucciones. Con este fin, el procesador y compilador utilizando conjetura de control (especulación) lleva a cabo para superar la influencia del grado de correlación de paralelismo. procesador de ejecución de adivinar un ejemplo, el hilo B ejecutada por adelantado y calcular el procesador puede leer a * a, y almacena temporalmente el resultado calculado a una llamada memoria intermedia de reordenación (tampón de reordenación ROB) caché de hardware. A continuación, la operación cuando la condición de determinación 3 es cierto, puso el resultado del cálculo es escrito en la variable i.

Podemos ver en la figura, la especulación operación realizada sustancialmente 3 y 4 no reordenamiento. la semántica de reordenamiento aquí destruidos programas multihilo!

En el programa de un solo subproceso, la presente operación de control de reordenar resultado de la ejecución depende no cambia (que es como-si-serial semántica permiten el control de presencia del operador se basa razón no reordenada); pero un programa multiproceso, reordenar presente dependiente de operación de control, que puede cambiar el resultado de la ejecución del programa.

 

Publicados 136 artículos originales · ganado elogios 6 · vistas 1491

Supongo que te gusta

Origin blog.csdn.net/weixin_42073629/article/details/104741401
Recomendado
Clasificación