• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

하나의 쓰레드에만 일감이 몰리는 현상이 왜 안좋은가요?

22.07.16 15:42 작성 조회수 296

2

하나의 쓰레드가 여러 개의 JobQueue를 점유하는 현상이 안좋은 이유는 알겠습니다. 다른 쓰레드가 다른 JobQueue의 Job들을 처리하지 못하게 되니까요.

그런데 모든 쓰레드가 모든 일감을 처리할 수 있는 만능 일꾼이 된 상황에서, 하나의 쓰레드가 하나의 JobQueue를 오래동안 잡고있는 현상이 왜 안좋은지는 잘 이해가 안갑니다. 어차피 하나의 쓰레드가 붙잡고 해야할 일이 아닌가요? 동시에 여러 쓰레드가 처리 가능한 것도 아닌 것 같구요...

예를 들어, 쓰레드 A, B, C가 있다고 해봅시다.

쓰레드 A가 JobQueue 'ㄱ'를 점유하고 계속 작업을 하고 있습니다. 쓰레드 B와 C는 'ㄱ'과 관련된 일은 모두 A에게 몰아주고 나머지 작업들을 처리하고 있습니다. 

그런데 A의 'ㄱ'점유가 너무 길어져서 'ㄱ'의 점유를 B에게 넘겨주었습니다. 그리고 A는 B와 C가 하던 것 처럼 나머지 작업들을 처리하게 되었습니다. 

그럼 결국 'ㄱ'의 점유가 A에서 B로 넘어갔을 뿐 달라진 것이 없지 않나요? 오히려 쓸 데 없는 스위칭 비용만 발생한 것이 아닌가요? 

 

답변 2

·

답변을 작성해보세요.

2

하나의 쓰레드가 JobQueue를 오래 잡고 있는 현상이 나쁜 이유는
처리해야 할 JobQueue가 한둘이 아니기 때문입니다.
JobQueue를 Zone 단위로 배치하는 경우도 있지만
심리스 게임에서는 Actor 단위로 JobQueue를 두기도 합니다
그렇다는 것은 꾸준히 실행해야 할 JobQueue가 몇십만 단위인데,
일반적으로 CPU 코어는 많아도 몇십 단위입니다.

하나의 JobQueue만 편애해서 오래 실행하고 있으면
그 유닛은 행복하겠지만 다른 애들은 굶어죽는 starvation 현상이 일어나겠죠.
실제로 주변에 너무 많은 유닛들이 몰려서
돌아가면서 JobQueue를 소모하는 속도보다
일감이 쌓이는 속도가 빨라지면,
점점 반응속도가 밀리기 때문에 렉이 발생하게 됩니다.

균일하게 모든 JobQueue를 실행해야 한다는 측면에서 
너무 지나치게 오래 붙잡으면 안된다는 의미이지,
굳이 실행하던 애를 다른 쓰레드한테 넘겨줘야 한다는 의미가 아닙니다.

0

akrhwkwk님의 프로필

akrhwkwk

질문자

2022.07.16

답변 감사드립니다!

JobQueue가 몇 개 안되면 하나의 쓰레드가 하나의 JobQueue를 계속 잡고있어도 상관 없지만.

처리해야 할 JobQueue가 CPU코어 갯수보다 훨씬 많은 경우에는, 모든 JobQueue들이 골고루 실행되기 위해 하나의 쓰레드가 하나의 JobQueue를 계속 잡고있게 해서는 안된다는 뜻이었군요.

잘 기억해보니 강의 안에서 이미 그런 말을 하셨던 것 같네요.. 했던 말 또 하게 해드려서 좀 죄송합니다요..

그래도 덕분에 잘 이해되었습니다. 감사합니다.