KoreanFoodie's Study

[C++ 게임 서버] 1-6. Lock 구현 이론 본문

Game Dev/Game Server

[C++ 게임 서버] 1-6. Lock 구현 이론

GoldGiver 2023. 7. 11. 17:26

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

[C++ 게임 서버] 1-6. Lock 구현 이론

핵심 :

1. Lock 을 구현하는 방식은 크게 세 가지로 나뉜다. 무작정 기다리기, 잠시 후 돌아오기, 깨워줄 때까지 기다리기

2. SpinLock 을 사용하여 무작정 기다리거나, 어느 정도 Sleep 을 하고 난 후 Lock 을 다시 잡으려고 시도할 수도 있다.

3. 혹은 다른 일을 하다가, Lock 을 잡을 수 있게 되는 상태가 되었을 때 노티를 달라고 요청할 수도 있다. 예를 들어 Condition Variable 이 있다. 이 과정에서 컨텍스트 스위칭이 일어날 수 있다!

본격적으로 Lock 을 구현하기 전, Lock 을 구현하는 일반적인 방식 3 가지에 대해 먼저 소개하고 가도록 하겠다. 사실 내용은 간단하다.

Lock 이 이미 걸린 상태라고 할 때, 새롭게 Lock 을 획득하려는 쓰레드가 어떻게 행동하는 것이 좋을까?

 

1. 무작정 기다린다 

해당 방식의 대표적인 예시로는 SpinLock 이 있다.

 

2. 일단 자리로 갔다가 나중에 온다

얼마나 기다릴지는 모르겠지만, 일반적으로 sleep 등의 함수를 사용해 잠시 잠들었다 오는 경우가 이에 해당한다.

 

3. 제 3자에게 깨워달라고 요청하고 다른 일을 한다

마지막 방식을 현실적으로 제일 많이 사용할 것이다. 대표적으로는 condition variable 이나 future 등이 있다. 

 

3번이 제일 좋아 보이니, 그냥 무조건 3번으로 하면 될 것 같은데.. 사실 3 번의 경우 추가적인 공수가 들어간다.

쓰레드가 Lock 을 잡으려고 하다가 잠시 다른 업무를 하게 되면, 다른 일로 전환하기 위해 이전의 상태를 저장해야 한다. 이러한 전환을 컨텍스트 스위칭이라고 하며, 이 과정에서 캐시/레지스터를 사용하는 등의 비용이 발생한다.

실제로 간단한 Lock 상황의 경우, SpinLock 을 이용하는 것이 더 효과적일 때도 있다고 한다 😅

Comments