본문 바로가기

운영체제

멀티 스레드 구현: N:1, 1:1, N:M 방식의 이해

멀티스레딩은 현대 소프트웨어 개발에서 필수적인 기술로, 특히 성능 최적화와 멀티코어 프로세서의 활용을 위해 중요합니다.
 
멀티스레드를 구현하는 방식에는 여러 가지가 있으며, 각 방식은 특정 상황에서의 성능 및 효율성에 영향을 미칩니다.
 
이번 포스팅에서는 멀티스레드를 시스템에서 구현하는 세 가지 주요 방법인 N:1 매핑, 1:1 매핑, N:M 매핑에 대해 알아보겠습니다.
 
 

1. 멀티스레드 구현이란?

멀티스레드 구현이란 응용 프로그램 내에서 작성된 스레드가 운영체제에서 효율적으로 실행되도록 설정하는 방법을 의미합니다.

 

이 과정에서 사용자 레벨의 스레드와 운영체제의 커널 레벨 스레드가 어떻게 협력할지 결정하는 것이 핵심입니다.

 

스레드 라이브러리와 커널의 시스템 호출이 상호 협력하여 사용자 레벨의 스레드를 커널에서 실행되도록 매핑하는 다양한 방식이 존재합니다.

 

 

2. N:1 매핑

개념

N:1 매핑은 여러 개의 사용자 레벨 스레드(n개)가 하나의 커널 레벨 스레드(1개)로 매핑되는 방식입니다.

 

이 경우, 운영체제는 각 프로세스를 단일 스레드 프로세스로 취급하고, 프로세스당 하나의 커널 레벨 스레드(TCB)를 생성합니다.

 

이러한 구조에서 사용자 레벨 스레드는 커널 레벨 스레드에 종속되며, 사용자 공간에서 스레드 라이브러리에 의해 스케줄링됩니다.

 

 

장점

  • 단일 코어 CPU에서의 성능: 스레드의 생성, 스케줄링, 동기화 작업이 커널 공간을 거치지 않고 사용자 공간에서 처리되기 때문에, 단일 코어 환경에서 빠른 실행 속도를 자랑합니다.

 

단점

  • 멀티코어 CPU에서 비효율적: 여러 사용자 레벨 스레드가 단일 커널 레벨 스레드에 의존하므로, 멀티코어 CPU에서 병렬 처리가 불가능합니다.
  • 블로킹 문제: 하나의 사용자 레벨 스레드가 블로킹되면, 해당 프로세스의 모든 사용자 레벨 스레드가 중단되는 단점이 있습니다.

 

3. 1:1 매핑

개념

1:1 매핑은 각 사용자 레벨 스레드가 개별적으로 하나의 커널 레벨 스레드로 매핑되는 방식입니다.

 

이 방식에서는 사용자 레벨 스레드가 실행되기 위해 커널 레벨 스레드가 스케줄되어야 하며, 이는 곧 높은 병렬성과 유연성을 의미합니다.

장점

  • 높은 병렬성: 멀티코어 CPU에서 각 사용자 레벨 스레드가 개별 커널 레벨 스레드로 매핑되므로, 높은 병렬성을 제공합니다.
  • 유연한 블로킹 처리: 하나의 사용자 레벨 스레드가 블로킹되더라도, 다른 스레드는 정상적으로 실행됩니다.

 

단점

  • 커널 부담 증가: 각 사용자 레벨 스레드마다 커널 레벨 스레드가 생성되기 때문에, 스레드 수가 많아지면 커널에 큰 부담을 줄 수 있습니다.

 

4. N:M 매핑

개념

N:M매핑은 여러 개의 사용자 레벨 스레드(N개)를 여러 개의 커널 레벨 스레드(M개)에 매핑하는 방식입니다. 이 방식은 N:1 매핑과 1:1 매핑의 절충안으로, 커널의 부담을 줄이면서도 적절한 병렬성을 유지할 수 있습니다.

 

 

장점

  • 커널 부담 감소: 1:1 매핑에 비해 커널 레벨 스레드의 수가 적어, 커널의 부담이 상대적으로 줄어듭니다.
  • 병렬성 유지: 다수의 커널 레벨 스레드를 사용하므로, 병렬성이 어느 정도 보장됩니다.

 

단점

  • 구현 복잡성: 이 방식은 구현이 복잡하며, 이로 인해 현대 운영체제에서는 거의 사용되지 않는 추세입니다.

 

5. 프로세스와 스레드의 관계

프로세스는 운영체제가 응용 프로그램을 적재하는 단위이며, 스레드는 그 응용 프로그램을 실행하는 단위입니다.

 

여러 스레드는 동일한 프로세스 내에서 자원을 공유하고, 이 과정에서 각 스레드는 PCB(Process Control Block)TCB(Thread Control Block)에 저장된 정보를 기반으로 실행됩니다.

  • 프로세스 공유 공간: 프로세스 내의 모든 스레드는 메모리와 같은 자원을 공유합니다.
  • 스레드 스위칭 속도: 동일한 프로세스 내에서의 스레드 간 전환은 다른 프로세스 간 전환보다 속도가 빠릅니다.

 

6. 멀티스레딩의 장점

멀티스레딩을 활용하여 응용 프로그램을 작성하면 다음과 같은 장점을 얻을 수 있습니다.

  • 높은 성능: 멀티코어 CPU에서 병렬 실행을 통해 성능이 크게 향상됩니다.
  • 우수한 사용자 응답성: 하나의 스레드가 블로킹되더라도, 다른 스레드가 사용자 인터페이스를 계속 제공할 수 있습니다.
  • 서버 프로그램의 효율성: 웹 서버, 파일 서버 등에서 다수의 사용자를 동시에 처리할 수 있습니다.
  • 응용 프로그램 구조의 단순화: 작업 단위로 응용 프로그램을 나누고, 각 작업을 개별 스레드로 실행할 수 있어 구조가 단순해집니다.
  • 확장성 및 통신 효율성: 새로운 기능을 추가하기 쉽고, 스레드 간 통신도 효율적으로 처리됩니다.

 

7. 멀티스레딩의 문제점

물론 멀티스레딩이 항상 완벽한 것은 아닙니다. 몇 가지 문제점도 존재합니다.

  • Fork() 호출 시 문제: 여러 스레드 중 하나가 fork()를 호출하면, 새로 생성된 프로세스는 fork()를 호출한 스레드로만 구성되는 문제가 발생할 수 있습니다.
  • Exec() 호출 시 문제: exec() 호출 시 프로세스 전체가 새로운 프로그램으로 대체되어, 기존 스레드들이 모두 사라집니다.
  • 스레드 동기화 문제: 여러 스레드가 공유 데이터를 동시에 접근하면 데이터 훼손이 발생할 수 있으며, 이를 해결하기 위해 동기화 기법이 필요합니다.

 

결론

멀티스레드를 구현하는 방식은 응용 프로그램의 요구 사항과 시스템 환경에 따라 달라질 수 있습니다.

각 매핑 방식은 특정 상황에서 장단점이 존재하므로, 이를 이해하고 적절히 선택하는 것이 중요합니다.

고성능 애플리케이션을 위해서는 멀티스레딩의 장점과 문제점을 모두 고려하여 최적의 구현 방식을 찾아야 합니다.