💡 Intro

  • 효율적인 프로그래밍을 위해 멀티 스레드 환경에서 구동을 할 때가 많다.
  • 멀티 스레드의 간단한 장점과 항상 헷갈렸던 사용자 레벨 스레드 vs. 커널 레벨 스레드에 대해서 알아보자.

🌩 Multi-thread 장점

1. 응답성

  • 어플리케이션의 일부분이 봉쇄되거나 긴 작업을 실행하더라도 다른 부분의 프로그램이 계속 실행되는 것을 허용하기 때문에 사용자의 입장에서 응답성이 증가한다.
  • 예를 들어 다운로드가 오래 걸리는 파일을 다운로드 하면서 사용자와의 상호작용이 가능하다.

2. 자원 공유 resource sharing

  • 프로세스는 완전히 별도의 메모리 공간을 할당받기 때문에 (code, data, heap) 서로 통신하기 위해서는 공유 메모리를 사용하거나 메세지 전달 기법 (IPC)를 사용해야한다.
  • 스레드는 속한 프로세스의 자원을 공유하기 때문에 한 프로그램이 같은 주소 내에서 여러개의 다른 작업을 하는 단위로 나뉘어질 수 있다는 이점이 있다.

3. 경제성 economy

  • 프로세스의 자원을 공유하므로 메모리 측면과 문맥교환 오버헤드 측면에서 경제적이다.

4. 규모 가변성 scalability

  • 멀티코어 환경에서 각각의 스레드가 다른 코어에서 병렬로 실행될 수 있기 때문에 이점이 증가한다.
  • 단일 스레드라면 코어의 개수와 상관없이 한번에 한 개의 처리기에서만 실행되지만 멀티코어에 멀티스레드라면 병렬성을 증가시킨다.

🌩 Multi-thread 모델

  • 스레드는 사용자 스레드와 커널 스레드로 나뉜다.
    • 사용자 스레드는 사용자 수준에서 관리되며 os가 관여하지 않는다.
    • 사용자 수준의 라이브러리를 사용하여 생성되고 커널의 개입을 받지 않는다.
    • 커널 스레드는 os에 의해 직접 지원되고 관리된다.
  • 다양한 Mutli-thread 모델이 있는 이유는 스레드가 작업을 처리하기 위해서는 CPU를 점유해야하기 때문에 궁극적으로는 사용자 스레드와 커널 스레드간의 어떠한 연관관계가 존재해야 하기 때문이다.

모델 3가지

  • 다대일 모델
    • 여러 사용자 스레드를 하나의 커널 스레드에 사상하며 스레드 관리는 사용자 레벨의 스레드 라이브러리가 수행한다.
    • 한 스레드가 봉쇄 상태에 들어가면 커널 스레드가 함께 봉쇄 상태에 들어가게 되므로 모두 봉쇄된다.
    • 한번에 하나의 스레드만 커널에 접근이 가능하기 때문에 멀티코어 환경에서 병렬로 실행될 수 없다.
  • 일대일 모델
    • 하나의 사용자 스레드를 각각 하나의 커널 스레드로 사상한다.
    • 하나의 스레드가 봉쇄상태에 들어가더라도 다른 스레드가 커널 스레드와 매핑되어 작업을 처리할 수 있으므로 멀티코어 환경에서 더 병렬성을 제공한다.
    • 사용자 레벨에서 스레드를 하나 생성할 때 커널의 스레도 생성해야 하기 대문에 오버헤드가 발생한다. 따라서 이 모델을 사용할 경우 대부분 시스템에 의해 지원되는 스레드 개수를 제한한다.
    • Linux가 대표적인 일대일 모델을 사용하는 os이다.
  • 다대다 모델
    • 여러 사용자 스레드를 여러 커널 스레드에 사상한다. (사용자 스레드 ≤ 커널 스레드 숫자로 사상한다)
    • 다대일 모델과 일대일 모델의 단점을 극복한다.
      • 진정한 동시성을 지원하지 못하는 단점과, 스레드 개수에 제한이 있는 단점을 커버한다.
    • 개발자는 원하는 만큼 스레드를 생성하고 여러개의 커널 스레드에 의해 병렬성을 보장한다. 따라서 하나의 스레드가 봉쇄상태에 들어가더라도 다른 커널 스레드에 의해 실행을 스케줄 할 수 있다.

🌩 Thread 스케줄링

  • 사용자 스레드와 커널 스레드가 나뉘지만 os에서 스캐줄링 되는 대상은 커널 스레드이다.
  • 사용자 스레드는 스레드 라이브러리에 의해서 관리되고 커널은 사용자 스레드의 존재에 대해서 알지 못하기 때문에 궁극적으로 사용자 스레드는 커널 스레드에 사상되어야 한다.
  • 따라서 사용자 수준과 커널 수준의 스레드 스케줄링에 대해서 간략히 다루어보자.

경쟁 범위 Contention scope

  • Process-Contention scope(PCS)
    • 다대일, 다대다 모델에서는 스레드 라이브러리가 사용자 스레드를 가용한 커널 스레드에 스케줄링한다.
    • 동일한 프로세스의 스레드들끼리 CPU를 경쟁하는 형태
    • 스레드 라이브러리가사용자 스레드를 ‘가용한 LWP(Light Weight Process) 상에서 스케줄한다’ 라고 하더라도 그것이 CPU 점유를 의미하지 않는다. CPU 점유는 커널 스레드의 스캐줄링이 필요하다.
    • 주로 우선순위에 따라서 행해지며 가장 높은 우선순위를 선점하여 스캐줄링한다.
  • System-Contention scope(SCS)
    • 실제 CPU에서 실행되기 위해서 os가 커널 스레드를 물리적 CPU로 스캐줄링 해야한다.
    • 어느 커널 스레드가 CPU를 점유할 것인지 결정하는 형태
    • SCS 스캐줄링은 시스템 상의 모든 스레드 사이에서 일어난다.
    • 일대일 모델 같은 경우 오직 SCS만 사용한다.

🛋 느낀 점

  • 한번도 제대로 이해하지 못했는데 os를 처음부터 차근차근 공부하며 ‘커널’에 대한 이해도를 쌓은 후 공부하니 조금 더 감이 잡히는 듯 하다.
  • 사용자 스레드의 이점이 아직 그렇게 잘 와닿지 않는다. 우선 하나의 프로세스 내에서 여러 작업 단위를 나눈다는 점만 이해하고 넘어가야겠다.
  • 자바의 Thread와 스레드 라이브러리에 대해서 더 깊이 공부해 봐야겠다 🙌

[참고자료]

  • Operating System 공룡책