[운영체제] 유저-쓰레드, 커널- 쓰레드

Seokjun Moon·2023년 4월 9일
0

운영체제

목록 보기
13/23
post-custom-banner

User-Thread & Kernel-Thread

쓰레드에는 2가지가 있습니다. 유저 쓰레드와 커널 쓰레드.

User-Thread

커널의 개입 없이 사용자 영역의 쓰레드 라이브러리를 활용하는 방식입니다. 일종의 가상 쓰레드를 생성하여 실행 흐름만 사용하는 방식입니다.

  • 스케쥴링 결정이나 동기화를 위해 커널을 호출하지 않으므로 오버헤드가 적습니다.
  • context-switching 이 존재합니다. (내부적으로 진행)
  • 스케쥴링 우선순위가 지원되지 않습니다.
  • 시스템 콜 호출 시 프로세스 내 모든 쓰레드가 Block 됩니다. (시스템 콜을 호출하면 프로세스 실행을 중단하고 커널을 실행하기 때문에 모든 쓰레드가 정지됩니다.)

Kernel-Thread

커널이 관리하는 쓰레드입니다. OS 스케쥴러의 최소 단위가 바로 커널 쓰레드입니다.

  • 하나의 프로세스는 적어도 하나의 커널 쓰레드를 가집니다.
  • 커널 영역에서 쓰레드 연산을 수행합니다.
  • 사용자 <-> 커널 모드의 전환이 빈번하여 오버헤드가 큽니다.
  • 시스템 콜을 자주 사용한다?? > 커널 쓰레드를 사용해야 합니다.

문제

  • 사용자 스레드 전환은 왜 오버헤드가 적은가?
    : 커널을 호출하지 않기 때문에 오버헤드가 적습니다.
  • 디스크 I/O는 어떤 쓰레드로 구현하는게 유리한가?
    : 시스템 콜을 자주 호출하기 때문에 동시에 실행되는 것처럼 보이게 하기 위해서 커널 쓰레드를 사용하는 것이 유리합니다.




Multi-Threading Models

Many-to-One

사용자 쓰레드들을 하나의 커널 쓰레드로 묶어버리는 방법입니다.

  • 하나의 쓰레드가 blocking 당하면, 다른 쓰레드들도 다 block 됩니다.
  • 쓰레드 관리 없이 원하는 만큼의 쓰레드를 생성할 수 있습니다.
  • 이 방식으로 생성한 쓰레드들은 병렬 실행이 아닙니다. 왜냐하면 시스템은 커널 쓰레드 하나만을 인식 하기 때문입니다.

One-to-One

하나의 유저 쓰레드를 하나의 커널 쓰레드에 매핑하는 방식입니다.

  • concurrency 증가 (할당받는 CPU 시간 증가)
  • 한 프로세스 내에서 만들 수 있는 쓰레드의 개수는 제한적입니다.
  • 오버헤드가 큽니다!

Many-to-Many

여러개의 user-level 쓰레드들을 여러개의 커널 쓰레드에 매핑하는 방식입니다.

  • 사실 그다지 일반적인 방식은 아닙니다. 구현이 어렵습니다.

Two-level

Many-to-Many + One-to-One 느낌의 방식입니다.




쓰레드 라이브러리

쓰레드를 생성, 관리기 위한 API를 제공합니다. 유저레벨, 커널레벨 두가지 구현이 존재합니다.

Pthreads

Posix Thread 입니다. 유저/커널 쓰레드 생성 둘 다 지원합니다. 하지만 일반적으로 유저 쓰레드 생성에 주로 사용합니다.

Specification, not implementation

C언어로 pthread를 사용하는 예시입니다. 특정 함수를 별도의 실행흐름으로 돌립니다. 이처럼, 대부분 함수를 쓰레드로 넘기는 방식을 주로 사용합니다.

쓰레드 함수입니다. 여기서 눈여겨 볼 점은, sum 함수의 선언이 없다는 점 입니다. 프로세스의 전역 변수로 선언되어 있기 때문에 별도의 선언 없이도 사용할 수 있습니다.

Java Threads

자바의 경우, JVM에 의해 관리됩니다. 자바에서의 쓰레드 생성은 Thread 클래스를 상속받은 후 Runnable 인터페이스를 구현하므로써 생성할 수 있습니다. 예를 들어

이런식으로! 아래는 오오오래전에 라이노 엔진 기반으로 작성했던 라이브러리의 일부 코드입니다.

Thread 를 새로 할당하고, Runnable을 넘겨주므로써 쓰레드를 생성한다는 것을 알 수 있습니다.

Java Executor Framework

명시적으로 쓰레드를 생성하기 보다는, Executor 인터페이스를 통해 생성하는 것도 지원합니다.

profile
차근차근 천천히
post-custom-banner

0개의 댓글