컴퓨터/운영체제

[OS] Thread (2)

xeskin 2020. 4. 16. 18:18
반응형

스레드가 어떤 모드에 있냐에 따라 '유저 레벨 스레드'와 '커널 레벨 스레드'로 나뉜다.

 

유저 레벨 스레드 (User-level Thread)

- 유저 레벨 라이브러리로 구현한다. 라이브러리에는 스레드 생성/제거, 스케쥴링, 컨텍스트 저장/복구 등이 구현돼야한다.

- 모든 코드와 데이터 스트럭쳐가 유저 스페이스에 존재한다.

- 커널은 유저 스레드가 얼마나 돌아가는지 모른다. 커널의 입장에서는 하나의 프로세스로 보인다.

장점

- 운영체제가 커널 스레드를 지원하지 않아도 사용할 수 있다.

- 커널 모드에 진입하지 않아도 된다. 스레드 스위칭에는 함수 호출만큼 코스트가 든다.

- 스케쥴링 정책을 응용 프로그램에 맞춰 만들 수 있다. 각, 프로세스마다 폴리시가 있는 것으로 생각할 수 있다.

단점

- 스레드 하나가 블락돼면 전체 스레드가 블락된다.

 

커널 레벨 스레드 (Kernel-level Thread)

- 커널이 지원하는 스레드이다.

- 모든 코드와 데이터 스트럭쳐가 커널 스페이스에 존재한다.

- 시스템 콜을 사용하여 스레드를 생성하고 관리한다.

- 스레드 단위로 스케쥴링을 한다.

장점

- 커널이 스레드의 정보를 다 알고 있다.

- 스케쥴러가 많은 프로세스에게 cpu time을 할당해줄 수 있다.

- 자주 블록되는 프로그램에 좋다.

단점

- 커널의 모든 스레드를 관리해줘야 하고 스케쥴 해야한다. 모든 스레드에 대한 스택을 만들어 줘야함.

- 스레드 스위칭을 하려면, 시스템 콜을 이용해야해서 오버헤드가 크다. 그리고 커널이 복잡해진다.

 

최근에 나오는 운영체제들은 모두 커널 스레드를 지원한다.

 

멀티 스레딩 모델 세가지 (Multi-threading model)

Many-to-one model

: 여러개의 유저 스레드가 하나의 커널 스레드로 매핑하는 방법. 유저 레벨 스레드와 같다. 최근에는 거의 사용하지 않는다. 커널 스레드란 개념이 없을 때, 싱글 코어 프로세서를 사용할 때 쓴다.

장점

- 유저 레벨 라이브러리로 관리되기 때문에 상당히 빠르다. 커널 서포트가 필요없다. 즉, 시스템 콜이 필요없다.

- 스레드 싱크, 생성이 빠르다. 리소스를 효율적으로 사용할 수 있다.

- 커널의 도움이 필요 없기 때문에 이식성이 높다.

단점

- 스레드 하나가 블락되면 다른 스레드도 다 블락됨

- 멀티코어 시스템에서 여러 개의 스레드를 병렬적으로 실행할 수 없다. CPU 스케쥴링을 커널이 해주는데, 커널 입장에서 하나의 프로세스로 보이기 때문이다.

 

One-to-one model

: 하나의 유저 스레드가 하나의 커널 스레드로 매핑하는 방법. 최근 사용하는 운영체제 중 다수가 이를 채택한다.

장점

- Many-to-one model보다 동시성(Concurrency)을 더 높일 수 있다. 한 스레드가 블락되어도 다른 스레드를 실행시키면 되니까.

- 멀티코어 시스템에서 여러개의 스레드를 병렬적으로 실행할 수 있다. 커널 입장에서 서로 다른 TCB로 보이고, 이걸 스케쥴링하면 되니까.

단점

- 싱크, 스레드 생성하는데, 커널의 도움을 받아야 하기 때문에 느리다. 리소스 사용이 비효율적이다.

- 스레드를 너무 많이 만들면 시스템 성능이 안좋아질 수 있다. 일부 시스템에서는 최대 커널 스레드 갯수를 제한한다.

 

Many-to-many model

: 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑하는 방법. (m개의 유저 스레드 -> n개의 커널 스레드)

- context switch를 유저 레벨 라이브러리가 관리하여 빠르다. 즉, 스레드 오퍼레이션이 빠르다.

- 어떤 유저 스레드를 어떤 커널 스레드에 할당해줄 지 스케쥴러가 정해준다.

장점

- Many-to-one model과 one-to-one model의 장점을 다 가질 수 있음

- 생성할 수 있는 유저 스레드 갯수에 제약이 없다. 커널 스레드가 제한돼있어도 유저 스레드를 늘리면 되니까.

단점

- 구현이 어렵다.

예. mach 3.0 kernel (맥에 들어가는 커널)

 

Two-level model 

- 일부는 many-to-many, 다른건 one-to-one model

- 중요한 스레드에 대해서는 one-to-one을 채택한다.

 

스레드 라이브러리: 스레드를 생성하고 관리할 때 사용하는 API

유저 레벨 라이브러리: 유저 스레드를 구현 해놓은 거라고 보면 된다.

- 유저 스페이스에서 실행된다.

- 모든 코드와 데이터가 유저 스페이스에 있다.

- 라이브러리의 함수를 호출할 때 시스템 콜이 필요하지 않다.

커널 레벨 라이브러리: 커널 스레드를 구현 해놓은 거라고 보면 된다.

- 모든 코드와 데이터가 커널 스페이스에 있다.

- 라이브러리의 함수를 호출할 때 시스템 콜이 필요하다.

 

예.

Pthread: 유저, 커널 레벨 스레드 모두 구현 가능하다. POSIX Standard의 thread extension이다.

Windows thread: 커널 레벨 스레드

Java thread: 자바는 운영체제 위에 실행되는데, 실제로 pthread나 windows thread를 이용해서 구현된다.

반응형

'컴퓨터 > 운영체제' 카테고리의 다른 글

[OS] Thread (3)  (0) 2020.04.23
[OS] Thread (1)  (0) 2020.04.16
[OS] Inter Process Communication (IPC)  (1) 2020.04.15
[OS] Context Switch와 레지스터 셋의 관계  (0) 2020.04.15
[OS] Interrupt  (0) 2020.04.03