반응형
Reorder or Out-of-order execution (OoOE) (비순차적 명령어 처리)
말 그대로 명령어를 순차적으로 실행하는 것이 아니라 cpu의 효율을 최대화하기 위해 비순차적으로 처리하겠다는 의미다.
간단히 예를 들어보자. 2개의 core는 boolean flag = false;와 int x = 0;이라는 공유 변수를 사용한다 했을 때 코드를 보자.
# share var
boolean flag = false;
int x = 0;
# core 1
while(!flag);
print(x);
# core 2
x = 100;
flag = true;
이렇게 돼 있으면 core1과 core 2는 동시에 두 공유 변수를 가져와서 실행한다.
이때 core1에서는 무한루프에 빠지고, core 2에서 x를 먼저 업데이트한다. 그리고 flag를 업데이트하면 이때 무한루프를 빠져나오고 print(x)가 출력되어 x는 100이 나올 것이라 예상한다.
하지만 이렇게 되지 않는다.
core1에서는 core 2에서 flag가 업데이트될 때까지 기다려야 한다. 뒤에 코드를 실행하지 못한다. 이때 reorder가 동작한다. core1의 자원을 쉬지 않게 하기 위해 core 2에서 reorder를 하는데
flag = true;
x = 100;
이렇게 명령어의 위치가 바뀐다. reorder가 되기 위한 조건은 두 변수가 독립적이라는 것이다. x와 flag는 서로의 동작에 영향을 주지 않는다. 이렇게 reorder가 되면 core 2에서 x를 100으로 업데이트하기 전에 print(x)는 기존의 0을 출력할 수도 있다.
이게 비순차적 명령어 처리다.
반응형
댓글