해결된 질문
작성
·
1.1K
0
Context Switching에 대해 공부하다가 궁금한점이 생겨서 질문합니다 :)
강의 내용에서 Sleep(n)을 하면 n만큼의 밀리초 만큼 휴식을 취한뒤 다시 작업을 한다고 들었는데요.
그 기다리는 시간동안 해당 쓰레드는 CPU를 계속 점유하고 있는건지, 아니면 CPU 사용권을 다른 쓰레드에게 양도한다는 개념인지 헷갈려서 질문드립니다.
만약 Sleep하는동안 CPU를 계속 점유한다면, Context Switching은 일어나지 않을테고,
Sleep을 실행하는동안 CPU 소유권을 다른 쓰레드에게 넘겨줘서 해당 시간이 지난뒤 Context Switching이 일어나서 다시 하던일을 이어간다고 생각하는데, 어떤것이 맞는지 모르겠습니다.
만약 Sleep이 후자의 내용처럼 CPU점유권을 넘겨준다면, Sleep() 명령어는 넘겨줄 쓰레드가 존재한다면, 항상 Context Switching이 발생한다, 라는 명제를 참으로 생각해도 괜찮을까요?
그리고, 만약 휴식을 취한다고 했지만, 정작 남아도는(혹은 쉬고있는) 다른 쓰레드가 우연히 존재하지 않을때는 Sleep의 경우 본인이 CPU를 계속 점유하는지도 궁금합니다.
그리고 Yield의 경우 양보를 할때, 만약 쓰레드가 여러개 대기하고 있다면 어떤것을 먼저 실행할지는 어떻게 결정되는건가요?
마지막으로, Context Switching은 한 프로세스 내에서 쓰레드 끼리의 스위칭이라고 생각했었는데요, 관련 자료를 찾아보면서 공부해보니, 반드시 쓰레드 끼리에서만 일어나는게 아니라, 프로세스와 또 다른 프로세스끼리 큰 범주에서도 일어나는 스위칭을 말하기도 한다는데, 그렇다면 Context Switching의 정확한 개념은 전자와 후자를 모두 통칭하는 말로 이해하면 되는건가요? 강의에서는 한 프로세스내의 쓰레드 끼리의 스위칭만 말씀하셔서 좀 헷갈려서 질문 남깁니다.
답변 2
2
기본적으로 OS 단에 요청하는 거~의 모든 API (Console.Write, Sleep 등)은
CPU 사용권을 일단 반납하고 운영체제 쪽에서 다음 처리를 판별하게 되기 때문에
Context Switching이 일어난다고 생각하면 됩니다.
사실 유저 모드에서는 일종의 샌드박스 형태로 갇혀있기 때문에
다른 프로세스/쓰레드 존재와 상태에 대해 딱히 판별할 수가 없습니다.
따라서 Sleep을 실행한다면 일단 CPU 점유권을 포기하고
커널 모드로 들어가 OS한테 실행 권한을 넘겨주는 형태가 됩니다.
사실 Sleep 할 때 CPU 소유권을 물고 있는다면 그것도 은근 무서운 일이 될텐데요.
while(true) { Sleep(10초) } 하는 코드를 넣은 프로그램을
동시에 20개 실행하면 사실상 컴퓨터가 마비되는 현상이 벌어질겁니다.
Context-Switching이 발생한 다음엔 OS가 다음으로 실행할 쓰레드를 결정하게 되는데,
기본적으로 [오래 기다린 순서]와 [중요도 (처음 프로그램을 실행할 때 설정 가능)]를 고려하지만
사실 뭘 선택할지는 정말 운영체제 마음이라 딱히 뭐라고 정해진 답은 없습니다.
마지막으로 [휴식을 취하고 싶은데, 정작 남아도는 쓰레드가 없을 경우]는
서버가 실행되고 있는 OS에서 돌아가고 있는
프로세스 개수를 생각해보면 아예 현실성이 없을 것 같습니다.
사실 [남아도는 쓰레드가 없다]는 것도 살짝 이상한게,
현재 실행중인 모든 쓰레드에서 Sleep과 같은 대기를 요청한 상태가 아닌 이상
다들 먹이를 갈구하는 아기새처럼 서로 CPU Time Slice를 간절하게 받기를 원하는 상태이기 때문에
CPU 소유권을 기꺼이 받을 쓰레드는 항상 있다고 볼 수 있습니다.
추가로 콘솔(XBOX 등)의 경우 최대한 쓰레드 수와 CPU 코어 수를 맞추도록 개조하여,
Context-Switching이 거의 일어나지 않게 억제한다고는 들었습니다.
감사합니다.
0