KoreanFoodie's Study
[C++ 게임 서버] 1-6. Lock 구현 이론 본문
[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 을 이용하는 것이 더 효과적일 때도 있다고 한다 😅
'Game Dev > Game Server' 카테고리의 다른 글
[C++ 게임 서버] 1-8. Sleep 개념과 구현 (0) | 2023.07.12 |
---|---|
[C++ 게임 서버] 1-7. SpinLock 개념과 구현 (0) | 2023.07.11 |
[C++ 게임 서버] 1-5. DeadLock 의 개념과 기초 (+ std::lock) (0) | 2023.07.10 |
[C++ 게임 서버] 1-4. Lock 기초 (lock_guard, unique_lock) (0) | 2023.07.10 |
[C++ 게임 서버] 1-3. atomic (원자적) 변수와 연산 (0) | 2023.07.10 |
Comments