해결된 질문
작성
·
512
1
안녕하세요 선생님, 재밌게 강의 보고 있는 개발자입니다.
제가 [스레드 중지 – flag variable vs interrupt() - 2] 강의에서 9:15 즈음에, Thread.sleep(1) 을 통해서 Context Switch 를 강제하는 방법을 봤습니다. 결과적으로 정상 종료가 되었구요.
그런데 문득 의문점이 들더군요.
제 의문점을 기반으로 질문을 하자면 아래와 같습니다.
Question:
굳이 Thread.sleep(1) 을 하지 않아도
제 컴퓨터에는 이미 무수히 많은 프로세스와 쓰레드가 존재하니, 언젠가는 Java 의 Thread 도 Context Switch 가 일어나지 않나요??
그러면 결과적으로 계속 기다리면 언젠가는 Thread.sleep(1) 을 안 써도 실행한 main 문이 정상 종료되는게 맞지 않나요?
답변 2
1
네 그것도 맞는 말씀이긴 합니다.
하지만 running 이 true 인 상태에서 스케줄러가 어떤 시점에 어떤 우선순위로 첫번째 스레드를 중단하게 될지 알지 못하고 우리가 의도하는 바는 running 이 false 가 되면 바로 종료되길 원하는 것입니다.
그래서 volatile 이나 Atomic 연산을 통해 메인메모리로부터 바로 running 값을 가지고와서 작업을 종료하는 것이 가장 안전하고 약간 우회적으로 sleep 을 주게 되면 바로 대기하고 깨어나서 실행하게 되니 스케줄러로 하여금 바로 중단할 수 있는 힌트를 주는 것이라 볼 수 있습니다.
그리고 while 문을 돌고 있는 상황이면 해당 스레드가 계속 cpu 를 점유할 수도 있습니다.
사실 이 부분은 자바로 재현하기가 쉽지는 않습니다.
아마 예제를 실행하는 PC 의 CPU 코어가 많다면 첫번 째 스레드와 두번째 스레드는 각 CPU 에서 돌아갈 가능성도 있습니다. 그러면 컨텍스트 스위칭이 일어나지 않겠죠
하지만 sleep 을 하게 되면 일단 대기로 빠지게 되니 캐시에서 제거된다고 이해하시면 됩니다.
말씀하신 것처럼 이론상으로는 식빵님의 견해도 틀리지는 않습니다.
그러나 그것이 전적으로 OS 의 스케줄링에 의한 부분이다 보니 직접 코드로 재현하기는 어렵고 개념적으로만 아셔도 될 것 같습니다.
0
저는 아무리 while 문이더라도 언젠가는 Thread Context Switch 가 한번은 일어나서,
결국은 java process 가 끝나지 않을까 했는데, Thread.sleep(1) 사용하지 않은 코드를
실행하고 30분째 기다려도 안 끝나네요.
혹시 이게 선생님 말씀대로 while 문에 의한 지속적인 cpu 점유 때문일까요??