인프런 커뮤니티 질문&답변

유영재님의 프로필 이미지
유영재

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: 데이터베이스

대기와 락

안녕하세요 선생님 lock과 spinlock에 대해서 질문드립니다.

작성

·

493

0

예전 스핀락 설명 하실때 메모한 내용입니다.

락을 걸고 있는 상대방이 조금만 기다리면 놔줄 것 같다는 확신이 있을 때는

굳이 Context-Switching까지 가지 않고 무식하게 대기하는 SpinLock이 좋습니다.

비행기 1인 화장실 앞에서 대기하는데,

안에서 손 씻고 있는 소리가 들린다면,

굳이 자리에  돌아가서 대기하기 보단 문앞에서 조금만 더 기다리는게 현명합니다.

MMO에서 lock을 쓰는 경우는 대부분 컨텐츠의 멀티쓰레드 경합 처리에서 사용하게 되는데,

어마어마하게 오래 걸리는 작업이 아닌 경우가 많기 때문에 

SpinLock이 대부분의 경우에서 유리합니다.

질문

컨텍스트 스위칭이라는게 a쓰레드가 공유 자원을

다쓰고 쓰레드 풀로 들어가면 b라는 쓰레드가

공유자원을 획득해서 사용하는 걸로 알고 있는데

그러니까 프로세스 내부에 stack 공간만 바뀌는

스핀락이라는게

무한 반복 타고 들어가서 계속 기다리잖아요

상대방이 빠져나올떄 까지

lock은 접근 했다가 a라는 쓰레드가 사용중이네

글멈 나는 다른 작업 하고 이따 한번 더와바야지

이 개념이 아닌가요?

여기서 왜 컨텍스트 스위칭이라는 표현을 쓰셨는지

여쭤봅니다?

a가 가고 b가 들어가야 컨텍스트 스위칭이 성립되는 게 아닌가요?

답변 1

3

Rookiss님의 프로필 이미지
Rookiss
지식공유자

컨텍스트 스위칭이라는게 a쓰레드가 공유 자원을

다쓰고 쓰레드 풀로 들어가면 b라는 쓰레드가

공유자원을 획득해서 사용하는 걸로 알고 있는데

-> 그렇지 않습니다.

컨텍스트 스위칭은 공유 자원이랑은 아무런 상관이 없고 쓰레드 풀과도 무관합니다.
그냥 실행중인 어떤 쓰레드 A가 자신이 할당받은 실행시간(timeslice)을 다 쓰거나,
커널에서 실행해야 하는 함수 (sleep, yield 는 물론 console.writeline와 같은 것도 포함)를
호출하면서 유저모드->커널모드로 변환이 일어나고,
다른 쓰레드가 실행권을 얻으면서 쓰레드 교체가 일어나는 상황을 context switching이라고 합니다.

context는 문맥의 의미인데 말 그대로 현재 쓰레드가 실행중에 필요한 모든 정보(레지스터 등)를 의미하고
이 정보를 보존해야 다음 실행권을 얻을 때 현 실행 상태를 복원할 수 있습니다.
위 설명하신 내용을 보니 오해하시는 것 같은데
어떤 쓰레드가 모든 일을 끝내고 소멸될 때만 context switching이 일어나는 것이 아니라
커널레벨로 변환이 필요한 그 어떤 함수를 호출해도 일어납니다. (네트워크, 파일 io 등)


스핀락은 정말 유저 레벨에서 무한 while 루프를 돌고 있기 때문에
쓰레드 교체를 하지 않고 계속 CPU 자원을 소모하면서 버티는 것입니다.
반면 [그럼 나는 이따 한 번 더 와바야지~]라고 체념하면서
sleep, yield를 호출하고 
본인의 실행권을 내려놓으면,
바로 그 실행권이 다른 쓰레드에게 넘어가면서 Context Switching이 일어납니다.


그리고 스핀락도 락의 일종입니다.
말 그대로 경합이 일어났을 때 어떤 정책을 취할 것이냐 (양보? 버티기?)에 따라
동작이 다른 것이지 lock은 무조건 양보한다고 생각하면 안 됩니다.

유영재님의 프로필 이미지
유영재

작성한 질문수

질문하기