4 분 소요


▶ 스레드

  • 스레드(Thread)란?
    • 프로세스를 구성하는 실행의 흐름 단위이다.
    • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
    • 원래 프로세스는 한 번에 하나의 일만을 처리했으나, 스레드 라는 개념이 도입되며 한 번에 여러일을 처리할 수 있게 된 것이다!
    • MS 워드에서 글자 잘 못 썼을 때 빨간색으로 표시되거나 자동 저장되는 기능 하나하나가 스레드이다.


  • 스레드의 구성요소
    • 스레드 ID
    • 프로그램 카운터
    • 레지스터 집합
    • 스택


  • 클라이언트&서버 구조에서의 스레드


  • 스레드 장점
    • 응답성 향상
      • 벙렬적으로 업무 처리 가능하기 때문
    • 자원 공유
      • 각 스레드가 다른 처리기에서 병렬로 실행될 수 있다.
    • 경제성
      • 프로세스를 만드는 것보다 더 저렴하다.


  • 멀티코어 프로그래밍
    • 다중 코어 / 다중 프로세스라고도 한다.
    • 한 개의 칩에 여러 개의 CPU(core)가 존재한다.


▷ 멀티 프로세스와 멀티 스레드

구분 멀티 프로세스 멀티 스레드  
개념 여러 프로세스끼리 동시에 실행하는 것 프로세스 내에 여러 스레드를 동시에 실행하는 것  
특징 기본적으로 프로세스끼리 자원 공유하지 않음 같은 프로세스 내의 스레드 끼리 자원을 공유함  
장점 프로그램 안전성, 프로그램 병렬성, 시스템 확장성 여러 프로세스를 병행 실행하는 것 보다 자원을 효율적으로 사용  
단점 IPC, 공유메모리 등으로 통신은 가능하지만 오버헤드 존재 하나의 스레드가 문제가 생기면 프로세스 전체의 문제가 생길 수 있음  


  • fork()로 3개 실행 vs 스레드로 3개 실행


▷ 경량 프로세스(LWP)

  • 경량 프로세스 (LWP, Light Weight Process)
  • 다대다 또는 두 수준 모델을 구현하는 많은 시스템에서 사용되는 중간 자료구조이다.
  • 사용자와 커널 스레드 간의 중간 자료 구조로서 동작하며, 가상 프로세서처럼 보여지며 사용자 스레드를 실행할 수 있도록 예약할 수 있다.


Thread와 LWP의 차이점?

” 스레드 중에서 프로세스의 속성 중 일부가 들어 있는 것을 LWP” 라고 한다. 반대로 “프로세스 1개에 스레드가 1개인 경우를 중량 프로세스(HWP; Heavy Weight Process)” 라고 한다.


  • 스케줄러 액티베이션(Scheduler Activation)은 사용자 스레드 라이브러리와 커널 스레드 간의 통신 방법이다.
    1. 커널은 응용에 가상 처리기(LWP)의 집합을 제공
    2. 응용은 사용자 스레드를 가상 처리기에 스케줄링
    3. 커널은 특정 이벤트가 발생할 때 응용에게 알림 -> 이때 사용되는 프로시저 "업콜(upcall)“
    4. 업콜은 스레드 라이브러리의 업콜 처리기에 의해 처리되며, 해당 처리기는 가상 처리기에서 실행




▶ Parallelism과 Concurrency⭐

Parallelism과 Concurrency 를 구분할 수 있어야 한다.!!⭐

종류 Parallelism (병렬 실행) Concurrency (병행 실행)
특징 한 시점에 여러 개 작업을 동시에 실행한다. 한 개 이상의 작업이 수행되게 한다.
사용 멀티 코어에서 사용된다.
진짜 동시 실행을 의미한다.
단일 코어에서 사용된다.
따라서 특정 시간에 하나의 스레드만 사용이 가능하다.
하지만 시간을 분할하여 여러 Task를 번갈아가며 수행하기 때문에 여러 개의 스레드를 사용하는 것 처럼 보인다.
( Time Sharing을 생각하면 된다. )


▷ Parallelism 유형

병렬 실행을 하는 방법에는 2가지가 존재한다. (구분할 줄 알아야함!! ⭐)

① Data Parallelism

  • Data Parallelism(데이터 병렬화)

    • 배열처럼 이어진 여러 데이터들에 대해, 같은 Task을 병렬적으로 수행하는 것
    • 배열 또는 데이터 요소에 대해 동일한 작업을 병렬로 수행할 때, Task에 있는 연산을 동시에 더해도 서로 영향을 주지 않는다.(독립적으로 수행)
    • 주로 Vector Processing에서 사용된다.
  • 예시( 배열 a, b, c가 존재할 때, c = a + b 에 대한 연산 )


② Task Parallelism

  • Task Parallelism(태스크 병렬화)
    • 다양한 데이터에 대해, 서로 다른 Task를 수행하는 것
    • (ex. 참고) 다수의 클라이언트 요청을 병렬로 처리하여 웹 사이트의 응답 시간을 최적화




▶ 스레드의 모델

▷ 유저 스레드

  • 유저 스레드란?
    • 사용자 레벨에서 스레드를 구현하기 위해 라이브러리 사용하여 구현한 스레드이다.
    • 유저 스레드는 커널 스레드의 도움을 받아 동작한다.
    • 사용자 스레드가 커널 스레드를 사용하려면 시스템 호출로 커널 기능을 이용해야 한다.


  • 3가지 주요 스레드 라이브러리
    • POSIX의 Pthreads
    • Windows의 threads
    • Java의 threads (언어 레벨에서 스레드를 지원, 스레드는 자바 프로그램 실행의 근본적인 모델이다.)


▷ 커널 스레드

  • 커널 스레드란?
    • 커널이 직접 관리하고 생성하는 스레드이다.


▷ 멀티 레벨 스레드

  • 멀티 레벨 스레드란?
    • 사용자 레벨 스레드와 커널 레벨 스레드를 매핑한 방식이다.
    • 유저 스레드와 커널 스레드가 서로 매핑되는 방식은 세 가지가 있다.


① Many-To-One

  • 유저 스레드는 많고 커널 스레드는 하나이다.
  • 한 개의 스레드가 죽으면 모든 스레드가 같이 죽는다. (커널 스레드가 한 개이기 때문)
  • 과거에 사용하던 방식이다.


② One-To-One

  • 사용자 스레드와 커널 스레드가 일대일로 매핑된다.
  • 최대 개수는 n개로 정해져 있다.
  • Many-To-One보다 병렬성에서 우수하다. (유저 스레드 독립적으로 동작)
  • 현재 시스템에서 사용되는 방식이다.


③ Many-To-Many

  • 많은 유저 레벨 스레드가 많은 커널 스레드에 매핑 됨을 허용한다.
  • 운영체제가 충분히 많은 커널 스레드를 만들도록 허용한다.
    • 따라서 매핑이 어떻게 될지 몰라 적당히 알아서 매핑이 되는 관계이다.
  • 구현시 오버헤드가 발생하여, 사용하지 않는 방식이다.




▶ 스레드 Libararies

  • 스레드 라이브러리

    • 위에서 3가지 주요 스레드 라이브러리를 살펴봤다.
    • 스레드 라이브러리는 스레드를 만들고 관리하는 API를 프로그래머에게 제공한다.
  • 스레드 API 방식

    • 라이브러리가 완전 유저 스페이스에 있는 방식
    • 운영체제가 커널 레벨 라이브러리를 지원하는 방식


▷ Pthreads

  • Pthreads Libararies
    • POSIX 운영체제에서 사용되는 라이브러리이다.
      • Pthreads 라이브러리는 UNIX 계열군의 표준 API이다.
    • Pthreads 라이브러리는 유저 스레드와 커널 스레드 모두 지원한다.


  • 명세(Specification)와 구현(Implementation)
    • Pthreads는 오직 명세(가이드)일 뿐이다. 이에 대한 구현은 각 벤더들이 한다.
    • 표준: 응답을 받은 이후에 2ms 이후에 응답을 줘야한다.
    • 구현은 표준 문서에는 이 것을 구현하기 위해 변수는 세 개를 쓰고 알고리즘을 뭐를 쓰고 … 이런걸 말하지 않는다.
    • 즉, 구현은 어떤 알고리즘을 쓰던지 상관 없지만 기준에 만족해야하는 것을 말한다. 이것이 명세와 구현의 차이이다!




▶ 암묵적 스레딩

  • 암묵적 스레딩의 방법은 세 가지가있다.
  • 쓰레드를 점점 더 많이 쓰다보니, 프로그램 수행의 정확성을 지키기가 어려워졌다. 따라서 쓰레드 생성 관리 등을 프로그래머 대신, 컴파일러와 런타임 라이브러리에 맡긴 것을 암묵적 쓰레딩이라고 한다.


▷ Thread Pools

  • Pool의 사이즈 만큼 스레드를 서비스 할 수 있다.
  • 쓰레드를 그때그때 새로 만드는 것 보다, 미리 만들어두어 이미 존재하는 쓰레드로 서비스하는 것이 조금 더 빠르다. (많으면 좋은데 돈을 많이듬…)
  • Pool 사이즈 이상의 요청시, 사용 중인 쓰레드가 완료될 때까지 기다려야한다.
  • 아래 그림에서의 스레드는 6개이므로 6개의 서비스 할 수 있다.


▷ OpenMP

  • OpenMP는 병렬 프로그램을 지원한다.
  • 전처리기(혹은 지시자#)를 통해서 구현할 수 있다.
  • 병렬 수행영역을 전처리기로 표기하여, 쓰레드를 사용하여 처리한다.


▷ GCD

  • GCD(Grand Central Dispatch)란?
    • GCD는 Apple 사의 기술이다.
    • ^{} 을 통해, 병렬처리를 한다.
    • 해당 중괄호 안에 작성된 내용을 독립적으로 실행될 수 있는 작업단위로 처리한다.


  • GCD의 종류 GCD를 처리할 때 큐에서 값을 가져오는 방법이 두 가지있다.

    • Serial (직렬)
    • Concurrent (병행)




▶ LWP

  • 경량화(LWP, Lighweight)
    • 제품, 소프트웨어, 시스템, 또는 프로세스를 최적화하고, 쓸 데 없는 부분을 제거하여 무거움을 줄이는 프로세스를 말한다.
    • 워치 OS를 개발할 때 맥 OS에 있는 카메라 모듈을 제거하여 경량화 함




📎참조

  • 성결대학교 강영명 교수님 운영체제 (2023)
  • 혼자 공부하는 컴퓨터구조 + 운영체제 - 한빛 미디어
  • https://taegyunwoo.github.io/os/OS_Thread
  • https://tscofet.oopy.io/0dc22a9c-a968-4a61-9e7a-243ef3904dfa#cb166492-405c-4be0-a119-243c99fe72ac
  • https://velog.io/@mm723/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%8A%A4%EB%A0%88%EB%93%9C
  • https://yanghs6.github.io/posts/1004_process_thread/

태그: ,

카테고리:

업데이트:

댓글남기기