@ 지금부터는 MultiThread 구현을 배워보도록 하겠습니다.
@ 크게 세가지 방식으로 구현할 수 있습니다.
// 커널이 전혀 모르게
// 커널이 완변하게 지원하도록
// Mixture
@ User-Level Thread
// Thread Stack
// Thread Control Block (in User mode)
// User level에 Scheduler가 있어야 합니다.
> 구현은 커널과 비슷합니다.
.. User Level의 함수로 구현하고
.. 이를 묶어 Library를 만듭니다.
.. Thread를 생성하고 삭제하는 코드
@ User-Level Thread를 구현할 때, key가 되는 동작은 무엇일까요?
// 한 Thread에서 다른 Thread로 넘어가는 스케쥴링이 문제입니다.
> 특히 Pre-emptive scheduling에서 interrupt가 필요합니다
.. 근데 이 때에는 interrupt가 내부 Thread까지 들어가야 하는 상황이 필요하게 됩니다.
.. 그런데 Thread가 Interrupt를 알아듣는 것이 가능하기 힘듭니다.
// Read System 문제입니다.
> Read System Call이 발생하면
.. Proccess를 Blocking 시키게 되는데
.. 수행할 수 있는 Thread들도 수행을 멈추게 되는 문제가 발생할 수 있게 됩니다.
@ User-Level Thread의 장점도 존재합니다.
// OS를 고치지 않고도 사용할 수 있게 됩니다.
// Reactive system(중간에 입력을 받는 시스템)이 아닌 곳에서는 유용합니다.
> 과학 연산 시스템 등
@ Kernel-Level Thread
// Task가 생성되고 소멸하는 것을 직접하며
> 그 후 모든 매니징을 직접하는 것입니다.
.. 이렇게 되면 Interrupt문제 및 Blocking 문제들도 모두 해결됩니다.
// Linux 등 많은 OS가 이 방법을 차용하고 있습니다.
@ Kernel-Level Thread의 장점은
// User-Level의 단점들은 모두 해결되지만
// 추가적인 Overhead가 많이 발생합니다.
> 과학 연산 시스템 등에서는 그런 문제들이 발생합니다.
@ 그렇게 Combined User-level Kernel-Level MultiThread 시스템이 발생합니다.
// 상당히 많은 부분을 User-Level에서 처리하고
> Interrupt가 오면 User-Level Scheduler에서 어떤 Process가 수행되어야 할 지 알려줍니다.
// Pre-emptive가 가능하도록 만든 것이 Combined System이라고 생각하시면 됩니다.