[OS] Operating System(4-2): Thread Pool
๐ ์ด์์ฒด์ ์ ๊ณต ์์ ์ ๋ฆฌ
Implicit Threading
์ต๊ทผ ์ค๋ ๋ ๊ฐ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ ๋ณด์ฅ์ด ์ด๋ ค์์ง ์ด๋ฐ ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํด complier์ run-time library๊ฐ ์ค๋ ๋์ ์์ฑ๊ณผ ๊ด๋ฆฌ๋ฅผ ๋ด๋น
๊ฐ๋ฐ์๋ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์๋ task๋ฅผ ์ง์ ๋ง ํ๋ฉด ๋จ
- Thread Pools: ์ฐ๋ ๋์ ์๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด๋๊ณ ์์ ์ ํ ๋น
- Fork-Join: ์์ ์ ์ฌ๋ฌ ๊ฐ๋ก ๋๋๊ณ (fork), ๋ค ๋๋๋ฉด ๋ค์ ํฉ์นจ (join)
- OpenMP: C/C++์์
#pragma
๋ก ๋ณ๋ ฌ ์ฝ๋ ์ฝ๊ฒ ์์ฑ - Grand entral Dispatch: ์ ํ์์ ๋ง๋ ์ค๋ ๋ ํ ๊ธฐ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ๋ ์์ํฌ
- Intel Threading Building Blocks: C++ ํ ํ๋ฆฟ ๊ธฐ๋ฐ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Thread Pools
๐Thread Pools: ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฌ๋ฌ ๊ฐ์ thread๋ฅผ pool
์ด๋ผ๋ ๊ณต๊ฐ์ ๋๊ธฐ์์ผ ๋๊ณ , ํ์ํ ๋๋ง๋ค ์ด pool์์ thread๋ฅผ ๊ฐ์ ธ์ ์์
์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
โ Thread Pools์ ์ฅ์
- ์๋ ํฅ์: ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์ด๋ฏธ ์กด์ฌํ๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฝ๊ฐ ๋ ๋น ์ผ
- ์ค๋ ๋ ์ ์ ํ: ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ thread์ ์๋ฅผ pool ํฌ๊ธฐ๋ก ์ ํ ๊ฐ๋ฅ โ ์์คํ ์์์ ๊ณผ๋ํ ์ฌ์ฉ์ ๋ฐฉ์ง
- ์์
๊ณผ ๋ฉ์ปค๋์ฆ ๋ถ๋ฆฌ: task๋ฅผ ์ํํ๋ ๊ฒ๊ณผ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๋ฉ์ปค๋์ฆ์ ๋ถ๋ฆฌํจ โ ๋ค์ํ ์ ๋ต์ผ๋ก ์์
์ ์คํ ๊ฐ๋ฅ
- ์: ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋๋ก ์ค์ผ์ค๋ง
- Windows API์์์ ์ค๋ ๋ ํ ์ง์ ```c DWORD WINAPI PoolFunction(AVOID Param) { /*
- this function runs as a separate thread. */ } ```
QueueUserWorkItem()
ํจ์๋ฅผ ํตํด pool์ ์๋ ์ค๋ ๋๊ฐ PoolFunction์ ์คํํ๊ฒ ํจ
- Thread Pools์ ์๋๋ฐฉ์:
- ํ์ ์๋ ์ค๋ ๋๋ค์ ์์ ์ด ํ ๋น๋ ๋๊น์ง ๋๊ธฐ ์ํ
- ์์ ์ด ์์ฒญ๋๋ฉด ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๋ ๋๊ฐ ํด๋น ์์ ์ ์ํ
- ์์ ์ด ์๋ฃ๋๋ฉด ์ค๋ ๋๋ ๋ค์ ํ๋ก ๋์๊ฐ์ ๋ค์ ์์ ์ ๋๊ธฐ
โThread pool์ Sleeping Barber Problem
:
- ์ด๋ฐ์ฌ(์ค๋ ๋)๊ฐ ๊ณ ๊ฐ์ด ์์ ๋๋ ์ ์ ์๊ณ (๋๊ธฐ ์ํ), ๊ณ ๊ฐ์ด ์ค๋ฉด ๊นจ์ด๋ ์๋น์ค๋ฅผ ์ ๊ณต
- ๋๊ธฐ์ค์ ์ ํ๋ ์์ ์์(ํ ํฌ๊ธฐ)๊ฐ ์์ด, ๊ณ ๊ฐ(์์ )์ด ๋ ์ด์ ๋ค์ด์ฌ ์ ์์ผ๋ฉด ๋ ๋๋ค
- ์ค๋ ๋ ํ ์ญ์ ์ด์ ์ ์ฌํ๊ฒ ์ ํ๋ ์์ ์ค๋ ๋๊ฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์์ ์ด ๋ค์ด์ค๋ฉด ์ฒ๋ฆฌ
Fork-join
๐ Fork-Join Parallelism: ํ๋์ ๋ฉ์ธ ์ค๋ ๋์์ **์ฌ๋ฌ ๊ฐ์ ์์
์ค๋ ๋๋ฅผ ์์ฑ**(`fork`), ๋ชจ๋ ์์
์ด ์๋ฃ๋๋ฉด ๋ค์ ํ๋์ ์ค๋ ๋๋ก ํฉ์น๋(join
) ๋ฐฉ์
Multiple threads (tasks) are forked, and then joined
- ์๋ ๋ฐฉ์:
Fork
: ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ ์์ ์ค๋ ๋๋ฅผ ์์ฑ๋ณ๋ ฌ ์คํ
: ์์ฑ๋ ์์ ์ค๋ ๋๋ค์ด ๋์์(๋ณ๋ ฌ๋ก) ์คํJoin
: ๋ชจ๋ ์์ ์ค๋ ๋๊ฐ ์๋ฃ๋๋ฉด ๋ฉ์ธ ์ค๋ ๋๋ก ๋ค์ ๋ณํฉ
Fork-Join์ ์ฌ๊ท์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค!
merge_sort์ ๊ณผ์ ๊ณผ ํก์ฌํจ
- ํ๋์ ์์ ์์ ์ฌ๋ฌ ๊ฐ์ ์๋ธ์์ ์ ํฌํฌ ๊ฐ๋ฅ
- ๊ฐ ์๋ธ์์ ์ ๋ ๋ค๋ฅธ ์๋ธ์์ ๋ค์ ํฌํฌ ๊ฐ๋ฅ
- ๋ชจ๋ ์๋ธ์์ ์ด ์๋ฃ๋๋ฉด ์์ ์์ ์ผ๋ก ์กฐ์ธ
OpenMP
OpenMP: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ํ API OpenMP๋ ์ปดํ์ผ๋ฌ ์ง์๋ฌธ์ผ๋ก ์คํํ๋ค.
#pragma omp parallel
์ ์ฐ๊ณ ์ค๊ดํธ ์ฌ์ด์ ์ฝ๋๋ฅผ ์ฝ์ด์ ์๋งํผ ์ค๋ณตํด์ ์คํํ ๋ค ์ข
๋ฃํ๊ณ join
์ ํจ
1
2
3
4
#pragma omp parallel
{
printf("[T%d] Hello, world!\n", id);
}
for loop ์ํฉ๋ ๊ฐ๋ฅํจ
1
2
3
4
5
6
// ์ฝ์ด์ ์๋งํผ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ N๊ฐ์ iteration์ ์ค๋ ๋์ ๋ถํ ๋งคํ
// ๋ง์ฝ ์ฝ์ด์ ์๊ฐ 10๊ฐ๋ฉด 3,3,2,2 ์์ผ๋ก ๋งคํํ๋ค
#pragma omp parallel for
for (i=0; i<N; i++){
c[i] = a[i] + b[i]
}
์ด ์์ ์์๋ data์ ์ข ์์ฑ์ด ์์ด์ ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅ ์ข ์์ฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ฃผ์ํด์ผ ํจ ์ค๋ ๋์ ์๋ฅผ ์ง์ ํ ์ ์์
num_threads(N)
๋งคํ ์์์ ๋ณํ๋ฅผ ์ค ์ ์์schedule(dynamic)
Grand Central Dispatch(GCD)
Apple์ด ๊ฐ๋ฐํ thread pool, macOS/iOS์์ ์ฌ์ฉ๋จ
- task๋ฅผ queue์ ์ ์ถํ๋ฉด ์์คํ ์ด ์ค๋ ๋ ๊ด๋ฆฌ์ ์ค์ผ์ค๋ง์ ๋ด๋น
โ ์ฃผ์ ํน์ง:
ํ์ฅ์ฑ
: C, C++, Objective-C ์ธ์ด, API ๋ฐ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ์ฅ๋ณ๋ ฌ ์น์ ์๋ณ
: ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋์ง ์ง์ ํ ์ ์๋ค์ค๋ ๋ฉ ์ธ๋ถ์ฌํญ ๊ด๋ฆฌ
: GCD๋ ์ค๋ ๋ฉ์ ๋๋ถ๋ถ์ ์ธ๋ถ์ฌํญ์ ๊ด๋ฆฌํด์ฃผ์ด ๊ฐ๋ฐ์๊ฐ ์ ์์ค ์ค๋ ๋ ๊ด๋ฆฌ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ก ํ๋ค.- ์๋ ๋ฐฉ์:
- Block ์ ์: ์์ ์ ๋ธ๋ก์ผ๋ก ์ ์
1
^{ printf("I am a block"); }
- ์ ์๋ ๋ธ๋ก์
Dispatch Queue
์ ๋ฐฐ์น - ๋ธ๋ก์ด ํ์์ ์ ๊ฑฐ๋ ๋ ์ค๋ ๋ ํ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๋ ๋์ ํ ๋น๋จ
โ Dispatch์ ๋ ๊ฐ์ง ์ ํ
- Serial Queue:
- ๋ธ๋ก์ด
FIFO
์์๋ก ํ๋์ฉ ์ ๊ฑฐ๋จ - ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ํ๋์ ๋ฉ์ธ ํ(main queue)๊ฐ ์์
- ๋ธ๋ก์ด
- Concurrent Queue:
- ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ํ๋์
main queue
๊ฐ ์์ - ์๋น์ค ํ์ง(QoS)์ ๋ฐ๋ผ ๊ตฌ๋ถ๋ 4๊ฐ์ง ์์คํ ์ ์ญ ํ:
QOS_CLASS_USER_INTERACTIVE
: ์ ์ํ ์๋ต์ด ์๊ตฌ๋ ๋ (UI ๊ด๋ จ)QOS_CLASS_USER_INITIATED
: ์ ๋นํ ์๊ฐ์ ์๋ต์ด ์๊ตฌ๋ ๋QOS_CLASS_USER_UTILITY
: ๊ธด ์๊ฐ์ด ์๊ตฌ๋ ๋QOS_CLASS_USER_BACKGROUND
: ์๊ฐ์ ๊ด๊ณ์๋ ์์ ์ผ ๋
- ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ํ๋์
Intel Threading Building Blocks (TBB)
๐Intel TBB: Template library for designing parallel C++ programs
TBB๋ ๊ธฐ์กด ์์ฐจ์ ์ฝ๋๋ฅผ ๋ณ๋ ฌ ์ฝ๋๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๊ฒ ํด์ค๋ค:
- ์์ฐจ์ for ๋ฃจํ:
1
2
3
for (int i = 0; i < n; i++) {
apply(v[i]);
}
- TBB๋ฅผ ์ด์ฉํ ๋ณ๋ ฌ for ๋ฃจํ:
1
parallel_for (size_t(0), n, [=](size_t i) {apply(v[i]);});
Threading Issues
- Semantics of
fork()
andexec()
system calls - Signal handling
- Synchronous(๋ด๋ถ์์๋ฐ์) and asynchronous(์ธ๋ถ์์๋ฐ์)
- Thread cancellation of target thread
- Asynchronous(์ธ๋ถ์ ์ํด ์บ์ฌ) or deferred(์ค๋ฌด์คํ๊ฒ ์บ์ฌ)
- Thread-local storage
Semantics of fork() and exec() system calls
ํ ๊ฐ์ ์ค๋ ๋์ธ ๊ฒฝ์ฐ๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ fork()
ํด์ผํ๋๊ฐ? โ ๋๋ถ๋ถ main thread ํ ๊ฐ๋ง fork()
ํจ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ฅผ ๋ค ๋ณต์ ํ๋๋ ๋ฎ์ด์์ฐ๋ฉด ๋ญ๋น์ด๋ fork()
ํ exec()
๋ฐฉ์์ ์ฌ์ฉ
โโDont use both threads and forksโ
Signal handling
๐ Signal: โํ๋ก์ธ์คโ์๊ฒ ์ ํธ๋ฅผ ์ ๋ฌํ๋ ํ์, ์ค๋ ๋ํํ ๋ ์ ๋ฌํ ์๋ ์์
- ๋ฐ์ ์์ธ:
- ๋ด๋ถ ๋ฐ์: ๋ถ๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ, 0์ผ๋ก ๋๋๊ธฐ ๋ฑ
- ์ธ๋ถ ๋ฐ์: Ctrl+C, ํ์ด๋จธ ๋ฑ
- ์ด๋ค ์๊ทธ๋์ ํน์ ์ค๋ ๋์๊ฒ ๋ณด๋๋๋ฐ ํน์ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ๊ทธ ์ค๋ ๋๋ง ์ฃฝ๋๊ฒ ์๋๋ผ ํ๋ก์ธ์ค ์ ์ฒด๊ฐ ๋ค ์ฃฝ์
โ ์๊ทธ๋ ์ฒ๋ฆฌ ๋ฐฉ์:
- ์๊ทธ๋์ ํน์ ์ด๋ฒคํธ์ ์ํด ๋ฐ์ํ ์ ์์(์:ctrl+c)
- ํ๋ก์ธ์ค์ ์ ๋ฌ๋จ(์ค๋ ๋์๊ฒ๋ง๋ ์ ๋ฌ๋ ์ ์์ง๋ง ์ํํจ. ๊ทธ๋์ ํ๋ก์ธ์ค์ ์ ์ฒด ์ค๋ ๋์๊ฒ ์ ๋ฌ)
- ์๊ทธ๋์ ๋๊ฐ ์ค ํ๋
- ๊ธฐ๋ณธ ํธ๋ค๋ฌ(default): ์ปค๋์ด ์๊ทธ๋ ์ฒ๋ฆฌ ์ ์คํ
- ์ฌ์ฉ์ ์ ์ ํธ๋ค๋ฌ(user-defined): ๊ธฐ๋ณธ ํธ๋ค๋ฌ๋ฅผ ์ค๋ฒ๋ผ์ด๋
์๊ทธ๋์ ๊ธฐ๋ณธ ํ์๋ ์ฃฝ๋๊ฑด๋ฐ(์ปค๋ ์ฒ๋ฆฌ), ์ฌ์ฉ์๊ฐ ์ฃฝ๋๊ฒ ์ซ์ผ๋ฉด ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ
- ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ์๊ทธ๋์ ์ด๋ค ์ค๋ ๋๋ก ์ ๋ฌํ ์ง๋ ์ค์ํ ๋ฌธ์ !
- ์ ์ฉ๋๋ ์ค๋ ๋์๋ง ์ ๋ฌ:
divide by zero
๊ฐ์ ์ํฉ์ด ๋ฐ์ํ์ ๋ - ๋ชจ๋ ์ค๋ ๋์ ์ ๋ฌ: (์: ctrl+c)/ํ์ง๋ง ๋๋ถ๋ถ ์ค๋ณต๋ ์๊ทธ๋์ ์ฒซ๋ฒ์งธ ๊ฒ๋ง ์์ฉํ๊ณ ๋๋จธ์ง ๋ฌด์
- ํน์ ํ ์ค๋ ๋์๋ง ์ ๋ฌ
- ํน์ ์ค๋ ๋๊ฐ ๋ชจ๋ ์๊ทธ๋ ์ฒ๋ฆฌ: ํ ์ค๋ ๋๊ฐ ๋ชจ๋ ์๊ทธ๋์ ๋ฐ๋๋ก ์ง์
- ์ ์ฉ๋๋ ์ค๋ ๋์๋ง ์ ๋ฌ:
signal์ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ฐ๋ผ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค:
- Synchronous ์๊ทธ๋: ํ๋ก๊ทธ๋จ ์คํ ์ค ์ฝ๋์ ์ํด ์ง์ ๋ฐ์ํ๋ ์๊ทธ๋(์: ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ, 0์ผ๋ก ๋๋๊ธฐ)
- Asynchronous ์๊ทธ๋: ํ๋ก๊ทธ๋จ ์ธ๋ถ์์ ๋ฐ์ํ๋ ์๊ทธ๋(์: Ctrl+C, ํ์ด๋จธ)
1
2
kill(pid_t pid, int signal); // ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ด๋ ํจ์
pthread_kill(pthread_t tid, int signal)// ์ค๋ ๋๋ฅผ ์ฃฝ์ด๋ ํจ์
- ๋๋ถ๋ถ์ Unix๊ณ์ด์ OS์์๋ ์ค๋ ๋๋ง๋ค ๋ฐ๋ ๋๋ ๊ฑฐ๋ถํ๋ signal์ ์ค์ ํ ์ ์์.
- ๋ฐ๋ผ์ ๋ค์ค์ค๋ ๋์ธ ๊ฒฝ์ฐ signal์ ํ์ฉํ๋ ์ฒซ๋ฒ์งธ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํจ
Thread cancellation of target thread
์ค๋ ๋๊ฐ ๋๋๊ธฐ ์ ์ ์ข ๋ฃํ๋ ํ์
Target thread
: ์ทจ์๋ ์ค๋ ๋- ์ทจ์ ๋ฐฉ์:
- ๋น๋๊ธฐ์ ์ทจ์(Asynchronous Cancellation): ์ฆ๊ฐ์ ์ผ๋ก ํ๊ฒ ์ค๋ ๋๋ฅผ ์ข ๋ฃ โ ํ ๋น๋ ์์์ ๋ชจ๋ freeํ์ง ๋ชปํ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์์
- ์ง์ฐ ์ทจ์(Deferred Cancellation): ์ข
๋ฃํ ํ๊ฒ ์ค๋ ๋๋ฅผ periodcally checkํ๊ณ ์์
- Cancellation point์์ ์ค๋ ๋๋ฅผ ์บ์ฌํจ.
- ์ผ๋ฐ์ ์ผ๋ก
read()
์ ๊ฐ์ blocking system call์ด cancellation point๊ฐ ๋จ
1
2
3
4
5
6
7
8
9
10
pthread_t tid;
/* ์ค๋ ๋ ์์ฑ */
pthread_create(&tid, 0, worker, NULL);
/* ์ค๋ ๋ ์ทจ์ */
pthread_cancel(tid);
/* ์ค๋ ๋ ์ข
๋ฃ ๋๊ธฐ */
pthread_join(tid, NULL);
์ค๋ ๋ ์ทจ์ ์์ฒญ์ ๋ณด๋ด๋ ์ค์ ์ทจ์๋ ์ค๋ ๋์ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ์ง๋ค:
์ค๋ ๋๊ฐ ์ทจ์ ๊ธฐ๋ฅ์ ๋นํ์ฑํํ ๊ฒฝ์ฐ, ์ทจ์ ์์ฒญ์ ์ค๋ ๋๊ฐ ํ์ฑํํ ๋๊น์ง ๋๊ธฐ ์ํ๋ก ์ ์ง
๊ธฐ๋ณธ ์ทจ์ ์ ํ์ ์ง์ฐ ์ทจ์(Deferred)
- ์ง์ฐ ์ทจ์(Deferred Cancellation)์์๋ ์ค๋ ๋๊ฐ โ์ทจ์ ์ง์ โ์ ๋๋ฌํ์ ๋๋ง ์ทจ์๋๋ค
pthread_testcancel()
ํจ์ ํธ์ถ ์read()
์ ๊ฐ์ ๋ธ๋กํน ์์คํ ์ฝ์ด ์ทจ์ ์ง์ ์ด ๋ ์ ์์ ์ทจ์๊ฐ ์ฑ๊ณตํ๋ฉด ์ ๋ฆฌ ํธ๋ค๋ฌ(cleanup handler)๊ฐ ํธ์ถ๋จ
๋ง์ฝ ์บ์ฌํ ์ค๋ ๋๊ฐ cancellation point๋ก ์๊ฐ๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ?
โ ์ทจ์ ํ๋๊ทธ๋ ์ค์ ๋์ง๋ง ์ค์ ์ทจ์๋ ์ผ์ด๋์ง ์๋๋ค. ์ฆ, ์ค๋ ๋๊ฐ ํ์ฑํ ๋ ๊น์ง ๋๊ธฐ ์ํ
Thread-local storage(TLS)
์ค๋ ๋๋ ์์์ ๊ณต์ ํ์ง๋ง(์ ์ญ๋ณ์: ๋ณ๊ฒฝ ์ ๋ชจ๋ ์ค๋ ๋์ ์ ์ฉ) โ ์ง์ญ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ์์(thread pool
์ ๊ฒฝ์ฐ์ ํ์ํจ) โ ์ค๋ ๋ pool์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๋ ์ค๋ ๋ ์์ฑ์ ๊ด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ TLS๊ฐ ์ ์ฉ
๐TLS(Thread-local storage): ๊ฐ ์ค๋ ๋๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ ๊ฐ์ง ์ ์๋ ์ ์ฅ ๊ณต๊ฐ
์ง์ญ ๋ณ์์ TLS ๋ณ์๋ ๋ค๋ฆ!
- ์ง์ญ ๋ณ์(Local Variables): ๋จ์ผ ํจ์ ํธ์ถ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- TLS ๋ณ์: ํจ์ ํธ์ถ ๊ฐ์๋ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ง ํด๋น ์ค๋ ๋ ๋ด์์๋ง ์ ํจ
static data
์ ํก์ฌํจ- TLS๋ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ uniqueํจ
Linux Threads
linux๋ ์ค๋ ๋ ๋ณด๋ค task๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ์ ํธ
- task ์์ฑ์
clone()
์์คํ ์ฝ์ ํตํด ์ด๋ฃจ์ด์ง๋ค clone()
: ์์ ํ์คํฌ(์ค๋ ๋)๊ฐ ๋ถ๋ชจ ํ์คํฌ(ํ๋ก์ธ์ค)์ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ ์ ์๊ฒ ํจ
clone()
ํจ์์ ๋์์ ๋ค์ํ ํ๋๊ทธ๋ก ์ ์ด ๊ฐ๋ฅ
fork()
์ clone()
์ ์ฐจ์ด์ :
fork()
: ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์ฌ(๋ณต์ฌ๋ณธ ์ฒ๋ฆฌ)clone()
: ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฆฌํด(๋งํฌ๋ก ์ฒ๋ฆฌ)fork()
์pthread_create()
๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ตญclone()
์ ํธ์ถ