thread에 대한 질문입니다. (40:45지점)
저도 아는 게 없지만 공부할 겸 이리저리 찾아서 적어봅니다... 혹여나 잘못된 점이 있다면 지적해주세요! (1) kernel mode, user mode는 CPU(프로세서)의 동작 모드입니다. CPU 상에서 OS가 처리될 땐, 즉 CPU가 OS 관련 code를 처리할 땐, CPU가 kernel mode로 동작하여 모든 리소스에 대한 권한이 제공됩니다. 반대로 CPU 상에서 사용자 프로그램이 처리될 땐, 즉 CPU가 user가 작성한 code를 처리할 땐, CPU가 user mode로 동작하여 리소스에 대해 제한된 권한이 부여됩니다. 사용자 프로그램이 system call을 요청하면 CPU가 user mode에서 kernel mode로 넘어가서, 즉 CPU 상에서 OS가 처리되어 OS가 사용자 프로그램의 system call을 처리합니다. 사용자 프로그램이 system call을 하지 않더라도, timer interrupt를 통해 주기적으로 user mode에서 kernel mode로 전환되어 OS가 scheduling 또는 context switching 등의 관리를 수행합니다. (2) kernel thread는 OS에 의해 생성/관리되는 thread이고, user thread는 사용자 프로그램이 자체적으로 생성/관리하는 thread입니다. kernel thread의 경우, 생성 주체가 kernel이기 때문에 CPU scheduler가 그 존재를 알고 있으며 kernel thread 단위로 scheduling도 가능합니다. 반면, CPU scheduler 입장에서 user thread는 존재하지 않는 것처럼 보일 것입니다. CPU는 단지 메모리 상에 올라와 있는 사용자 프로그램을 처리할 뿐이며, 이 때 이 사용자 프로그램은 “하나의 single-threaded process”으로 간주될 것입니다. (물론 이 때 CPU는 user mode겠지요.) 따라서, user thread가 multi-thread의 진정한 효과를 보기 위해선 kernel thread와의 mapping이 요구됩니다. CPU scheduler가 인식할 수 있는 kernel thread를 여러 개 생성해놓은 뒤 thread pool에 보관하면, 사용자 프로그램의 요청에 따라 user thread와 kernel thread의 mapping이 이루어집니다. (3) 쟁점은 결국, kernel thread가 kernel mode냐 하는 것 같습니다. 제가 이해한 것은, kernel mode는 CPU가 OS code를 실행할 때를 의미하고, user mode는 CPU가 user code를 실행함을 의미합니다. https://www.quora.com/Why-are-user-threads-mapped-to-kernel-threads 여기에 나온 답변이 맞는지는 모르겠지만, user thread가 kernel thread에 mapping된 후 실행될 때, 실행에 필요한 code와 data를 kernel thread에게 넘긴다고 합니다. 따라서 kernel thread에 담긴 것은 user code가 되므로 CPU는 user mode에서 동작할 것이라 생각합니다. 제가 이해한 바에 따르면, kernel thread라는 용어는 생성 주체가 kernel임을 의미할 뿐, kernel mode와는 무관하다고 생각됩니다. 또, 동작을 마친 kernel thread는 삭제되지 않고 다시 thread pool로 되돌아 갑니다. 이렇게 보면 kernel thread는 일종의 그릇 역할인 듯 합니다... (4) kernel thread와 user thread의 구분은 https://www.youtube.com/watch?v=sOt80Kw0Ols 위 영상을 참조하시면 도움이 되실 것 같습니다.