๐ Hardware thread
์ฝ์ด(core)์ ๊ณ ๋ฏผ: ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด ๊ฝค ์ค๋ ๊ฑธ๋ฆฐ๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํํ๋๊ฑด ์ด๋จ๊น?
core: compute → memory → compute → memory
๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋๋ง๋ค core๋ ์ฌ๊ฒ ๋จ.
ํ๋์ core: compute → memory → compute → memory
memory → compute → memory → compute
๊ฐ๊ฐ์ ํ๋์จ์ด ์ค๋ ๋๋ผ๊ณ ์นญํจ.
์ธํ ์ hyper-threading
: ๋ฌผ๋ฆฌ์ ์ธ ์ฝ์ด๋ง๋ค ํ๋์จ์ด ์ค๋ ๋๊ฐ ๋ ๊ฐ
Hardware thread
: OS ๊ด์ ์์๋ ๊ฐ์์(logical) ์ฝ์ด
๋ง์ฝ์ ์ฑ๊ธ ์ฝ์ด CPU์ ํ๋์จ์ด ์ค๋ ๋๊ฐ ๋ ๊ฐ๋ผ๋ฉด OS๋ ์ด CPU๋ฅผ ๋์ผ ์ฝ์ด๋ก ์ธ์ํ๊ณ ๋์ผ ์ฝ์ด์ ๋ง์ถฐ์ OS ๋ ๋ฒจ์ ์ค๋ ๋๋ค์ ์ค์ผ์ค๋ง ํ๋ค.
Q. ์ธํ ๋์ผ ์ฝ์ด CPU์ hyper-threading์ด ์ ์ฉ๋๋ค๋ฉด ํ๋์จ์ด ์ค๋ ๋๋ ์ด ๋ช ๊ฐ ์ธ๊ฐ์?
4๊ฐ. OS๋ CPU๋ฅผ 4์ฝ์ด๋ก ์ธ์ํจ.
์ปค๋(kernel)
: ์ด์์ฒด์ ์ ํต์ฌ
: ์์คํ ์ ์ ๋ฐ์ ๊ด๋ฆฌ/๊ฐ๋ ํ๋ ์ญํ
: ํ๋์จ์ด์ ๊ด๋ จ๋ ์์ ์ ์ง์ ์ํ
๐ OS Thread
: OS ์ปค๋ ๋ ๋ฒจ์์ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ์ค๋ ๋
: CPU์์ ์ค์ ๋ก ์คํ๋๋ ๋จ์, CPU ์ค์ผ์ค๋ง์ ๋จ์
: OS ์ค๋ ๋์ ์ปจํ ์คํธ ์ค์์นญ์ ์ปค๋์ด ๊ฐ์ → ๋น์ฉ ๋ฐ์
: ์ฌ์ฉ์ ์ฝ๋์ ์ปค๋ ์ฝ๋ ๋ชจ๋ OS ์ค๋ ๋์์ ์คํ๋๋ค
OS ์ค๋ ๋๋ ์๋์ ๊ฐ์ด ๋ถ๋ฆฌ๊ธฐ๋ ํจ.
- ๋ค์ดํฐ๋ธ ์ค๋ ๋, ์ปค๋ ์ค๋ ๋*, ์ปค๋-๋ ๋ฒจ ์ค๋ ๋, OS-๋ ๋ฒจ ์ค๋ ๋
Q. OS ์ค๋ ๋ ์ฌ๋ ๊ฐ๊ฐ ํ์ดํผ ์ค๋ ๋ฉ์ด ์ ์ฉ๋ ์ธํ ๋์ผ์ฝ์ด ์์์ ๋์ํ๋ค๋ฉด OS ์ค๋ ๋๋ค์ ์ด๋ป๊ฒ ์ฝ์ด์ ๊ท ๋ฑํ๊ฒ ํ ๋นํ ์ ์์๊น์?
๋ค๋ฅธ ๋งฅ๋ฝ์์ Kernel Thread
: OS ์ปค๋์ ์ญํ ์ ์ํํ๋ ์ค๋ ๋.
์ฆ, ์ปค๋ ์ฝ๋๋ฅผ ์ํํ๋ ์ค๋ ๋๋ฅผ ์ปค๋ ์ค๋ ๋๋ผ๊ณ ํ๊ธฐ๋ ํจ.
๐ User Thread
: ์ค๋ ๋ ๊ฐ๋ ์ ํ๋ก๊ทธ๋๋ฐ ๋ ๋ฒจ์์ ์ถ์ํ ํ๋ ๊ฒ
์ ์ -๋ ๋ฒจ ์ค๋ ๋๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํจ.
Thread thread = new Thread();
thread.start(); // OS ์์คํ ์ฝ ํธ์ถํจ์ผ๋ก์จ OS ๋ ๋ฒจ์ ์ค๋ ๋ ์์ฑ
์ ์ ์ค๋ ๋๊ฐ CPU์์ ์คํ๋๋ ค๋ฉด OS ์ค๋ ๋์ ๋ฐ๋์ ์ฐ๊ฒฐ๋ผ์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ ์ค๋ ๋์ OS ์ค๋ ๋๋ฅผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ์ํฌ ๊ฒ์ธ๊ฐ?
1. One-to-One model (์๋ฐ๊ฐ ์ฑํ)
์ ์ ์ค๋ ๋์ OS ๋ ๋ฒจ์ ์ค๋ ๋๊ฐ ์ผ๋์ผ๋ก ์ฐ๊ฒฐ๋จ.
์ค๋ ๋ ๊ด๋ฆฌ๋ฅผ OS์ ์์, ์ค์ผ์ค๋ง๋ ์ปค๋์ด ์ํ.
์ ์ ์ค๋ ๋๊ฐ ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์ ์ ํ์ฉํ ์ ์์.
ํ ์ค๋ ๋๊ฐ ๋ธ๋ฝ ์ํ์ฌ๋ ๋ค๋ฅธ ์ค๋ ๋๋ ์ ๋์ํจ.
์ผ๋์ผ ๋งคํ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ race condition์ด ๋ฐ์ํ ์ ์์.
2. Many-to-One model
์ ์ ์ค๋ ๋ ์ฌ๋ฌ๊ฐ์ OS ๋ ๋ฒจ์ ์ค๋ ๋ ํ๋์ ์ฐ๊ฒฐ๋จ.
์ปจํ ์คํธ ์ค์์นญ์ด ์ ์ ๋ ๋ฒจ์์๋ง ์ด๋ฃจ์ด์ง๊ณ ์ปค๋์ด ๊ฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ ๋น ๋ฆ.
์ ์ ์ค๋ ๋ ๊ฐ์ ์ค์์นญ์ด one-to-one ๋ชจ๋ธ๋ณด๋ค ๋น ๋ฆ.
OS ๋ ๋ฒจ์์ race condition ๊ฐ๋ฅ์ฑ์ด ์ ๋ค.
OS ์ค๋ ๋ ํ๋์ด๋ฏ๋ก ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์ ํ์ฉํ ์ ์์.
ํ ์ค๋ ๋๊ฐ ๋ธ๋ฝ → ๋ชจ๋ ์ค๋ ๋๋ค์ด ๋ธ๋ฝ => ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด non block I/O ์ฌ์ฉํจ.
3. Many-to-Many model
์ ์ ์ค๋ ๋๋ค์ด ์ ์ ํ ๊ฐ์์ OS ์ค๋ ๋์ ์ฐ๊ฒฐ๋จ.
์ ์ ์ค๋ ๋๊ฐ์ ์ค์์นญ์ด ๋น ๋ฅด๋ฉด์ ๋ฉํฐ ์ฝ์ด๋ฅผ ํ์ฉ,
ํ๋๋ฅผ ๋ธ๋ญํด๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ธ๋ญ ๋์ง ์์.
๊ตฌํ์ด ์ด๋ ต๋ค๋ ๋จ์ .
๋ค๋ฅธ ์๋ฏธ์ User Thread
OS์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ ๋ ๋ฒจ์์ ์ค์ผ์ค๋ง๋๋ ์ค๋ ๋๋ฅผ ์ ์ ์ค๋ ๋๋ผ๊ณ ํ๊ธฐ๋ ํจ.
๐ Green Thread
Java ์ด์ฐฝ๊ธฐ ๋ฒ์ ์ Many-to-One ์ค๋ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉ. ์ด ๋ ์ด ์ ์ ์ค๋ ๋๋ค์ ๊ทธ๋ฆฐ ์ค๋ ๋๋ผ๊ณ ์นญํจ.
OS์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ ๋ ๋ฒจ์์ ์ค์ผ์ค๋ง๋๋ ์ค๋ ๋.
๋งฅ๋ฝ์ ๋ฐ๋ผ ์ ์ ์ค๋ ๋ = ๊ทธ๋ฆฐ ์ค๋ ๋.
๐ ์ค๋ ๋ ํ
API ์์ฒญ ๋ฐฉ์ ์ค Thread per request model์ด ์์.
: request๋ง๋ค thread๋ฅผ ํ๋์ฉ ํ ๋นํด์ ํ๋์ request๋ฅผ ํ๋์ thread๊ฐ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ.
๋ง์ฝ thread per request ๋ชจ๋ธ์ ๋์ ๋ฐฉ์์ด
์๋ฒ์ ๋ค์ด์ค๋ ์์ฒญ๋ง๋ค ์ค๋ ๋๋ฅผ ์๋ก ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ๊ฐ ๋๋ ์ค๋ ๋๋ ๋ฒ๋ฆฌ๋ ์์ผ๋ก ๋์
ํ๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฐ??
• ์ค๋ ๋ ์์ฑ์ ์์๋๋ ์๊ฐ ๋๋ฌธ์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๋ ์ค๋ ๊ฑธ๋ฆผ.
• ์ฒ๋ฆฌ ์๋๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ์์ฒญ์ด ๋์ด๋๋ฉด
→ ์ค๋ ๋๊ฐ ๊ณ์ ์์ฑ(์ค๋ ๋ ์ ์ฆ๊ฐ)
→ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ ์์ฃผ ๋ฐ์
→ CPU ์ค๋ฒํค๋ ์ฆ๊ฐ๋ก CPU time ๋ญ๋น→
→ ์๋ฒ ์ ์ฒด๊ฐ ์๋ต ๋ถ๊ฐ๋ฅ ์ํ์ ๋น ์ง
• ์ฒ๋ฆฌ ์๋๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ์์ฒญ์ด ๋์ด๋๋ฉด
→ ์ค๋ ๋๊ฐ ๊ณ์ ์์ฑ(์ค๋ ๋ ์ ์ฆ๊ฐ)
→ ๋ฉ๋ชจ๋ฆฌ ๊ณ ๊ฐ
๋ฏธ๋ฆฌ ์ค๋ ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ๋๊ณ ์ฌ์ฌ์ฉ → ์ค๋ ๋ ์์ฑ ์๊ฐ ์ ์ฝ
์ ํ๋ ๊ฐ์์ ์ค๋ ๋๋ฅผ ์ด์ฉ → ์ค๋ ๋๊ฐ ๋ฌด์ ํ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์ง
Thread pool ์ฌ๋ก: ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํด์ผ ํ ๋
• thread per request ๋ชจ๋ธ
• task๋ฅผ subtask๋ก ๋๋์ด์ ๋์์ ์ฒ๋ฆฌ
• ์์ ์๊ด์์ด ๋์ ์คํ์ด ๊ฐ๋ฅํ task ์ฒ๋ฆฌ
Thread pool ์ฌ์ฉ ํ
1. ์ค๋ ๋ ํ์ ๋ช ๊ฐ์ ์ค๋ ๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ ์ ํ๊ฐ?
CPU ์ฝ์ด ๊ฐ์์ task์ ์ฑํฅ์ ๋ฐ๋ผ ๋ค๋ฆ.
CPU-bound task๋ผ๋ฉด ์ฝ์ด ๊ฐ์ ๋งํผ ํน์ ๋ช ๊ฐ ๋ ๋ง์ ์ ๋
I/O-bound task๋ผ๋ฉด ์ฝ์ด ๊ฐ์๋ณด๋ค 1.5๋ฐฐ? ๋ ๋ฐฐ? ์ธ ๋ฐฐ? ๊ฒฝํ์ ์ผ๋ก ์ฐพ์์ผ ํจ.
2. ์ค๋ ๋ ํ์์ ์คํ๋ task ๊ฐ์์ ์ ํ์ด ์๋ค๋ฉด
์ค๋ ๋ ํ์ ํ์ ์ฌ์ด์ฆ ์ ํ์ ํ์ธํ ๊ฒ!
์๋ฐ์ Executors ํด๋์ค
static ๋ฉ์๋๋ก ๋ค์ํ ํํ์ ์ค๋ ๋ ํ์ ์ ๊ณต
ExecuterService threadPool = Executors.newFixedThreadPool(10);
threadPool.submit(task1);
threadPool.submit(task2);
=> Queue size์ int max_val์ด ๋ค์ด๊ฐ์ผ๋ฏ๋ก ์ค๋ ๋ ํ์ ์์ฒญ์ด ๋ง์์ง๋ฉด ํ์ ๊ณ์ ์์ผ ์ ์๋ ์ํ ์์ธ์ด ์๋ค.
์ฌ์ด์ฆ ์ ํ์ด ์๋ ํ๋ ์ํฉ์ ๋ฐ๋ผ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐ์ํค๋ ์ ์ฌ์ ์ํ ์์ธ์ด ๋ ์ ์๋ค.
ํ๊ฐ ๋ค ์ฐจ๋ฉด ์ดํ์ ์์ฒญ์ ๋ฒ๋ฆฌ๋๋ผ๋ ์ ์ฒด ์์คํ ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํด์ผ ํจ.
pool์ด๋ผ๋ ๊ฐ๋ ์ด ์ค๋ ๋์๋ง ์ฐ์ด๋ ๊ฒ์ ์๋.
connection pool, process pool, ...
CPU bound ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ ๋๋ process pool์ ์ฌ์ฉํด์ผ ํ๋ค.
'CS > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋งฅ๋ฝ์ ๋ฐ๋ฅธ ๋น๋๊ธฐ asynchronous (0) | 2024.02.16 |
---|---|
block I/O vs non-block I/O (0) | 2024.02.15 |
์ธํฐ๋ฝํธ์ ์์คํ ์ฝ (0) | 2024.02.12 |
CPU ์ค์ผ์ค๋ฌ (0) | 2024.02.12 |
OS์์ ํ๋ก์ธ์ค ์ํ (0) | 2024.02.10 |