본문 바로가기

OS

[OS][운영체제] 4. Threads / 스레드

반응형
  1. Threads
  2. Multithreaded Process
  3. Kernel, User Threads
  4. Multithreading Models
  5. Threading Issues
  6. Pthreads / Windows XP / Linux / Java Threads

1. Threads

Lightweight Process라 불리는 스레드는 가장 작은 일 단위이다

이는 다음과 같이 구성된다

  • Thread ID
  • PC
  • register set
  • stack space (스레드의 용량이 적어 pointer를 활용할 필요가 없다)

Heavyweight Process는 한 스레드와 한 작업(task)을 말한다

이는 다음 자원을 peer 스레드와 공유한다

  • code(text) section
  • data section
  • OS 자원

메모리 영역 : (snupi.tistory.com/9?category=819647)


2. Multithreaded Process

[사진 2] Multithreaded 프로세스

한 스레드가 작업 중에 block을 당하거나, waiting 할 때,

다른 스레드가 같은 일을 run 할 수 있다

 

이는 다음과 같은 장점이 있다

  • 처리량이 높고 성능이 좋다
  • 높은 반응성 (하나가 block 되어도 하나가 일한다)
  • 자원 공유 (자원을 공유하여 데이터의 공유 속도가 빠르다) -> Economy
  • MP(Multi-Processor) Architectures의 활용 (많은 프로세서에 많은 스레드)

[사진 3] 다중 프로세스 / 다중 스레드 특징


3. Kernel, User Threads

스레드 레벨에는

  • Kernel Level
  • User Level
    • : API에서의 유저 레벨 스레드 라이브러리 / 커널 위에서 지원

로 나누어진다

다음 [사진 4]와 같이 CPU는 유저 레벨 스레드를 보지 못하고 프로세스로만 인식할 수 있다.

[사진 4] CPU가 보는 Kernel / User 스레드
[사진 5] User / Kernel 레벨 스레드 특징

유저 레벨과 다르게 커널 레벨 스레드

인터럽트를 통해 스위칭을 해야하며 시간(오버헤드)이 소비된다

유저 레벨 스레드는 LWP(Light Weight Process)의 user 스레드를 다른 스레드로 교체하며

context switching 한다 (레지스터 state 저장, 복원)


4. Multithreading Models

유저 스레드는 커널 스레드를 잡아야 처리가 되고,

커널 스레드(일감)는 CPU의 프로세서(일하는 놈)과 매핑되어 처리되게 된다

Many-to-One

User level thread 수와 Kernel level tread 수를 Many-to-One으로 할 시에 하나가 block 당하거나 waiting 시에 멈추게 된다

 

[사진 6] M-1

One-to-One

이를 방지한 One-to-One은 커널을 그만큼 만들기에 자원이 필요하고 오버헤드가 발생하는 문제가 생긴다

 

[사진 7] 1-1

Many-to-Many

이를 방지한 Many-to-Many는 유저 스레드끼리 커널 스레드를 경쟁하여 잡으면 중요한 유저 스레드가 실행할 수 없을 수 있게 된다

 

[사진 8] M-M

Two-level Model

이를 방지한 Two-level Model M:M과 비슷하지만 유저 스레드 하나가 커널 스레드를 잡을 수 있게 한다

 

[사진 9] M-M + 1-1


5. Threading Issues

- fork() 시스템 콜(새 프로세스를 만듦)을 부를 때,

exec() 시스템 콜(새 프로그램에 프로세스의 메모리 공간을 둚)이 있으면 그것만 복제하고,

없으면 모두 복제한다

 

- 취소된 스레드에 자원을 할당하거나, 공유 중인 데이터가 있는 스레드를 cancel하면 문제가 생기게 된다.

스레드가 정상적으로 끝나기 전에 끝내는 Cancellation는 다음과 같다.

  • 비동기식 Cancellation은 즉시 종료시킨다
  • 지연된 Cancellation은 중간중간 Cancel Point에 도달할 때까지 계속 진행하다가, Cancel Point에 도달하면 종료할건지 체크한다

- I/O나 인터럽트 같은 event가 발생했을 때 Signal Handling의 종류는 다음과 같다

  • 관련있는 스레드에 알림
  • 모든 스레드에 알림
  • 몇 개의 전담 스레드에 알림
  • 특정 스레드 하나에 알림

- Thread Pool: 필요 시 새 스레드를 만드는 것보다. 기존의 스레드를 가져다 쓰는 것이 효율적이다 (생성, 종료의 오버헤드 X)

-> 시스템 내 자원을 고려해 적정 개수 스레드를 정해 Pool 안에 넣어둔다

-> 일감이 들어오면 빠르게 하나씩 매핑하여 작업시킨다

-> 작업이 끝나면 Pool로 복귀시킨다

 

- 적절한 커널 레벨 스테드 수를 유지하기 위해 유저와 커널은 upcall로써 통신한다

-> Lightweight process(LWP) kernel thread와 매칭시키고 user thread를 받게 한다

 

[사진 10] upcall: 커널과 유저 라이브러리 사이 통신 방법


6. Pthreads / Windows XP / Linus / Java Threads

POSIX API 안에서의 Pthread는 생성, 동기화 제공한다(UNIX).

Window XP(1:1 매핑), Linux(clone()이라는 시스템 콜로 주소공간을 공유), Java(JVM이 관리함) Threads 등에서 스레드를 처리하는 방법을 가진다.

반응형