[OS] Thread
▶ 스레드
- 스레드(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)은 사용자 스레드 라이브러리와 커널 스레드 간의 통신 방법이다.
- 커널은 응용에 가상 처리기(LWP)의 집합을 제공
- 응용은 사용자 스레드를 가상 처리기에 스케줄링
- 커널은 특정 이벤트가 발생할 때 응용에게 알림 -> 이때 사용되는 프로시저 "업콜(upcall)“
- 업콜은 스레드 라이브러리의 업콜 처리기에 의해 처리되며, 해당 처리기는 가상 처리기에서 실행
▶ 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 라이브러리는 유저 스레드와 커널 스레드 모두 지원한다.
- POSIX 운영체제에서 사용되는 라이브러리이다.
- 명세(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/
댓글남기기