Thread와 Context Switch에 대한 질문
447
작성자 없음
작성한 질문수 0
안녕하세요 ㅎㅎ강의 잘 듣고 있습니다.
Q1. 유저레벨 스레드? 커널레벨 스레드?
선싱님 강의를 수강하니 운영체제 수업에서 배운 내용들이 하나 둘씩 기억나서 매우 반갑네요.
제가 기억하는 내용을 적어보면, 일반적으로 IO나 인터럽트에 의해 발생하는 프로세스 문맥 교환과 매우 유사하게 쓰레드도 레지스터나 캐시의 정보들을 주 메모리로 옮기는 과정을 운영체제가 도맡아 담당하게 됩니다. 때문에 쓰레드간의 문맥 교환시에 Kernel모드로 진입한다고 말씀하신거겠죠.
궁금한점은 쓰레드의 구현 방식에 따라? (아마 유저 레벨 쓰레드와 커널 레벨 쓰레드로 구별하는 것 같습니다.) 문맥 교환의 비용이 차이가 난다고 어디선가 배운 기억이 납니다.
본 강의에서 사용한 쓰레드는 생성시 라이브러리 함수를 사용했고.. 아마 내부적으로 시스템 콜을 호출했고 결과적으로 유저가 아닌 Kernel이 스케쥴링하니 커널레벨 스레드인 것 같은데요.. 그렇다면 유저레벨 스레드라는건 어떤걸까요? 유저(개발자)가 문맥교환을 담당하고 스케쥴링도 담당하는, 모든걸 개발자가 도 맡아하는 스레드인가요? 실제 유저 레벨 스레드가 많이 사용되는 경우는 어떤 경우인가요?
Q2. AutoResetEvent는 Kernel단으로 내려가서 문맥교환으로 인해 spinlock보다 성능이 저하될 수 있다고 말씀하셨습니다.
궁금한건 sleep 혹은 yield또한 cpu의 점유권을 포기한 상태에서 다른 스레드를 실행할 수 있기때문에 kernel로 진입후에 문맥교환이 발생하고 이에따른 성능 저하가 일어날 수 있을까요?
답변 1
0
1)
여기서 말하는 쓰레드는 다 '커널레벨 쓰레드'를 말하는겁니다.
'유저레벨 쓰레드'는 말 그대로 유저레벨에서 따로 관리해서 사용하는 것들인데
커널 입장에서는 그들의 존재조차 모릅니다.
즉, 유저레벨에서 할당받은 실행권을 내부에서 또 쪼개서 사용하는 형태인데요.
MMO 기준으로는 다수의 CPU 코어가 게임 로직을 동시에 실행하는 형태가 되어야 하기 때문에
유저레벨 쓰레드랑은 맞지 않습니다.
2)
절대적인 것은 아니지만 Lock이 금방 풀린다면
커널레벨 전환하지 않고 기다리는게 성능이 좋을 것이고
그게 아니라 Lock을 정말 오래 잡고 있을거라면
일단 CPU 소유권을 포기한 후 나중에 돌아오는게 좋습니다.
문맥교환이 부담이 되는 것은 sleep yield event 뿐 아니라 모든 애들도 해당하는 얘기입니다.
TLS 질문드립니다.
0
33
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
37
2
Unity Span
0
64
2
XML, Dll 차이점
0
98
2
Session 질문입니다
0
74
1
Write Read 커서 키워드
0
69
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
65
2
네트워크 Send 전담 스레드 배치
0
94
2
UnhandledException 으로 서버 터지는 경우
0
82
2
컨텐츠 단, 엔진 단
0
100
1
질문 있습니다
0
73
2
C# 게임서버 3D MMORPG
0
141
2
유니티6 버전
0
94
2
receive하는 부분과 send하는 부분의 차이
0
128
2
커서의 위치의 중요성
0
99
2
C++ 전혀 모르는데 C# 서버
0
164
2
강의에 질문이 있습니다
0
83
2
멀티스레드 이해도 질문
0
90
1
500 vs 500
0
122
3
OnAcceptHandler 액션 함수
0
57
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
185
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
78
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
100
1
스핀락 질문.
0
104
2





