Thread
Thread
스레드(Thread)는 프로세스 내에서 프로그램 명령을 실행하는 CPU 활용의 기본 단위이다. 스레드는 스레드ID, 프로그램 카운터, 레지스터 집합, 스택 등으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드 영역, 데이터 영역 등의 운영체제 자원을 공유한다. 스레드에는 단일 스레드와 멀티 스레드가 있다.
단일 스레드(Single Thread)
단일 스레드(Single Thread)는 프로세스 간 제어 스레드가 1개인 스레드이다. 단일 스레드의 장점은 자원을 공용화하지 않으므로 공용 자원 접근을 통제할 필요가 없다는 점이다. 하지만 스레드가 1개이기 때문에 다수의 CPU를 동시에 활용할 수 없다.
멀티 스레드(Multi Thread)
멀티 스레드(Multi Thread)는 프로세스 간 제어 스레드가 다수인 스레드이다. 멀티 스레드는 프로그램을 다수의 실행 단위로 나누어 실행한다. 또한, 각각의 스레드가 고유의 레지스터와 스택으로 표현된다.
멀티 스레드의 장점은 다음과 같다.
- 대응적 측면: 일부가 차단되거나 장시간 수행시에도 계속해서 실행 가능
- 자원 공유성: 프로세스의 자원과 상태를 공유하여 효율적으로 운영
- 경제성: 자신이 속한 프로세스의 자원을 공유하기 때문에 새 프로세스를 생성하는 것보다 새로운 스레드를 생성하는 것이 경제적이다.
- 확장성: 다수의 코어에서 병렬로 프로세스 실행
유저 스레드(User Thread)와 커널 스레드(Kernel Thread)
멀티 스레드 시스템에서는 스레드를 관리하는 방식에 따라 유저 스레드와 커널 스레드로 나눌 수 있다.
유저 스레드(User Thread)
유저 스레드(User Thread)는 커널의 별도 지원 없이 커널 위에서 동작한다. 유저 스레드의 장점은 다음과 같다.
- 스레드 스위칭에서 커널모드의 권한이 필요하지 않음
- 어느 운영체제에서나 사용 가능
- 빠른 생성 및 전환
유저 스레드의 단점은 다음과 같다.
- 커널은 유저 스레드를 인식하지 못하므로, 하나의 유저 스레드가 차단되면 전체 프로세스가 차단됨
- 병렬 처리 제한 - 여러 유저 스레드가 있는 경우에도, 커널은 이를 단일 스레드로 인식하여 멀티프로세싱의 이점을 가질 수 없다.
커널 스레드(Kernel Thread)
커널 스레드(kernel Thread)는 운영체제 커널에 의해 관리되는 스레드이다. 커널스레드의 장점은 다음과 같다.
- 병렬 처리 가능 - 커널은 각 스레드를 개별적으로 관리하고 스케줄링할 수 있어, 멀티코어 시스템에서 진정한 병렬 처리가 가능
- 하나의 스레드가 차단되더라도, 커널은 다른 스레드를 스케줄링할 수 있어 프로세스 전체가 차단되지 않음
커널 스레드의 단점은 다음과 같다.
- 높은 오버헤드 - 스레드 생성과 전환 시 커널 모드로의 전환이 필요하므로, 유저 스레드보다 오버헤드가 높다.
- 복잡성 - 커널 레벨에서의 스레드 관리는 더 복잡하며, 더 많은 시스템 자원을 필요로 한다.
멀티 스레딩 모델
멀티스레딩 모델은 멀티 스레드를 어떻게 운영 체제에서 처리할지를 결정하는 방식이다. 대표적인 모델로는 다대일 모델, 일대일 모델, 다대다 모델이 있다.
다대일 모델(Many-to-One Model)
다대일 모델(Many-to-One Model)은 여러 유저 스레드가 하나의 커널 스레드에 매핑된다. 한 번에 하나의 스레드만 커널에 접근할 수 있으므로, 멀티 스레드는 멀티 코어 시스템에서 병렬로 실행할 수 없다.
일대일 모델(One-to-One Model)
일대일 모델(One-to-One Model)은 각 유저 스레드가 하나의 커널 스레드를 매핑된다. 다수의 CPU 코어를 활용할 수 있어 진정한 병렬처리가 가능하다. 하지만, 유저 스레드 생성시에도 커널 스레드 생성이 필요해서 오버헤드가 발생할 수 있다.
다대다 모델(Many-to-Many Model)
다대다 모델(Many-to-Many Model)은 여러 유저 스레드가 여러 커널 스레드에 동적으로 매핑된다. 유저 스레드와 커널 스레드의 수는 독립적으로 조정될 수 있다. 개발자는 필요한 만큼 많은 유저 스레드를 생성할 수 있고, 다수의 CPU 코어를 효율적으로 활용할 수 있다. 하지만, 구현이 복잡하며, 스레드 관리가 복잡할 수 있는 단점이 있다.
스레드 풀(Thread Pool)
스레드 풀(Thread Pool)은 지정된 개수의 스레드를 미리 생성하고, 필요시 꺼내어 쓰는 방식이다. 다음과 같은 이점이 있기 때문에 스레드 풀은 대량 작업 처리에 반드시 고려가 필요하다.
- 급격한 성능 저하 방지 - 새로운 작업이 들어올 때마다 새로운 스레드를 생성하는 방식은 많은 오버헤드를 수반하기 때문에, 스레드 풀을 미리 만들어 놓으면 급격한 성능 저하를 방지할 수 있음
- 동시 사용자수 증가시에도 대응 가능 - 대기 중인 스레드를 즉시 할당하여 사용자 요청을 처리할 수 있음
- 이전 생성 스레드 재사용 가능 - 매번 작업을 처리할 때마다 스레드를 새로 생성하는 대신, 기존에 생성된 스레드를 재사용하면 자원을 절약할 수 있음
하지만 스레드를 과다하게 생성시 메모리 측면에서 낭비가 발생한다는 단점이 있다.
Ref
[1] Operating System Concepts(Silberschatz, Galvin and Gagne)