Thread의 종류

  1. User threads : kernel support 없이 관리 된다. ( ex) Java Thread : O/S가 아닌 JVM이 관리)

    장점 :

    1. 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠르다.
    2. 스케줄링과 동기화를 위해 System Call을 하지 않기 때문에 오버헤드가 적다.

    단점 :

    1. 하나의 스레드가 시스템 호출 등으로 중단되면 나머지 모든 스레드 역시 중단된다.

      커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기 상태로 전환시키기 때문이다.

    2. 하나의 스레드가 System Call을 하면 해당 프로세스 내 모든 스레드가 중단된다. (Blocking System call)

  2. Kernel threads : O/S 에 의해 직접적으로 관리 된다.

    장점 :

    1. 스레드가 시스템 호출 등으로 중단되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행시킨다.
    2. 커널이 각 스레드를 개별적으로 관리 가능

    단점 :

    1. 멀티프로세싱 환경에서 커널은 여러 개의 스레드를 각각 다른 프로세서에 할당할 수 있다. 다만, 사용자 스레드에 비해 생성 및 관리속도가 느리다.
    2. 유저 모드와 커널 모드 간 전환이 빈번하여 성능이 낮다.

    커널 레벨 스레드의 3가지 모델

    커널 레벨 스레드의 3가지 모델

    1. 다대일 모델(Many-to-one Model)

      다중 thread를 사용하지만, kernel 입장에서는 user level에 thread가 몇 개나 존재하는지 알지 못하기 때문에 Scheduling같은 관리들이 user level에서 이루어진다.

      당연히 속도가 빠르고 thread를 생성하고 관리하기 쉽다.

      한 개의 thread라도 system call을 수행하다가 block이 되면 kernel과 연결되어 있는 길이 “하나”뿐이기 때문에 모든 thread들이 block 된다.

      결국 여러 user thread들 중 하나의 thread만이 kernel과 작업을 할 수 있다.

      → multicore 시스템에서 한 번에 하나의 thread만이 작업에 참여할 수 있어 “병렬(Parallel)작업이 불가능

      현재는 거의 사용하지 않는다.

    2. 일대일 모델 (One-to-one Model)

      다대일 모델과는 정반대의 특성들을 가진다.

      → user thread를 생성하면 kernel thread도 생성되는 형태로 구현. user thread 하나 당 kernel thread가 하나씩 연결되어 있기 때문에 thread 하나가 block 되더라도 다른 thread들은 정상적으로 작동이 가능하여, **동시성 (Concurrency)**이 보장됨 + multicore 시스템에서 여러 개의 thread들이 **병렬(Parallel)**로 실행 가능

      thread 생성이 힘들고, 관리가 어렵기 때문에 thread가 많아지게 되면 시스템의 성능에 큰 부담을 줄 수 있다.

      → 시스템들은 thread의 최대 개수를 정해두어 관리하는 방법으로 overhead 방지

    3. 다대다 모델 (Many-to-many Model)

      Kernel thread의 수는 시스템이나 하드웨어에 따라 결정되며, user thread들은 user level의 스케쥴러에 의해 kernel thread들에게 복합적으로 연결된다.

      Kernel thread가 여러 개 존재하기 때문에 multicore 시스템에서 병렬(Parallel) 수행이 가능.

      다대일 모델, 일대일 모델의 장점을 결합한 형태

      → 많은 thread가 좀 더 손쉽게 관리되는 장점이 있지만, 구현이 어렵다.

Pthreads(POSIX Thread)

Untitled

Untitled

void * runner : Java의 public void run() 메소드

pthread_create : Java의 Thread thread = New Thread();

Exercise 4.17

Untitled

Q1) How many unique processes are created? Ans) 6

Q2) How many unique threads are created? Ans) 8

Sol)

Untitled

  1. pid = fork();에서 부모 P0, 자식 P1이 생성

  2. P0은 if문 아래의 fork();를 통해 자식 P2를 생성

  3. 부모 P0을 실행했으니, 자식 P1을 실행한다.

    → P1은 if문의 fork();를 통해 자식 P3를 생성

    → P1은 thread_create를 통해 쓰레드1을 생성 후, if문 밖의 fork();를 통해 자식 P4를 생성.