KoreanFoodie's Study
[C++ 게임 서버] 1-14. 메모리 모델 (atomic, 코드 재배치) 본문
[C++ 게임 서버] 1-14. 메모리 모델 (atomic, 코드 재배치)
핵심 :
1. atomic 연산이란, 말 그대로 해당 연산이 '원자적'으로 수행된다는 뜻이다. '원자적' 이라는 것은, 해당 연산 사이에 다른 연산이 끼어들지 않는다는 것을 의미한다.
2. 컴파일러는 여러 이유(주로 최적화)로 코드를 재배치하는데, 이러한 memory order 는 모든 쓰레드들이 '수정 순서' 에 동의한다는 원칙을 지켜야 한다.
3. 대표적으로 다음 세 가지의 메모리 모델 옵션이 있다 : memory_order_relaxed, memory_order_release, memory_order_seq_cst
원자적 연산이란 무엇일까?
멀티쓰레드 환경에서 원자적 연산을 마치 일시적으로 락을 건다고 생각하기 쉽지만, 정확히는 '한번에' 연산이 이루어지는가에 대한 의미라고 받아들이는 것이 더 정확하다. 😉
예를 들어 아래 코드를 보자.
{
atomic<int64> v;
cout << v.is_lock_free() << endl; // 1
}
{
struct Knight
{
int64 hp;
int64 mp;
int64 exp;
};
atomic<Knight> knight;
cout << knight.is_lock_free() << endl; // 0
}
64 비트 컴퓨터에서, v 는 lock 없이 한번에 계산이 이루어지지만, knight 같은 경우 64 비트 컴퓨터에서 한 번에 연산이 이루어질 수 없기 때문에, 일시적으로 락을 걸게 된다.
만약 32비트 컴퓨터라면, v 의 경우에도 일시적으로 락을 걸 것이라는 것을 유추할 수 있다! 😁
이제 본격적으로 메모리 모델에 대해 이야기해 보자.
사실 이것과 관련한 내용은 이전에 게시글을 올린 적이 있어... 해당 글을 참고하자. 강의에서 다룬 내용보다 더 방대하고 예시도 많다! (절대 귀찮아서 그런 것이 아니다🤣)
'Game Dev > Game Server' 카테고리의 다른 글
[C++ 게임 서버] 1-16. Lock-Based Stack/Queue (0) | 2023.07.25 |
---|---|
[C++ 게임 서버] 1-15. Thread Local Storage (0) | 2023.07.24 |
[C++ 게임 서버] 1-13. CPU 파이프라인 (feat. 코드 재배치) (0) | 2023.07.19 |
[C++ 게임 서버] 1-12. 캐시 (Temporal Locality, Spatial Locality) (0) | 2023.07.19 |
[C++ 게임 서버] 1-11. future, promise, packaged_task (0) | 2023.07.18 |
Comments