일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- react server component
- Cache
- 개발자
- 비동기
- 쓰레드
- 리액트
- 기본
- 리액트네이티브
- Babel
- Critical Rendering Path
- link
- 캐쉬
- 동기
- 최적화
- SWC
- 목킹
- CSS-in-JS
- amplify
- mockoon
- next hydration
- styled-component
- 기초
- front-end mocking
- Concurrent Mode
- mock service worker
- thread
- 컴포넌트
- Basic
- react-native
- MSW
- sprinkles
- 리액트쿼리
- react-query
- 아키텍처
- 자바스크립트
- next.js
- async
- vanilla-extract
- React
- JavaScript
- Today
- Total
Don’t worry about failures
쓰레드에 대해 본문
보통 쓰레드와 프로세스와 비교를 하며 개념을 찾고, 습득을한다. 이렇기 때문에 더 헷갈리고, 광범위한 글을 보게 된다.
이를 위해 쓰레드 조금 더 초점에 맞춰서 글을 작성하고자한다.
쓰레드
쓰레드 개념 : 프로세스 내에서 실행되는 실행 흐름. 프로세스의 자원(메모리, 파일)을 공유.
이러한 쓰레드는 하나의 종류만 있지않다.
하드웨어 쓰레드, OS 쓰레드, 유저 쓰레드, 그린 쓰레드 등의 다양한 종류의 쓰레드가 존재한다.
조금 더 자세하게 봐보자.
우선 프로그램은
크게 세개의 개층으로 구분이 된다.
User program은 OS kernel을 통해 메모리, CPU, Devices 등의 하드웨어를 사용한다.
하드웨어 쓰레드
하드웨어 측면에서의 쓰레드이다. 코어는 연산작업을 하며, 메모리에서 데이터를 가져오면서 작업을 한다. 하지만, 하나의 코어가 메모리를 가져올 때 데이터를 가져오는 대기시간이 비교적 길고, 그 동안 다른 일을 하지 못한다. 이 때문에 쓰레드라는 개념을 도입하여 하나의 코어이지만 두개의 쓰레드로 나누어 하나의 쓰레드가 연산작업하며, 메모리에서 데이터를 가져올 때, 다른 쓰레드가 작업을 하며 효율을 높인다.
이와 같이 하드웨어 측면에서 효율을 높이기 위해 쓰레드 개념을 도입하였고, 이를 인텔에서 개발하였다. 이를 하이퍼 쓰레딩이라고 한다.
이를 다른 관점에서도 봐보자.
코어 관점에서 멀티 쓰레드 이지만, 그 위에 있는 계층인 OS kernel 계층에서 바라보면, 이 쓰레드는 자신을 조정하는 코어로써 보게 된다. 이 때문에 OS관점에서 볼때 이를 가상의 코어라고 보고 vCPU로 칭한다.
OS 쓰레드
OS 커널 레이어에 해당하는 쓰레드
OS 커널이란?
운영체제의 핵심이며, 시스템 전반을 관리/감독하는 역할을 한다. 또한 하드웨어와 관련된 작업을 직접 수행한다.
이와 같이 운영체제 레벨에서 생성되고 관리되는 쓰레드를 OS 쓰레드라고 한다. 이는 CPU에서 실제로 실행되는 단위이며, CPU 스케줄링의 단위이다.
CPU의 실행되는 단위인 만큼 컨텍스트 스위칭에 대한 비용이 많이 든다. 아래에서 더 설명하겠지만, 프로그램은 보통 유저모드로써 작동이되고 있다. 근데 만약 OS 쓰레드의 컨텍스트 스위칭이 일어나게 된다면, 유저모드에서 커널 모드로 전환이 되고, 이는 CPU의 리소스를 사용하여 발생하게된다. 작업이 마무리된 후 다시 유저모드로 전환하는 등 비용이 많이 들어가게 된다.
User 쓰레드
쓰레드 개념을 프로그래밍 레벨에서 추상화한 개념이다. 자바에서 Thread tread = new Thread();를 통해 쓰레드를 생성하는 것을 보면 알 수 있다. 내부적으로 보면 tread.start가 존재하고 이는 JNI라는 기술을 통해서 OS 커널에 있는 시스템콜을 호출하게 된다.
즉, 쓰레드 생성에 대한 시스템 콜을 호출하게 되면서 OS레벨에 쓰레드가 하나 생성이 된 후 유저레벨 쓰레드와 연결이 된다. (리눅스의 경우 1:1 매핑)
OS쓰레드와 User쓰레드는 매핑 관계를 갖는다. 1:1, 1:N, N:M
One-to-One 모델
특징
- OS 쓰레드와 User 쓰레드와의 1:1 매핑관계를 가진다.
- 1:1 매핑에 따라 User의 쓰레드 관리를 OS에 위임을 하게된다.
- 스케줄링 또한 커널이 진행한다.
- 이러한 구조를 가지고 있기 때문에 멀티코어에 있어서도 잘 배분이 되어 멀티코어 환경에서도 활용이 잘된다.
- 이에 따라 한 쓰레드가 블락돼도 나머지 쓰레드는 잘 동작된다.
단점 : race contition 발생
Many-to-One 모델 ( OS쓰레드가 한개 )
특징
- 컨텍스트 스위칭이 빠르다.
- OS쓰레드는 한 개이기 때문에 유저레벨 단에서만 스위칭이 발생.
- 커널이 개입을 하지 않음. ( 유저모드 → 커널 모드 → CPU 작업 → 커널 모드 → 유저모드. 이런 루트가 사라짐)
- OS측면서 봤을 때는 쓰레드가 하나이기 때문에 Race Condition이 발생하지 가능성이 더 줄어듬
- 단점
- OS쓰레드는 하나이기 때문에 멀티 코어를 활용하지못함
- OS쓰레드가 하나이기 때문에 User 쓰레드 하나에서 블락이 발생되면 OS쓰레드 또한 블락이 되기 때문에 나머지 쓰레드들도 블락이 돼버린다.
Many-to-Many 모델
위 두개의 장점을 살림.
구현은 복잡.
참고 자료:
'cs' 카테고리의 다른 글
block, non-black, sync, async에 대해 (0) | 2024.03.14 |
---|---|
멀티태스킹 멀티프로세싱.. (0) | 2024.03.13 |
CORS에 대해 (1) | 2021.06.20 |
Process & Thread (0) | 2021.06.13 |
컴파일러와 인터프리터 (0) | 2021.06.05 |