MMOServer

멀티스레드의 메모리 이슈

이야기prog 2025. 3. 13. 23:30

가시성: 각 코어들은 캐시를 가지고 있는데, 공유 변수의 값을 메모리에 저장 안하고 자기 캐시에만 저장해놓았을 수도 있고, 각 캐시마다 변수의 값이 다르게 저장되있을 수도 있음. 


코드 재배치: cpu나 컴파일러의 최적화 이슈로 코드가 재배치됨. fetch -> decode -> execute -> write back
각각 데이터 가져오기, 데이터 해석, 실행, 저장을 의미한다.

 

int x = 0; int y = 0; int r1 = 0; int r2 = 0;일 때,
쓰레드 1이

x = 1;

r2 = y;를 실행하고,

쓰레드 2가

y = 1;

r1 = x;를 실행할 때, 계속 실행하다보면 x = 0과 y = 0이 결과값으로 나올 수 있다.  (가시성과 코드 재배치의 이슈)

 

쓰레드 1에서 x는 1이지만, 자기 캐시에만 저장해놓고, 쓰레드 2의 x는 메모리나 자기 캐시에 있는 0을 가져온다면 두 값이 달라짐.

 

또 최적화 이슈로

x = 1;

r2 = y;

r2 = y;

x = 1; 

로 순서가 바뀔수도 있음. 바꿔도 싱글쓰레드 환경에서는 결과가 달라지지 않기 때문 또한 cpu나 컴파일러 입장에서 저렇게 코드 재배치를 하는 것이 더 효율적이라고 생각하기 때문.

'MMOServer' 카테고리의 다른 글

DeadLock 탐지(C++)  (0) 2025.03.20
Read-Write Lock(C++)  (0) 2025.03.19
Future(C++)  (0) 2025.03.13
Event, Condition_Variable(C++)  (0) 2025.03.13
SpinLock(C++)  (0) 2025.03.13