KoreanFoodie's Study

[C++ 게임 서버] 1-14. 메모리 모델 (atomic, 코드 재배치) 본문

Game Dev/Game Server

[C++ 게임 서버] 1-14. 메모리 모델 (atomic, 코드 재배치)

GoldGiver 2023. 7. 21. 19:08

Rookiss 님의 '[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버' 를 들으며 배운 내용을 정리하고 있습니다. 관심이 있으신 분은 꼭 한 번 들어보시기를 추천합니다!

[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 의 경우에도 일시적으로 락을 걸 것이라는 것을 유추할 수 있다! 😁

 

이제 본격적으로 메모리 모델에 대해 이야기해 보자.

사실 이것과 관련한 내용은 이전에 게시글을 올린 적이 있어... 해당 글을 참고하자. 강의에서 다룬 내용보다 더 방대하고 예시도 많다! (절대 귀찮아서 그런 것이 아니다🤣)

Comments