¿Son ++ i e i ++ operaciones atómicas?

Lunes 22 de febrero de 2021, hace buen tiempo [No lamente el pasado, no desperdicie el presente, no le tema al futuro]



1. Operaciones atómicas del sistema operativo

Las operaciones atómicas son indivisibles y no serán interrumpidas por ninguna otra tarea o evento antes de la ejecución:

En un solo hilo, las operaciones que pueden completarse en una sola instrucción pueden considerarse operaciones atómicas, y las operaciones que no pueden completarse en una sola instrucción también pueden considerarse operaciones no atómicas, porque las interrupciones pueden y solo pueden ocurrir entre instrucciones;

En multiproceso, las operaciones que no pueden ser interrumpidas por otros procesos (subprocesos) se denominan operaciones atómicas;

2. Del código ensamblador para ver si ++ i e i ++ son operaciones atómicas

++i;
00007FF7D69F17E8  mov         eax,dword ptr [i]  
00007FF7D69F17EB  inc         eax  
00007FF7D69F17ED  mov         dword ptr [i],eax  
i++;
00007FF7D69F17F0  mov         eax,dword ptr [i]  
00007FF7D69F17F3  inc         eax  
00007FF7D69F17F5  mov         dword ptr [i],eax  

Se puede ver que tanto ++ i como i ++ se implementan usando tres instrucciones:

1. Copie el valor de la memoria al registro,
2. Registre el incremento automático,
3. Copie el valor del registro a la memoria;

Por tanto, ++ i e i ++ no son operaciones atómicas.

3. Problema común: el proceso tiene una variable global i y dos subprocesos. i ++ se ejecuta 100 veces en dos hilos ¿Cuáles son los valores máximo y mínimo que se pueden obtener?

3.1 El valor mínimo de la CPU de varios núcleos es 2 y el valor máximo es 200

De lo anterior se puede ver que i ++ es una operación aritmética compuesta de 3 instrucciones. Dos subprocesos necesitan ejecutar 100 (ciclos) * 3 (instrucciones) * 2 (subprocesos) = 600 instrucciones en la variable i en total. La instrucción en una determinada disposición hará que el valor final de i sea solo 2.

Suponga que los pasos de ejecución de los dos subprocesos son los siguientes, y el valor final de i es solo 2:

  1. El subproceso A ejecuta i ++ por primera vez, saca la i de la memoria, el valor es 0 y luego agrega 1 después de almacenarlo en el registro. En este momento, el valor en el registro de CPU1 es 1 y el valor en la memoria es 0;

  2. El subproceso B ejecuta i ++ por primera vez, recupera la i de la memoria, el valor es 0 y luego agrega 1 después de almacenarlo en el registro. En este momento, el valor en el registro de CPU2 es 1 y el valor en la memoria es 0;

  3. El subproceso A continúa ejecutando el 99º i ++ y vuelve a poner el valor en la memoria. En este momento, el valor del registro en CPU1 es 99, y el valor en la memoria es 99;

  4. El subproceso B continúa ejecutando el primer i ++ y vuelve a poner su valor en la memoria.En este momento, el valor de registro en CPU2 es 1 y la memoria es 1;

  5. El subproceso A ejecuta i ++ por centésima vez, recupera el valor de la memoria en el registro de CPU1 y ejecuta un incremento. En este momento, el valor en el registro de CPU1 es 2 y el valor en la memoria es 1;

  6. El hilo B realiza todas las operaciones y las vuelve a poner en la memoria En este momento, el valor de registro de CPU2 es 100 y la memoria es 100;

  7. El subproceso A realiza la última parte de 100 operaciones y vuelve a poner el valor del registro en CPU1 en la memoria, el valor en la memoria es 2;

El resultado de 200 es relativamente simple y solo se requieren dos subprocesos para operar a intervalos.

3.2 El valor mínimo de una CPU de un solo núcleo es 100 y el valor máximo es 200

Los dos subprocesos están marcados como subproceso 1 y subproceso 2, i ++ es equivalente a sacar el valor de i, agregar 1 y volver a colocarlo

El primer caso extremo: cada vez que el hilo 1 saca el valor de i, el tiempo de la CPU cambia al hilo 2, y el hilo 2 también saca el valor de i. El valor obtenido es igual al hilo 1, y el hilo 2 suma 1 a iy lo devuelve. Thread One también agrega uno a i y lo vuelve a colocar. Los valores devueltos también son iguales, lo que equivale a dos subprocesos que realizan una operación i ++, y el valor de i solo aumenta en 1, por lo que que el valor de i es 100 para 100 operaciones.

El segundo caso extremo: operación de intervalo entre el subproceso uno y el subproceso dos, es decir, se completa la operación del par de subprocesos i ++, y después de que se devuelvan los datos que se han incrementado en uno, el subproceso dos operará a su vez, y finalmente cada subproceso suma 100 veces a i, el valor de i es 200


referencias

i ++ (++ i) no es una operación atómica

El proceso tiene una variable global i y hay dos subprocesos. I ++ se ejecuta 100 veces en dos hilos ¿Cuáles son los valores máximo y mínimo que se pueden obtener?

Supongo que te gusta

Origin blog.csdn.net/m0_37433111/article/details/113931514
Recomendado
Clasificación