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

작성자 없음

작성자 정보가 삭제된 글입니다.

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Context Switching

Thread와 Context Switch에 대한 질문

21.04.27 19:45 작성

·

345

0

안녕하세요 ㅎㅎ강의 잘 듣고 있습니다. 

Q1. 유저레벨 스레드? 커널레벨 스레드?

선싱님 강의를 수강하니 운영체제 수업에서 배운 내용들이 하나 둘씩 기억나서 매우 반갑네요.

제가 기억하는 내용을 적어보면, 일반적으로 IO나 인터럽트에 의해 발생하는 프로세스 문맥 교환과 매우 유사하게 쓰레드도 레지스터나 캐시의  정보들을 주 메모리로 옮기는 과정을 운영체제가 도맡아 담당하게 됩니다. 때문에 쓰레드간의 문맥 교환시에 Kernel모드로 진입한다고 말씀하신거겠죠.

궁금한점은 쓰레드의 구현 방식에 따라? (아마 유저 레벨 쓰레드와 커널 레벨 쓰레드로 구별하는 것 같습니다.) 문맥 교환의 비용이 차이가 난다고 어디선가 배운 기억이 납니다.

본 강의에서 사용한 쓰레드는 생성시 라이브러리 함수를 사용했고.. 아마 내부적으로 시스템  콜을 호출했고 결과적으로 유저가 아닌 Kernel이 스케쥴링하니 커널레벨 스레드인 것 같은데요.. 그렇다면 유저레벨 스레드라는건 어떤걸까요? 유저(개발자)가 문맥교환을 담당하고 스케쥴링도 담당하는, 모든걸 개발자가 도 맡아하는 스레드인가요? 실제 유저 레벨 스레드가 많이 사용되는 경우는 어떤 경우인가요?

Q2. AutoResetEvent는 Kernel단으로 내려가서 문맥교환으로 인해 spinlock보다 성능이 저하될 수 있다고 말씀하셨습니다.

궁금한건 sleep 혹은 yield또한 cpu의 점유권을 포기한 상태에서 다른 스레드를 실행할 수 있기때문에 kernel로 진입후에 문맥교환이 발생하고 이에따른 성능 저하가 일어날 수 있을까요?

답변 1

0

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

2021. 04. 28. 06:24

1)
여기서 말하는 쓰레드는 다 '커널레벨 쓰레드'를 말하는겁니다.
'유저레벨 쓰레드'는 말 그대로 유저레벨에서 따로 관리해서 사용하는 것들인데
커널 입장에서는 그들의 존재조차 모릅니다.
즉, 유저레벨에서 할당받은 실행권을 내부에서 또 쪼개서 사용하는 형태인데요.
MMO 기준으로는 다수의 CPU 코어가 게임 로직을 동시에 실행하는 형태가 되어야 하기 때문에
유저레벨 쓰레드랑은 맞지 않습니다.

2)
절대적인 것은 아니지만 Lock이 금방 풀린다면
커널레벨 전환하지 않고 기다리는게 성능이 좋을 것이고
그게 아니라 Lock을 정말 오래 잡고 있을거라면
일단 CPU 소유권을 포기한 후 나중에 돌아오는게 좋습니다.
문맥교환이 부담이 되는 것은 sleep yield event 뿐 아니라 모든 애들도 해당하는 얘기입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기