Post

운영체제(5) - thread

multithread programming

multithread programming을 이해하기에 앞서, thread의 종류부터 알아보겠습니다. thread는 크게 User Threads와 Kernel Threads로 나뉩니다.

User Thread and Kernel Thread

커널 스레드란 커널(운영체제)이 관리하는 스레드입니다. 유저 스레드는 커널의 개입 없이 high level language(HLL)에서 구현되어 있는 thread library를 사용해서 커널 스레드를 유사하게 흉내낸 스레드입니다. 뭔가 커널 스레드는 국가에서 발행하는 자격증이고, 유저 스레드는 민간 자격증 느낌으로 보시면 될 듯 합니다.

User Thread

커널의 개입이 없이 사용자 영역 라이브러리를 활용하는 방식이라고 했습니다. 이는 스레드 스케줄링 및 동기화를 할 때, 커널의 개입이 없이, 미리 구현해둔 라이브러리 레벨에서 처리하는 방식입니다. 이는 커널을 호출하지 않고, 프로세스 내부에서 context-switching이 진행되기에, 오버헤드가 적습니다. 하지만 현재 실행하는 프로세스가 interrupt 등으로, block 될 시에는 프로세스 내부 모든 스레드가 멈춥니다. 왜냐하면 프로세스가 전체적으로 멈추기 때문입니다. 프로세스 내부 코드가 커널이 지원하는 커널 스레드를 흉내내고 있다고 보시면 됩니다. 따라서 이를 가상 스레드(virtual thread)라고 부르기도 합니다.

Kernel Thread

커널이 관리하는 스레드입니다. 하나의 프로세스는 적어도 하나의 커널 스레드를 갖습니다. 커널 스레드가 프로세스를 실행하기 때문입니다. 이는 커널이 관리하기에 커널에 종속적이지만, 커널의 영향 아래에 있기에 안정적입니다. 이러한 커널 스레드는 os scheduler의 최소 단위입니다.

커널 스레드가 여러 user thread를 담당할 수 있습니다.

아래는 하나의 프로세스가 하나의 커널 스레드로 구현되어 있고, 내부에서 열심히 유저 스레드가 context-switching 하는 상황입니다. 이는 멀티코어 상황에서, 시스템은 유저 스레드를 인식하지 못하고 커널 스레드 하나로 인식하기에, 병렬적으로 작업을 진행하지 못합니다. 만약 커널 스레드가 block되면, 프로세스는 작업을 하지 않습니다.

image

아래는 하나의 커널 스레드가, 하나의 유저 스레드를 담당하는 상황입니다. 유저 스레드가 커널 스레드와 똑같다고 보면 되는데, 이는 하나의 스레드가 block되어도, 나머지는 잘 동작합니다.

image

아래는, 많은 커널 스레드가 많은 유저 스레드를 담당하는 상황입니다. 위 두 개의 모델을 합쳐놨지만, 구현이 어렵다는 단점이 있습니다.

image

요약하자면, 유저 스레드는 가상 스레드라고 생각하시면 편해보입니다. 또한 위 세 가지 모델들을 적절히 잘 섞어서 구현한다면 좋은 성능을 낼 수 있습니다.

마무리하며

스레드에 대해 알아보았습니다. 다음 시간엔 pthread를 뜯어보는 시간을 갖도록 하겠습니다!

This post is licensed under CC BY 4.0 by the author.