-
[2020.09.16] (운영체제) 사용자 수준 스레드와 커널 수준 스레드의 차이개발 블로깅/기타 개념 2020. 9. 16. 17:04
운영체제 공부 중에 사용자 수준 스레드와 커널 수준의 스레드에 대해 개념이 이해가 되지 않았다.
다른 블로그 글을 찾아봐도 뭔가 애매모호하게 설명하고 말아 버린 느낌으로 받아들여져서 이해하는데 시간이 꽤 걸렸다.혹시나 나 같은 사람이 있을까봐 직접 최대한 쉽게 정리를 해보려고 한다.
스레드
우선 스레드부터 정리해 보자면, 운영체제 공부를 했으면 다들 알 듯이 '프로세스 내 작업 단위'이다.
이것은 하나가 될 수도 있고 여러 개가 될 수 도 있다. 여러 개의 스레드가 동작하면 '멀티 스레드' 방식으로 동작하게 되는 것이다.
(더 자세한 설명은 이번 글과 맥락이 맞지 않으니 생략...)그런데 스레드 중에 커널 수준 스레드와 사용자 수준의 스레드로 종류가 나뉜다...
우선 이 두가지가 각자 무엇인지 알아보자.
커널 수준 스레드
커널 수준 스레드는 커널 레벨에서 생성되는 스레드이다.
운영체제 시스템 내에서 생성되어 동작하는 스레드로, 커널이 직접 관리한다.그런데 커널 수준에서는 프로세스가 주기억 장치에 여러 개가 적재되어 CPU 할당을 기다리며 동작한다.
CPU에서 인터럽트 발생으로 현재 작업 중인 프로세스가 Block 되고 다른 프로세스로 변경할 때, CPU 내 재배치 레지스터에 다음에 실행할 프로세스 정보들로 교체를 하고 캐시를 비운다. 이 것을 컨텍스트 스위칭이라고 한다.
이 컨텍스트 스위칭이 일어날 때는 CPU가 일을 못한다. 그래서 이게 자주 일어나면 성능에 영향이 발생하게 되는 단점이 있다.
하지만 커널이 직접 관리하므로 특정 스레드가 Block이 되어도 다른 스레드들은 독립적으로 일을 할 수 있다.사용자 수준 스레드
이 스레드는 스레드를 관리하는 라이브러리로 인해 사용자 단에서 생성 및 관리되는 스레드이다.
그래서 커널이 따로 관리하지 않고, 커널이 이 스레드에 대해서 알지도 못한다.한 마디로 커널 레벨 밖에 있는 스레드.
자, 이제 여기서 의아한 점들이 몇 개 생길 것이다.
(내가 그러했기 때문에...)스레드는 프로세스 단위라면서 어떻게 운영체제 레벨인 커널 안이 아니라 커널 밖에서 생성하여 이용할 수 있는가?
스레드가 커널 밖에 있다?이것은 실제 물리적으로 정말 커널 밖에 있고 그런 것이 아니라, 전부 커널 내부에 있지만 커널의 통제권 안에 있는지 차이인 것이다.
커널에는 '커널 모드'와 '사용자 모드' 두 가지가 있고, 여기서 '사용자 모드'에서 동작하는 스레드가 사용자 수준 스레드인 것이다.입출력 인터럽트가 발생하면 커널은 '사용자 모드'가 되어서 사용자 수준 스레드의 응답을 기다린다. 사용자 수준 스레드의 응답이 오면 다시 '커널 모드'로 변환되어 이어서 커널 스레드가 일 처리를 하게 되는 것이다.
위 사진을 다시 한번 봐보자.
위 사진은 사용자 수준 스레드와 커널 수준 스레드가 1:1로 매핑 되어 있고, 이를 커널 수준 스레드 모델이라고 부르는데, 여기서 또 한 가지 의문점이 있다.
사용자 수준 스레드도 있는데 왜 이 형태가 커널 수준 스레드 모델인 것인가?
위 방식이 기본적으로 프로세스가 생성되면 나타나는 형태이기 때문이다.
하나의 프로세스는 기본적으로 하나 이상의 스레드를 가진다. 그리고 사용자 레벨 부분과 동기화를 할 수 있도록 사용자 레벨 쪽에도 작은 스레드가 생성되는 것!하지만 오해하지 말아야 하는게, 저 사용자 레벨의 스레드는 커널이 관리하는 스레드가 아니다! 해당 프로세스에 대한 사용자의 입,출력을 받을 수 있도록 하는 작은 커널 통제권 밖의 작은 스레드일 뿐이다.
그러니 사용자 입출력이 필요로 한 프로세스는 실제로는 두개 이상인 스레드를 가지게 되는 것이다.
(입출력이 필요없는 스레드는 하나 이상 스레드를 가지게 되는 것)결론은, 커널 스레드에 사용자 수준 스레드가 각 하나씩 붙어서 일 처리를 하는 저 형태가 커널 수준의 스레드 모델인 것이다.
그러면 이제 사용자 수준 스레드에 대해 다시 알아보자.
위 사진처럼, 사용자 수준 스레드는 하나의 커널에 여러 스레드가 붙는다.
이것은, 사용자 레벨에서 스레드 전용 라이브러리를 이용해서 여러 스레드를 생성한 것이다. 개발자가 자바에서 스레드 함수를 이용하면 이와 같이 되는 것.
여기의 스레드는 운영체제 단의 기능을 하는 것이 아니라, 개발자가 기능 구현할 때 현재 기능 내에서 일 처리를 하는 스레드를 만들 듯이, 프로세스 내 커널과 관련 없는 기능들만 수행하는 스레드이다. 그래서 커널이랑 관련도 없고 커널은 이런 스레드들이 있는지도 모른다.그렇기에 사용자 수준 스레드는 컨텍스트 스위칭이 없는 것이고, 스레드 교체 등으로 인한 오버헤드 발생이 없는 것이다.
대신 인터럽트를 당하면, 커널 수준 스레드와는 다르게 사용자 수준의 스레드들은 모두 함께 Block이 된다.
그 이유는, 아마도..아래와 같지 않을까 한다.. (정확히 알 수 있는 글이 없다 ㅜㅜ..)프로세스 내에서 스레드들끼리는 자원을 공유하여 일 처리를 하기 때문에(스레드 통신 기법), 커널이 관리하는 스레드는 스레드 동기화 기법으로 자원 관리를 할 수 있으므로, 하나의 스레드가 Block이 되어도 다른 스레드들은 커널 관리로 인해 계속해서 동기화가 되어 일 처리가 가능하다.
하지만 사용자 수준 스레드는 커널의 관리를 받지 않음으로, Block으로 인해 공유 자원의 무결성에 대한 문제가 발생할 수 있으므로 하나의 스레드가 인터럽트 당하면 모든 스레드가 멈추도록 하는 것 아닐까 추측한다.
이 부분은 향후 제대로 알게 되면 다시 정리해 봐야겠다.
+추가
마지막으로 의아했던 부분 하나 더 정리하려고 한다.
스레드는 프로세스 내 작업 단위인데, 사용자 수준의 스레드는 어떻게 프로세스 없이 스레드만 생성할 수 있는가?
사용자 수준의 스레드는 생성할 때마다 프로세스 단위로 생성을 하기 때문에, 프로세스 겸 스레드라고 볼 수 있다.
이러한 특징 때문에 사용자 수준의 스레드는 커널 스레드와 다르게 멀티 스레드 방식으로 동작하기가 어렵다.반응형'개발 블로깅 > 기타 개념' 카테고리의 다른 글
[2020.12.28] React 내 Render Stream 처리 기법(with kefir.js) (0) 2020.12.28 [2020.10.16] Google Chrome V8 엔진을 파헤쳐보자 (2) 2020.10.17 [2020.08.04] 브라우저 동작원리 (1) 2020.08.04 input type="file" 커스터마이징 하는 방법 (0) 2020.06.11 [2020.05.13] AWS Online Summit 참여한 내용 간략 정리. (0) 2020.05.14