운영체제 CHAPTER4 - 스레드 (Threads) (2)

LYN L·2022년 8월 26일
0

Operating-System

목록 보기
5/5

4.3 다중 스레드 모델 (Multithreading Models)

Amdahl's Law: CPU 코어는 무조건 많을수록 좋은가?
speedup <= 1/(S+(1-S)/N)
S: the portion that must be performed serially on a system
N: the number of processing cores

  • Thread는 사용자 수준에서는 user Thread와 kernel 수준에서 사용되는 kernel thread로 제공될 수 있다.
  • User Thread는 Kernel 위에서 지원되며, Kernel의 지원 없이 관리된다.
  • Kernel Thread는 운영체제에 의해 직접 지원되고 관리된다.

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

  • 많은 user-level Threads들을 하나의 kernel Thread로 mapping 한다.

(장점)

  • Thread management는 user spcae의 thread library에 의해 행해지고, 효율적이다.

(단점)

  • 하지만, 한 thread가 blocking system call을 하면 전체 process가 block 된다.
  • 또한, 한 번에 한 thread만이 kernel에 접근할 수 있기 때문에 multiple thread가 multi-core system에서 병렬적으로 실행될 수 없다.

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

  • 각 user thread를 kernel thread로 mapping 한다.

(장점)

  • 이 모델은 하나의 Thread가 blocking system call을 하더라도, 다른 thread가 실행될 수 있기 때문에 다대일 (many-to-one model) 모델보다 더 많은 병렬성을 제공한다.
  • 이 모델은 multiprocessor에서 multiple thread가 병렬로 수행될 수 있다.

(단점)

  • 이 모델의 단점은, user-level thread를 생성할 때 그에 따른 kernel thread를 생성해야 한다는 점이다.
  • kernel thread를 생성하는 overhead가 application의 성능을 저하시킬 수 있으므로, 이 모델의 대부분의 구현은 system에 의해 지원되는 thread의 수를 제한한다.

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

  • 여러 개의 User-level thread를 그보다 작은 수 혹은, 같은 수의 kernel thread로 multiplex한다.
  • kernel thread의 수는 application이나 특정 기계에 따라 결정된다.

(4) 두 수준 모델 (Two-level Model)

  • Many-to-Many Model과 One-to-One Model을 결합하 모델이라고 할 수 있다.
  • many-to-many 모델과 비슷한데, 특정 유저 스레드를 위한 커널 스레드를 따로 제공하는 모델을 말한다. 점유율이높아야 하는 유저 스레드를 더 빠르게 처리해줄 수 있다.

4.4 스레드 라이브러리 (Thread Library)

  • 스레드 라이브러리는 프로그래머에게 thread를 생성하고 관리하기 위한 API를 제공한다.

  • Thread Library를 구현하는 데에는 크게 2가지 방법이 있다.
    (1) Kernel의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공하는 방법
    (2) OS에 의해 지원되는 kernel 수준에서의 library를 구현하는 방법,

  • 세 종류의 Thread library가 주로 사용된다.
    (1) POSIX Pthreads (2) Windwos (3) Java


4.5 암묵적 스레딩 (Implicit Threading)

  • multi-core processing이 발전함에 따라, 수백 또는 수천 개의 thread를 가진 application이 등장.
  • Threading의 생성과 관리 책임을 Application developer 로부터 compiler와 run-time libraries에게 넘겨주는 암묵적 스레딩(implicit threading)을 사용하여 multi-thread application을 효율적으로 설계할 수 있다.
  • 암묵적 스레딩을 사용하여 multicore processor를 활용할 수 있는 multi-thread programming을 설계하는 3가지 접근법은 다음과 같다.
    (1) Thread pool (2) OpenMP (3) Grand Central Dispatch

Thread Pool

  • 웹서버는 요청을 받을 때마다 그 요청을 들어주기 위해 새로운 Thread를 생성한다.

  • 이 방법에는 크게 2가지 문제가 있을 수 있다.
    (1) 서비스를 할 때마다 thread를 생성하는 데 일정 시간이 소요된다.
    (2) 모든 요청마다 thread를 생성하므로, 동시에 실행할 수 있는 최대 thread의 수를 정해놓아야 한다.

  • Thread를 무한정 만들면 언젠가는 CPU 시간, 메모리 공간과 같은 System Resource가 고갈될 수 있다. 이런 문제를 해결할 수 있는 방법 중 하나가 thread pool이다.

<기본 아이디어>

  • 프로세스를 시작할 때 아예 일정한 수의 thread를 미리 pool로 만들어 놓는 것.
  • pool이 만들어진 thread들은 일이 없을 때는 일(work)을 계속 기다리게 된다.
  • 이후 Request가 들어오게 되면, pool에서 한 thread에게 해당 request를 할당한다.
  • 만약 pool에 남아 있는 thread가 없다면, server는 free thread가 하나 생길 때까지 기다려야 한다.

<장점>

  • 새 thread를 만들어 주는 것보다 생성된 thread를 사용하여 서비스 해 주는 것이 더 빠르다.
  • thread pool은 임의의 시간에 존재할 수 있는 thread 개수에 제한을 둔다.
  • task를 생성하는 방법을 분리하여, task를 일정 시간 후에 실행되도록 하거나, 주기적으로 실행시킬 수 있다.

4.6 스레드와 관련된 문제들 (Threading Issues)


4.7 운영체제 사례 (Operating-System Examples)


profile
steadily, off the wall

0개의 댓글