๊ธฐ์กด์ per process, pre-fork, worker ๋ค์ค ์ฒ๋ฆฌ ๋ฐฉ์
fork ๋ฐฉ์ (per process)
- ๋ค์์ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์์ process๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
- ๋ค์์ ์ฌ์ฉ์ ์์ฒญ(์์ฒญ 1, ์์ฒญ 2, ์์ฒญ 3..)์ด ๋ค์ด์ค๋ฉด ๋ถ๋ชจ process์์ ์์ process๋ฅผ fork(์์ 1, ์์ 2, ์์ 3...)ํด์ ์์ฒญ์ ์ฒ๋ฆฌ
- ์ค๋ ๋๋ณด๋ค ๋ฌด๊ฑฐ์ด ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฐจ์งํ๊ฒ ๋ ์ ์๋ค.
- ์ฌ๊ธฐ์์ ๋ฆฌ์์ค๋ ๋ฉ๋ชจ๋ฆฌ
pre-fork ๋ฐฉ์
- ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์์ ํ๋ก์ธ์ค๋ฅผ ์ผ์ ๋ ๋ฏธ๋ฆฌ forkํ๋ ๋ฐฉ์
- ํ๋์ ์์ ํ๋ก์ธ์ค๋ ํ๋์ ์ค๋ ๋๋ฅผ ๊ฐ์ง
- ์ค๋ ๋ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ์ ํ๋ฏ๋ก ๋
๋ฆฝ์ ์ด๊ณ ์์ ์
- ์ผ๋ฐ์ ์ผ๋ก Single CPU, Dual CPU์์ ์ฑ๋ฅ์ด ์ข๋ค.
- ์์ ํ๋ก์ธ์ค๋ ์ต๋ 1024๊ฐ๊น์ง ๊ฐ๋ฅ
worker ๋ฐฉ์
- worker๋ "์ผ์ ํ๋ ์ฌ๋", "์์
์"๋ฅผ ์๋ฏธ
- master-slave, primary-secondary(replica) ์ฒ๋ผ master-worker์ ๊ด๊ณ
- ์์ปค ์ค๋ ๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ผ๊ณ ๋ ๋ถ๋ฆ
- Worker thread๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ณด์ ํ๊ณ ์๋ ์ฅ์๋ฅผ Thread Pool์ด๋ผ๊ณ ๋ถ๋ฆ
- ํ๋ก์ธ์ค ๋น ์ค๋ ๋ ์ฐ๊ฒฐ์ด ์ฌ๋ฌ ๊ฐ์ธ ๋ฐฉ์
- ์ค๋ ๋๋ผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํจ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํจ์จ์
- ํต์ ์ด ๋ง์ ์๋ฒ์ ์ ์
- ๋ฆฌ์์ค ์ค์ผ(๊ฒฝํฉ)์ ์ฃผ์ ํ์
์น ์๋น์ค ์์ฒญ ์ฒ๋ฆฌ ๊ณผ์
์น ์๋น์ค ์๋ฒ์ ๋๋ถ๋ถ์ ์์
์ ์ฝ๊ธฐ/์ฐ๊ธฐ(I/O) ๋ฐ ๋๊ธฐ
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ค๋ฉด ์์ฒญ์ผ๋ก ๋ณด๋ธ HTTP ๋ฉ์ธ์ง ๋ฑ์ ์ฝ๋๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์์
์ ์ํํ๋ค.
- ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํน์ ์์
(api๋ฅผ ํธ์ถ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ)์ ํธ์ถ ํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
- ์ด๋ ์ญ์ ํธ์ถํ ์์
์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ด์ผ ํ๋ค.
- ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด๊ธฐ ์ํด์ ์ฐ๊ธฐ ์์
์ด ์งํ๋๋ค.
- ์ ๊ณผ์ ์์ ์๋ฒ๊ฐ ํ๋ ์ผ์ ๋๋ถ๋ถ์ ์ฝ๊ธฐ & ์ฐ๊ธฐ์ ์์ฒญ ํ ๋๊ธฐ์ด๋ค.
I/O์ ํนํ๋ event-loop ๋ค์ค์ฒ๋ฆฌ ๋ฐฉ์
- ๋๋ถ๋ถ์ ์์
์ด ์ฝ๊ธฐ/์ฐ๊ธฐ(I/O) ๋ฐ ๋๊ธฐ์ธ ์น ์๋น์ค ์๋ฒ๋ฅผ I/O์ ํนํ๋ ์ฑ๊ธ ์ค๋ ๋๋ก ๋ค์ค์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ์
- ์ฑ๊ธ ์ค๋ ๋๋ ๊ณ์ ๋์๊ฐ๋ฉฐ(event-loop) ๋น์ฆ๋์ค ๋ก์ง์ ์ํ
- ์ํ ๋์ค ๋ธ๋กํน I/O ์์
์ ๋ง๋๋ฉด ์์ปค ์ค๋ ๋ํ์๊ฒ ์์
์ ๋๊ฒจ์ค
- ์์
์ ๋๊ฒจ์ค ๋ค ๋ฉ์ธ์ค๋ ๋๋ ๊ณ์ํด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํ
- ์์ปค ์ค๋ ๋ํ์๊ฒ ๋๊ฒจ์ฃผ์๋ ์์
์ด ์๋ฃ๋๋ฉด ๋ค์ ๋ฉ์ธ์ค๋ ๋๋ก ๋ค์ด์ด
- ์์ปค์ค๋ ๋๋ค์ ์ ๋ต์ ๋ฐ๋ผ CPU Bound or I/O Bound ํ ์ค๋ ๋
ajax.than({
// 1๋ฒ : ajax ์์ฒญ
// ...(๋ธ๋กํน I/O ์์
์ด ์๋ค๊ณ ๊ฐ์ ) 2๋ฒ : ๋ธ๋กํน I/O ์์
});
console.log("~"); // 3๋ฒ
- event-loop ์ฒ๋ฆฌ ์์
- event-loop ์ค๋ ๋์ ajax ์ฝ๋์ธ 1๋ฒ์ด ์คํ๋๋ค.
- 2๋ฒ์ ๋ธ๋กํน I/O ์์
์ด ์๋ค๊ณ ๊ฐ์ ํ ๋ 2๋ฒ์ ๋ฉ์ธ ์ค๋ ๋์์ ์ํ๋์ง ์๊ณ ์์ปค ์ค๋ ๋๋ก ์์
์ด ๋์ด๊ฐ๋ค.
- 3๋ฒ์ console.log()๊ฐ ์คํ๋๋ค.
- 2๋ฒ์ ๋ธ๋กํน I/O ์์
์ด ๋๋ ํ์ ๊ฒฐ๊ณผ๊ฐ ๋ฉ์ธ ์ค๋ ๋์ event-loop๋ก ๋ค์ด์จ๋ค.
- ์ฆ, ์ ์์ค์ฝ๋๋ 1 -> 3 -> 2์ ์์ผ๋ก ์คํ๋๋ค.
sync/async, blocking/non-blocking
sync/async
- sync/async๋ ์คํ ์์(์๊ฐ)๋ฅผ ๊ด์ ์ผ๋ก ๋๋์ด์ง๋ค.
- sync
- ์คํ ์์๊ฐ ์ ์ฐจ์
- ์ฝ๋์ ์์ฑ ์์๋๋ก ์คํ๋๋ ๊ฒ์ ๋ณด์ฅ (์ ๋ช
๋ น์ ์์
์ด ๋๋์ง ์์ผ๋ฉด ๋ค๋ฅธ ์์
์ ํ ์ ์๋ค.)
- async
- ์คํ ์์๊ฐ ์ ์ฐจ์ ์ด์ง ์์
- ์ ๋ช
๋ น์ ์์
์ด ๋๋์ง ์์๋ ๋ค์ ๋ช
๋ น์ ์คํ
- ์์ ์ดํด๋ณธ event-loop ๊ธฐ๋ฐ์ ์ฑ๊ธ ์ค๋ ๋ ์ญ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ฐ์ฐ๋ค์ ์์ปค ์ค๋ ๋์๊ฒ ๋๊ธฐ๊ณ ๋ค๋ฅธ ์์
์ ์ํํ๋ฏ๋ก ์คํ ์์๊ฐ ์ ์ฐจ์ ์ด์ง ์์ async๋ค.
blocking/non-blocking
- blocking/non-blocking์ ์ ์ด๊ถ์ ๋ฐํ์ ๊ด์ ์ผ๋ก ๋๋์ด์ง๋ค.
- blocking
- ํธ์ถ๋ ํจ์๊ฐ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์ง ์์
- ํธ์ถํ ํจ์์์ ๋ค๋ฅธ ์์
์ ์ํ ๋ชปํ๊ณ ์ ์ด๊ถ์ ๋ฐํ์ ๊ธฐ๋ค๋ ค์ผ ํจ
- non-blocking
- ํธ์ถํ ํจ์ ์ธก์์ ์ ์ด๊ถ์ ๊ณ์ ๊ฐ์ง (์ ์ด๊ถ์ด ๋๊ฒจ์ง์ง ์์)
- ํธ์ถํ ํจ์๋ ์ ์ด๊ถ์ด ์์ผ๋ฏ๋ก ๊ณ์ํด์ ๋ค๋ฅธ ์์
์ ์ฒ๋ฆฌํ ์ ์์
- ์์ event-loop ๊ตฌ์กฐ๋ ์์ปค ์ค๋ ๋์์ ํธ์ถ๋ ํจ์๊ฐ ์ํ๋๋ค๋ฉด ๊ทธ ํจ์์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ ์๋ ์ํฉ์ธ์ง ์ฒดํฌ ๊ณผ์ ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์