• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

thread에 대한 질문입니다. (40:45지점)

21.10.23 14:08 작성 조회수 883

4

질문1

thread가 kernel thread와 user thread가 나누어져 있다는 부분이 이해가 가지 않습니다. 제가 이해한 바로는 하나의 thread가 있는데 이 thread가 시작할 때는 user 모드였다가 system 자원이 필요할 때 kernel 모드로 바뀌는 것으로 알고있습니다. 그러니까 하나의 thread가 user 모드와 kernel 모드로 바뀌어가며 실행되는 것이 아닌가요?

 

질문2

운영체제 입장에서는 kernel thread만 스케줄링 하면 된다는 부분이 이해가 가지 않습니다. 두 가지 측면에서 이해가 가지 않는데요.

첫 번째는 질문1에서처럼 제가 thread가 user thread와 kernel thread로  마치 두 몸인 것처럼 쪼갤 수 없기 때문에 user thread는 놔두고 kernel thread만 스케줄링 한다는 개념을 이해할 수 없습니다.

 두 번째는 user thread를 thread library가 관리한다는 부분입니다. 예를 들면 java로 프로그래밍 하게 되면 java thread 라이브러리에 해당 thread가 어떠한 우선 순위로 어떠한 알고리즘으로 스케줄링 될 것인지 모두 프로그래밍 되어 있다는 것인지요. 또 라이브러리 명령대로 한다고 가정하더라도 CPU는 어쨌든 운영체제가 관리하고 있는 것인데, 라이브러리의 명령을 받고 CPU를 user thread가 점령하게 되면, 운영체제는 그 user thread를 무시하고 kernel thread를 스케줄링 할 수 없을 텐데요. user thread가 CPU에서 나와야 kernel thread를 넣을 수 있을 테니까요. 이 논리라면 결국 user thread도 운영체제에 의해 스케줄링 되어야 한다는 결론에 이릅니다.

제가 어디를 잘못 이해하고 있는지 궁금합니다.

답변 2

·

답변을 작성해보세요.

7

김효준님의 프로필

김효준

2021.10.27

저도 아는 게 없지만 공부할 겸 이리저리 찾아서 적어봅니다... 혹여나 잘못된 점이 있다면 지적해주세요!

 

 

(1) kernel mode, user modeCPU(프로세서)의 동작 모드입니다.

CPU 상에서 OS가 처리될 땐, CPUOS 관련 code를 처리할 땐, CPUkernel mode로 동작하여 모든 리소스에 대한 권한이 제공됩니다. 반대로 CPU 상에서 사용자 프로그램이 처리될 땐, CPUuser가 작성한 code를 처리할 땐, CPUuser mode로 동작하여 리소스에 대해 제한된 권한이 부여됩니다.

 

사용자 프로그램이 system call을 요청하면 CPUuser mode에서 kernel mode로 넘어가서, CPU 상에서 OS가 처리되어 OS가 사용자 프로그램의 system call을 처리합니다.

 

사용자 프로그램이 system call을 하지 않더라도, timer interrupt를 통해 주기적으로 user mode에서 kernel mode로 전환되어 OSscheduling 또는 context switching 등의 관리를 수행합니다.

 

 

 

(2) kernel threadOS에 의해 생성/관리되는 thread이고, user thread는 사용자 프로그램이 자체적으로 생성/관리하는 thread입니다.

 

kernel thread의 경우, 생성 주체가 kernel이기 때문에 CPU scheduler가 그 존재를 알고 있으며 kernel thread 단위로 scheduling도 가능합니다.

 

반면, CPU scheduler 입장에서 user thread는 존재하지 않는 것처럼 보일 것입니다. CPU는 단지 메모리 상에 올라와 있는 사용자 프로그램을 처리할 뿐이며, 이 때 이 사용자 프로그램은 하나의 single-threaded process”으로 간주될 것입니다. (물론 이 때 CPUuser mode겠지요.)

 

따라서, user threadmulti-thread의 진정한 효과를 보기 위해선 kernel thread와의 mapping이 요구됩니다. CPU scheduler가 인식할 수 있는 kernel thread를 여러 개 생성해놓은 뒤 thread pool에 보관하면, 사용자 프로그램의 요청에 따라 user threadkernel threadmapping이 이루어집니다.

 

 

 

(3) 쟁점은 결국, kernel threadkernel mode냐 하는 것 같습니다.

제가 이해한 것은, kernel modeCPUOS code를 실행할 때를 의미하고, user modeCPUuser code를 실행함을 의미합니다.

 

https://www.quora.com/Why-are-user-threads-mapped-to-kernel-threads

여기에 나온 답변이 맞는지는 모르겠지만, user threadkernel threadmapping된 후 실행될 때, 실행에 필요한 codedatakernel thread에게 넘긴다고 합니다. 따라서 kernel thread에 담긴 것은 user code가 되므로 CPUuser mode에서 동작할 것이라 생각합니다.

 

제가 이해한 바에 따르면, kernel thread라는 용어는 생성 주체가 kernel임을 의미할 뿐, kernel mode와는 무관하다고 생각됩니다.

 

또, 동작을 마친 kernel thread는 삭제되지 않고 다시 thread pool로 되돌아 갑니다. 이렇게 보면 kernel thread는 일종의 그릇 역할인 듯 합니다...

 

 

 

(4) kernel thread와 user thread의 구분은

https://www.youtube.com/watch?v=sOt80Kw0Ols

위 영상을 참조하시면 도움이 되실 것 같습니다.

답변 감사합니다. kernel thread든 user thread든 kernel mode와 user mode를 오고가며 프로그램이 실행된다는 것이군요. thread 구분은 생성 주체가 누구이냐고 mode 구분은 system call을 통해 kernel code를 실행하느냐 마느냐의 차이군요.

정리를 잘 해주셔서 많은 도움이 되었습니다. 링크해주신 강의도 나중에 챙겨봐야겠어요. 감사합니다.

좋은 질문과 좋은 답변입니다. ^^;

 

임현강님의 프로필

임현강

2022.08.24

이해에 아주 큰 도움을 받았습니다.

양질의 답변 남겨주셔서 정말 감사합니다.

0

자바를 기준으로 이해하시면 될 것 같습니다.

 

JVM 프로세스는 커널 입장에서는 하나의 프로세스라고 볼 수 있습니다. 하지만 자바 가상머신은 내부적으로 쓰레드 모델을 가지고 있으므로 멀티쓰레딩을 할 수 있습니다. 이렇게 운영체제/하드웨어와 무관하게 자바가상머신이 쓰레드를 관리한다면 그것은 user thread가 되겠지요? 자바가상머신의 초창기 모델은 이런 쓰레드 모델을 사용했고, 그것을 green thread라 불렀습니다.

 

반면에, 운영체제 커널이 직접 관리하는 쓰레드는 kernel 쓰레드가 되겠지요. 자바가상머신이 생성하는 쓰레드를 운영체제 커널에 일일이 쓰레드 요청을 해서 매핑을 시킨다면, 자바가상머신은 운영체제의 커널 쓰레드에 종속이 될 것입니다. 이런 쓰레딩 모델을 자바에서는 native thread라 부릅니다. 현대적인 JVM은 대부분 native thread 모델을 사용하고 있지요.

 

답변 감사드립니다. 그런데 제가 이해한 부분이 맞는지 궁금해서 다시 질문드립니다.

JVM 프로세스 내부에 여러개의 thread가 돌아가고 있는 상황을 가정합니다. 그리고 JVM은 운영체제의 여러개의 thread를 사용하고 있습니다. 이때 운영체제는 JVM이라는 하나의 Process가 여러개의 thread 위에서 돌아가고 있다고 여깁니다.

그런데 JVM의 가상의 thread가 I/O request를 호출할 필요가 있다면, JVM이 대신하여 운영체제에 I/O request 를 호출할 것입니다. 이때 system call을 호출하게 되는 실체의 운영체제 thread는 kernel mode가 됩니다.

JVM의 초창기 모델이라면 JVM의 내부 가상 thread는 운영체제/하드웨어와 독립적이므로 무조건 user mode 입니다. (green thread)

반면 현대적인 JVM의 가상 thread는 1:1로 운영체제 thread와 맵핑된 상태이므로, kernel mode가 된 운영체제의 thread를 따라서 그것에 맵핑된 JVM의 가상 thread 또한 kernel mode가 됩니다. (native thread)

강의 초반 부분의 내용인 kernel mode와  user mode 개념을 사용해서 이렇게 이해했습니다. 제가 제대로 이해한 것인지요.

또... 이번 강의에서는 JVM상의 가상의 thread와 OS상의 실제 thread를 구분하기 위해 user thread, kernel thread라는 단어를 사용하신 것인지 궁금하네요. 강의 초반의 kernel mode와 user mode와는 다른 개념으로 사용하신 것인가요? 이것 때문에 많이 헷갈렸던 것 같습니다.