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

literate_t님의 프로필 이미지
literate_t

작성한 질문수

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

SpinLock

스핀 락에서 CPU 점유율 관련한 질문입니다!

작성

·

80

·

수정됨

0

안녕하세요!

스핀이 계속 되면서 CPU 점유율이 치솟는 문제에 대한 대안으로 sleep_for(1ms)를 호출하는 건 어떻게 생각하실지 궁금합니다.

질문을 다 하고 나니, 커널의 도움을 굳이 받지 않고 오래 대기하지 않아도 되는 상황이 보장될 때 사용하면 좋은 락이 스핀 락인데 sleep_for()을 하면 컨텍스트 스위칭이 발생하겠네요. 이렇게 되면 스핀 락을 쓰는 이유가 퇴색될 것 같다는 생각이 듭니다.

고견 부탁드립니다🙏

답변 2

1

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

적당히 섞어 쓰면 됩니다.
이전 프로젝트에서도 대략 5000번 스핀을 해보고
그래도 실패하면 한 번 잠드는 코드가 있긴 했습니다.

literate_t님의 프로필 이미지
literate_t
질문자

답변 감사합니다!

그 5000번 카운팅도 원자적으로 연산했을까요~?
atomic 연산이 생각보다 무거운 연산이라고 말씀하셨을 때 남용하면 안 되겠다는 생각이 들었는데, 스핀 락 카운팅할 때 사용하면 괜찮은지 알려주시면 나름의 기준점이 될 것 같습니다!

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

락을 잡은 쪽에서 처리하는 것이니 원자적일 필요가 당연히 없고 로컬 변수로 하면 됩니다.
코드를 더 유심히 보시고 고민해보세요

literate_t님의 프로필 이미지
literate_t
질문자

카운팅하는 건 공유 자원이 아니고(그럴 필요도 없고) 락을 잡은 쪽에서 카운팅하는 것이며 이는 로컬 변수를 둬서 하면 된다!

"락을 잡은 쪽에서 처리하는 것"이라는 표현에서 조금 헷갈렸었는데 결국 로컬 변수로 처리한다는 것이 "락을 잡은 쪽에서 처리하는 것"과 같은 의미인 것 같네요.

감사합니다!

1

안녕하세요, 인프런 AI 인턴입니다. literate_t님

스핀 락과 관련한 CPU 점유율 문제에 대한 질문을 주셨네요. 관련된 주제에 대한 기존 답변을 찾아보았습니다.

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

    • 이 게시물에서 스핀 락과 일반 락의 차이점, 특히 스핀 락의 효용성에 대해 다룹니다. 스핀 락은 비교적 짧은 시간 동안의 락일 때 유리하며, 지속적인 CPU 점유로 인해 busy waiting이 발생하는 반면, 일반 락은 컨텍스트 스위칭을 통해 CPU 자원을 덜 소모합니다.
  2. 이벤트 질문입니다.

    • 여기서는 스핀 락과 뮤텍스의 차이점을 설명합니다. 특히 뮤텍스는 필요 시 sleep 상태로 들어가며, 스핀 락은 계속해서 락을 시도하는 방식이라 CPU 점유율에서 차이가 발생합니다.
  3. 제가 맞게 이해한것인지 모르겠습니다.

    • 이 게시물에서는 스핀 락과 sleep의 차이점, 그리고 각 접근 방식의 장단점에 대해 논의합니다. 스핀 락은 짧은 대기 시간에 유리하며, sleep은 장기적인 자원 점유에서 유리합니다.

스핀 락은 비교적 짧은 시간 동안의 경합이 예상될 때 사용하는 것이 효율적입니다. 만약 long-term 경합이 발생할 가능성이 높다면, sleep이나 yield 함수를 사용하는 것이 좋습니다. sleep_for(1ms)를 사용하여 컨텍스트 스위칭이 발생하면, 스핀 락의 장점이 퇴색될 수 있기 때문에, 상황에 맞게 유동적으로 락의 종류를 선택하는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

literate_t님의 프로필 이미지
literate_t

작성한 질문수

질문하기