Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

Thread 본문

Computer Science/Operating System

Thread

studyHub 2021. 6. 7. 15:55

이전까지는, a single thread of control을 가진 프로세스들을 동시 실행하는 것에 대해 공부해왔다.

하지만, 하나의 프로세스가 여러 스레드로 구성될 수도 있다.

 


Thread란?

thread는 lightweigt process로 CPU 점유의 단위가 된다.

프로세스 내 각각의 thread는 program counter, register set, stack pointer로 구성된다.

 

Single-threaded and multithreaded processes

 

Multithreading

Server는 multithread를 활용한다.

요청마다 스레드를 생성하여 처리를 위임한다면, 자원 소비도 줄이고 동시 처리도 용이하다!

Multithread server architecture → request 처리를 thread들에게 맡기고(multi core 활용), server는 계속 요청을 접수한다.

 

멀티스레드 프로그래밍의 장점

    • 프로세스의 응답성 향상
      - 한 스레드가 blocking이거나 입출력으로 인해 작업이 진행되지 않더라도,
        다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
      - 다중 CPU가 멀티스레드 병렬 처리 → 프로세스 처리 시간 단축

    • 시스템 효율 향상
      - 불필요한 자원의 중복을 막는다. 코드 영역이 큰 프로세스를 fork하는 것보다 훨씬 경제적이다.
      - 프로세스 context switch와 달리 오버헤드가 적다. (PCB switch X)
      - 스레드의 context swtich는 캐시를 비울 필요가 없어 빠르다.
      - CPU가 여러 개이거나 core가 여러 개인 경우에 잘 활용할 수 있다. (하이퍼스레딩)

    • 간단한 스레드 간 통신
      자원을 공유하기 때문에 스레드 간 통신이 프로세스 간 통신보다 간단! (전역 변수 or 힙 영역 활용해 데이터 교환)
      message passing을 쓰거나 shared memory 안 만들어도 된다. data 영역을 공유하니까!

Multicore Programming

멀티 코어 시스템에서 멀티스레딩은 동시성이 향상되어 더 효율적이다.

싱글 코어의 경우엔 시분할하여 thread가 interleaved되지만, 멀티 코어 환경에선 병렬 진행될 수 있다

Concurrent execution on a single-core system
Parallel execution on a multicore system

코어의 수가 더 많은 경우 context switch 조차 필요 없을 수 있다!

 

하지만 그만큼 프로그래밍 상의 어려움도 커진다.

  • 병렬 처리되면 안 되는 부분을 찾아야 한다. 순서를 파악하기 어려워진다.
  • 각 스레드에 일을 균등 분배하기가 어렵다. (task parallelism)
  • 다중 코어에 각각 할당할 데이터도 나눠야 한다. (data parallelism)
  • 데이터 종속성, 처리 순서를 지키도록 작업 실행을 동기화해야 한다. (ex. merge sort)
  • test와 debugging이 어렵다. (병렬 실행되는데 break point를 어떻게 잡는가?)

 

Data parallelism and task parallelism

 

Thread의 종류

프로세스가 커널 프로세스와 사용자 프로세스로 나뉘듯, 스레드도 user thread와 kernel thread로 나뉜다.

  • 커널 스레드: 커널이 직접 생성하고 관리하는 스레드
  • 사용자 스레드: 라이브러리에 의해 구현된 일반적인 스레드

User threads and kernel threads

예를 들어 Java에서 multi thread programming을 한다고 할 때, thread는 JVM 위에서 돌아가는 것이다.

JVM이 직접 core를 할당할 순 없다!

사용자 스레드가 커널 스레드를 사용하려면 System call 커널 기능을 이용한다

커널 스레드의 서비스를 받아 사용자 스레드가 동작한다.

 

하지만 OS가 관리하는 kernel thread는 core를 직접 제어한다. OS는 커널 스레드를 생성해서 관리한다.

 

user thread와 kernel thread의 관계

• Many-to-One Model

Many-to-one model

 

OS 멀티스레드 지원하지 않는 초기의 스레드 시스템.

여러 cpu 동시 사용이 불가하고, 문맥 교환 필요 없다.

 

• One-to-One Model

One-to-one model

여러 스레드를 여러 cpu에 나누어 독립적으로 스케줄링된다.

 

• Many-to-Many Model

Many-to-Many model

여러 커널 스레드가 동작하므로 유연하게 작업 처리할 수 있다.

 

 

 

 


참고 자료 & 이미지 출처
운영체제 공룡책 강의 (주니온 님)
Operating System Concepts, 10th Ed (Silberschatz et al)
쉽게 배우는 운영체제 (조성호 님)

 

 

'Computer Science > Operating System' 카테고리의 다른 글

Critical Section Problem: 프로세스 동기화가 필요한 상황  (0) 2021.06.09
CPU Scheduling  (0) 2021.06.08
프로세스 간 통신 : IPC  (0) 2021.06.06
프로세스의 이해  (0) 2021.06.06
OS 란?  (0) 2021.06.05