[OS] 5. 쓰레드 (Thread)
쓰레드 (Thread) : 프로세스 내부의 흐름
쓰레드는 CPU를 구성하는 기본 단위로, 프로세스 내부의 흐름을 가리킨다. 일반적으로 하나의 프로세스에는 하나의 쓰레드가 존재한다. 하나의 쓰레드는 고유한 Thread ID, Program Counter, Register Set 및 Stack을 가진다.
다중 쓰레드 (Multi-Threads)
다중 쓰레드는 하나의 프로세스에 쓰레드가 2개 이상 존재하는 상태를 말한다. Concurrent 방식은 한 프로세스에서 여러 쓰레드가 빠른 시간 간격으로 스위칭되어 동시에 실행되는 것처럼 보인다. 여러 쓰레드들은 하나의 프로세스 안에 속하면서 code, data 메모리 공간과 프로세스 자원인 file과 I/O를 공유한다. 메시지 패싱을 사용할 필요가 없고, 공유 메모리를 만들지 않아도 되기 때문에 운영 체제를 거치지 않고도 통신이 가능하다. 멀티 프로세스에 비해 문맥 전환 시간이 짧고, 메모리와 자원의 할당이 더 효율적이다.
운영체제가 다중 쓰레드를 지원하는 경우, 현대 운영체제에서의 문맥 전환은 프로세스가 아닌 쓰레드 단위로 이루어진다. 하나의 프로세스 안에서 여러 쓰레드가 수행되다가 다른 프로세스로 넘어가 그 프로세스의 쓰레드를 수행하는 방식이다. 예를 들어, 웹 브라우저는 화면을 출력하는 쓰레드와 데이터를 읽어오는 쓰레드가 따로 수행된다.
프로세스와 쓰레드의 비교 : 다중 프로세스와 다중 쓰레드는 둘다 여러 흐름이 동시에 진행된다는 공통점을 가지나,
- 다중 프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지한다.
- 다중 쓰레드는 프로세스 내 메모리를 공유해 사용할 수 있다. 고로, 프로세스보다 스레드 간의 전환 속도가 빠르다.
- 다중 쓰레드는
CPU가 여러 개일 경우에 각CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다.- 다중 쓰레드는 각각의 쓰레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없어 ‘경쟁 조건’의 문제가 발생한다.
다중 쓰레드 모델 (Multi-Threads Models)
다중 쓰레드 모델은 2개 이상의 쓰레드로 구성된 모델이다. 유저 쓰레드(User Thread)는 유저 레벨의 쓰레드 라이브러리를 통해 관리되는 쓰레드이며, 커널 쓰레드(Kernel Thread)는 운영체제가 제공하고 직접 관리하는 쓰레드이다.
Many-to-One 모델
Many-to-One 모델에서는 한 커널 쓰레드가 여러 유저 쓰레드를 처리한다. 이 모델은 유저 레벨에서 쓰레드를 관리하며, 커널은 단 하나의 쓰레드만을 인식한다. 따라서 여러 유저 쓰레드가 하나의 커널 쓰레드를 공유하게 된다. 이러한 구조로 인해 시스템 호출이 발생하면 해당 커널 쓰레드를 사용하는 모든 유저 쓰레드가 대기 상태에 놓이게 되어 병목 현상이 발생할 수 있다. Many-to-One 모델은 구현이 간단하고, 유저 레벨에서 빠른 쓰레드 관리가 가능하지만, 멀티프로세서 시스템에서는 병목 현상으로 인해 성능이 저하될 수 있다.
One-to-One 모델
One-to-One 모델에서는 유저 쓰레드 한 개당 커널 쓰레드를 대응시켜 처리한다. 즉, 각 유저 쓰레드는 별도의 커널 쓰레드를 가지며, 이로 인해 각 쓰레드는 독립적으로 커널 레벨에서 관리된다. One-to-One 모델은 멀티프로세서 시스템에서 높은 성능을 발휘할 수 있으며, 병목 현상을 줄일 수 있다. 그러나 커널 쓰레드가 과도하게 생성될 경우 시스템 자원이 부족해질 수 있고, 쓰레드 생성 및 관리 오버헤드가 증가할 수 있다.
Many-to-Many 모델
Many-to-Many 모델에서는 여러 유저 쓰레드가 여러 커널 쓰레드를 처리한다. 유저 쓰레드와 커널 쓰레드의 수는 독립적으로 조절될 수 있으며, 커널 쓰레드의 수는 유저 쓰레드의 수보다 작거나 같아야 한다. 이 모델은 유연한 쓰레드 관리를 가능하게 하며, 병목 현상을 줄일 수 있다. 또한, 유저 레벨에서 쓰레드를 관리하면서도 커널 레벨에서 병목 현상을 방지할 수 있어 멀티프로세서 시스템에서 높은 성능을 발휘할 수 있다.
Two-Level 모델
Two-Level 모델에서는 중요한 작업은 One-to-One 방식으로 처리하고, 나머지는 Many-to-One 방식으로 처리한다. 이를 통해 중요한 작업의 우선 처리를 보장하면서도, 전체적인 자원 효율성을 확보할 수 있다. Two-Level 모델은 Many-to-Many 모델의 유연성과 One-to-One 모델의 성능을 결합하여, 다양한 작업 환경에서 최적의 성능을 제공한다. 중요한 작업은 독립적인 커널 쓰레드를 통해 빠르게 처리되며, 덜 중요한 작업은 공유된 커널 쓰레드를 통해 효율적으로 관리된다.