lock 구현 이유
lock은 워낙 자주 사용된다
또한, 서버 프로그래머 면접에서도 필수로 등장하는 주제이기에
깊이 있게 이해하기 위해 직접 구현해 보는 것이 좋다
lock 구현하기 전 고민해야할 이론
- 무조건 안에는 하나의 스레드만 있도록 해야 한다
- 안에 누가 있다면 어떻게 할 것이냐?
1. SpinLock: 계속 기다리기
단점) 시간낭비
장점) 이동거리 X
2. Sleep: 랜덤 하게 와서 비워졌는지 확인
단점) 타이밍 운, 이동거리 O
장점) 시간낭비 평균적으로 줄어듬
3. Event: 누군가한테 확인을 부탁
단점) 리소스("누군가") 사용, 이동거리 O
장점) 시간낭비 최소
컨텍스트 스위칭
위에서 언급된 이동거리는 컨텍스트 스위칭을 의미한다
대표적으로
유저모드의 스레드가 종료되면서
커널모드(스레드)로 전환하는 과정이 발생하는 경우
이처럼 스레드 간 전환이 발생하는 경우 일어나는 비용을
컨텍스트 스위칭이라고 한다
특히, 컨텍스트 스위칭에서는
사용된 정보들이 담긴 레지스터를 RAM으로 보내고
RAM에서 사용해야 할 정보들을 레지스터에 담아야 한다
이러한 컨텍스트 스위칭은 매우 느리다
SpinLock / Sleep / Event의 컨텍스트 스위칭
SpinLock은 컨텍스트 스위칭 비용이 없다
Sleep과 Event는 컨텍스트 스위칭 비용이 있다
위의 세가지는 각자의 장단점이 있다
세가지 중 하나만을 쓰는 것이 아닌 복합적으로도 사용 가능하다
'게임 서버' 카테고리의 다른 글
[게임서버 섹션2 Note] Sleep (0) | 2024.12.29 |
---|---|
[게임서버 섹션2 Note] SpinLock (0) | 2024.12.29 |
[게임서버 섹션2 Note] DeadLock (0) | 2024.12.29 |
[게임서버 섹션2 Note] Lock 기초 (0) | 2024.12.28 |
[게임서버 섹션2 Note] Atomic (0) | 2024.12.28 |