• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

[스레드 중지 – flag variable vs interrupt() - 2] 강의 Context Switch 관련 질문있습니다.

23.12.02 15:47 작성 조회수 382

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 를 점유할 수도 있습니다.

식빵님의 프로필

식빵

질문자

2023.12.02

저는 아무리 while 문이더라도 언젠가는 Thread Context Switch 가 한번은 일어나서,
결국은 java process 가 끝나지 않을까 했는데, Thread.sleep(1) 사용하지 않은 코드를
실행하고 30분째 기다려도 안 끝나네요.
혹시 이게 선생님 말씀대로 while 문에 의한 지속적인 cpu 점유 때문일까요??

사실 이 부분은 자바로 재현하기가 쉽지는 않습니다.

아마 예제를 실행하는 PC 의 CPU 코어가 많다면 첫번 째 스레드와 두번째 스레드는 각 CPU 에서 돌아갈 가능성도 있습니다. 그러면 컨텍스트 스위칭이 일어나지 않겠죠

하지만 sleep 을 하게 되면 일단 대기로 빠지게 되니 캐시에서 제거된다고 이해하시면 됩니다.

말씀하신 것처럼 이론상으로는 식빵님의 견해도 틀리지는 않습니다.

그러나 그것이 전적으로 OS 의 스케줄링에 의한 부분이다 보니 직접 코드로 재현하기는 어렵고 개념적으로만 아셔도 될 것 같습니다.

식빵님의 프로필

식빵

질문자

2023.12.02

설명 감사합니다!

0

선종우님의 프로필

선종우

2024.02.17

오 저도 강의 듣다가 궁금했던 부분인데 이해되었스빈다