[운영체제] 4. 스레드
이번에는 스레드(Thread)에 대해서 알아볼것이다.
Thread를 직역하면 '실'이다. 우리는 저번 Post에서 프로세스에 대해서 배웠다. 스레드는 프로세스에서 뻗어나온 실가닥 같은 느낌이다.
하나의 프로세스 내에서 프로세스에게 할당받은 자원은 공유하며, 제어는 따로 받는 가벼운 프로세스(?) 같은 느낌이다. 스레드는 프로세서 활용의 기본 단위이다.
스레드의 구성요소로는 크게 3가지가 있다.
- Thread ID
- Register Set
- Stack (Local Data)
프로세스는 기본적으로 싱글스레드이다. 하나의 흐름만 가지고 실행이 된다. 스레드를 잘 활용한다면 다음과 같은 장점이 있다.
스레드의 장점
- 사용자 응답성 : 일부 스레드의 처리가 지연되더라도, 다른 스레드는 작업을 계속 수행할 수 있다.
- 자원 공유 : 자원을 공유하여 효율성이 증가한다. 스레드는 프로세스의 자원을 공유하기 때문에 스레드 사이에서는 Context Switching이 일어나지 않는다. 물론 스레드 제어를 위한 Switching은 일어나지만 자원 전체를 Switching하는 비용보다 훨씬 저렴하다...
- 경제성 : 프로세스의 생성이나 Context Switching이 발생하지 않는다.
- 멀티프로세서 활용: 여러개의 프로세서를 활용한 병렬처리를 통해 성능이 향상된다.
스레드를 잘 사용한다면 충분히 좋아보인다. 스레드는 구현방식에 따라서 분류가 된다.
사용자 수준의 스레드 (User Thread)
-
스레드를 생성하고 관리(스케쥴링)하는 것을사용자가 할 수 있게 라이브러리 형식으로 제공하는 스레드이다. (ex. 자바스레드, ...)
-
사용자가 프로세서 내부에서 스레드를 생성하고 관리하기 때문에 커널은 스레드가 있는 것을 알지 못한다. 그렇기 때문에 커널의 개입을 받지 않는 스레드이다.
-
커널이 스레드를 알지 못하기 때문에 시스템 입장에서 생성 및 관리의 부담이 적어 유연한 관리가 가능하다.
-
또한 커널이 모르기 때문에 프로세스를 단일 스레드라고 생각하여, 하나의 스레드가 Block된다면 모든 스레드가 중지된다.
-
프로세스와 독립적이기 때문에 라이브러리만 있다면 어느 프로세스에서도 사용 할 수 있다. (이식성이 좋다)
-
하나의 커널에 여러개의 스레드가 붙기 때문에 n:1, 다대일 스레드라고도 한다.
커널 수준의 스레드 (Kernel Thread)
-
위의 사용자 수준의 스레드와는 달리, 커널이 직접 생성하고 관리하는 스레드이다. 그렇기 때문에 Context Switching 비용이 생긴다.
-
프로세스 내 스레드들의 병렬 수행이 가능해진다.
-
하나의 커널에 하나의 스레드가 붙기 때문에 1:1, 일대일 스레드라고도 한다.
혼합형 스레드
- 위의 두가지 스레드를 합친 방식이다.
- n개의 사용자 스레드와 m개의 커널 스레드를 사용한다. (n>m)
- 사용자가 원하는 만큼의 스레드를 생성한다.
- 커널은 자신에게 할당된 스레드가 Block 상태에 빠지더라도 유연하게 다른 스레드를 수행하게 한다.
- 대부분의 OS가 이 모델의 스레드를 사용하며 n:m, 다대다 스레드라고도 한다.