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

박승훈님의 프로필 이미지
박승훈

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Sleep

Spinlock과 랜덤 메타의 차이

작성

·

357

0

안녕하세요, Rookiss님

수업을 듣다가 궁금한 점이 있어서 질문 드립니다.

 

Spinlock의 경우 프로세스 및 쓰레드가 공유 자원에 접근하기 위해 지속적으로 대기하기 때문에 이로 인한 CPU 성능 부하가 발생한다고 저는 이해하였습니다.

 

따라서 위와 같은 Spinlock의 단점을 보완하기 위해 랜덤 메타에서는 sleep 혹은 yield라는 함수를 사용하였는데, 이는 프로세스 및 쓰레드(?)를 running 상태에서 asleep 상태로 변경하는 것으로 저는 이해하였습니다.

 

그러면 이 과정에서 자연스럽게 context switching에 의한 오버헤드가 지속적으로 발생하게 되며, 이로 인한 오버헤드가 Spinlock에 의한 오버헤드보다 더 큰 경우도 발생하지 않을까요?

 

예를 들면 this_thread::sleep_for(std::chrono::milliseconds(100))이라는 함수를 while문 내부에 작성한다면, 프로세스 및 쓰레드는 100ms를 간격으로 지속적으로 running 상태와 asleep 상태를 순회할 것입니다. 이 과정에서 context switching이 발생하게 되고, 이로 인한 오버헤드가 Spinlock에서 while문을 지속적으로 순회하는 오버헤드에 비해 더 큰 경우도 발생하지 않을까요?

 

감사합니다.

답변 2

0

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

네 물론 그렇습니다.
보통 MMO 컨텐츠에선 그렇게 락을 오래 잡을 일이 없으니 SpinLock이 더 효율적이지만, 정말 '오래' 걸리는 작업아라면 스핀락은 독약이 될테니 케바케로 뭐가 더 효율적인지는 다릅니다.

0

안녕하세요, 인프런 AI 인턴이에요. Spinlock과 랜덤 메타의 차이에 관해 궁금한 점을 질문해주셨군요.

랜덤 메타에서 사용하는 sleep 혹은 yield 함수는 Spinlock에서 발생하는 busy waiting 문제를 해결하기 위한 방법 중 하나입니다. Spinlock에서는 공유 자원에 대한 점유권이 획득될 때까지 계속 while문 안에서 대기하기 때문에 CPU 성능 부하가 많이 발생합니다. 이에 반해 랜덤 메타에서는 sleep이나 yield 함수를 통해 점유권을 양도하고, 올바른 시간에 접근하여 서로간의 대기시간을 효율적으로 줄일 수 있습니다.

하지만, sleep이나 yield 함수를 사용하는 것은 특정 조건에서만 효과적입니다. CPU 성능이 넉넉하지 않아서 context switching이 많이 일어나는 경우, 랜덤 메타에서도 오버헤드가 발생할 수 있습니다. 따라서 sleep 혹은 yield 함수를 어떻게 사용하느냐에 따라 Spinlock과 마찬가지로 성능 문제가 발생할 수 있음을 염두에 두시길 바랍니다.

감사합니다.

박승훈님의 프로필 이미지
박승훈

작성한 질문수

질문하기