β¨ κ³ λ―Όμ΄ μμλ κ³κΈ°
JS κΈ°μ΄λ₯Ό νμ΅νλ λΉμμλ μ€λ λμ νλ‘μΈμ€μ κΈ°λ³Έ κ°λ μ νμ΅ν΄λκΈ°λ§ νκ³ , ꡬ체μ μΌλ‘ μ΄ν΄λ³΄μ§ λͺ»νμλ€. μΉκ°λ° κ΅μ‘κ³Όμ μ΄ λλκ° λ¬΄λ ΅, μ€μκ° μ€ κ°μμμ ν¬λ£¨λΆκ» "JS λ μ±κΈ μ€λ λμΌκΉμ?" λΌλ μ§λ¬Έμ λ€μκ³ , λ΄ λλ΅μ λΉμ°ν "yes" μλλ°, μμΈλ‘ "No" λΌλ λ°μλ λ§μλ€. λ€λ€ μ‘°κΈμ© λ€λ₯΄κ² μκ³ μλ μ΄μ κ° κΆκΈν΄μ ꡬκΈλ§μ ν΄ λ³΄λ, ν·κ°λ¦΄λ§ν μ΄μ κ° μλ€λ μκ°μ΄ λ€μλ€.
μ΄λ² κΈμμλ JS, κ·Έλ¦¬κ³ NodeJS κ° κ³Όμ° Single Threaded μΈμ§ Multi Threaded μΈμ§ νμ΄λ³΄λλ‘ νκ² λ€.
β¨ νλ‘μΈμ€μ μ€λ λ (Process & Thread)
νλ‘μΈμ€μ μ€λ λλ μ΄μ κΈμμ μ΄λ―Έ ν λ² λ€λ£¬ μ μ΄ μμΌλ, κ°λ¨νλ§ μ§κ³ λμ΄κ°κ² λ€.
νλ‘μΈμ€(Process)λ νλ‘κ·Έλ¨μ΄ μ€νλλ μ¦μ CPU λ‘λΆν° ν λΉλ°λ μμ μμμ΄λ€ (λ©λͺ¨λ¦¬ λ±).
κ·Έλ¦¬κ³ μ€λ λ(Thread)λ νλ‘μΈμ€ λ΄μμ μ€νλλ μ¬λ¬ νλ¦μ λ¨μμ΄λ©°, νλ‘μΈμ€κ° ν λΉλ°μ μμ€ν μμ (CPU μκ°, λ©λͺ¨λ¦¬ μμ λ±)μ μ΄μ©νλ μ€ν λ¨μμ΄λ€.
κ·Έλ λ€λ©΄ μ€λ λ λ νλ‘μΈμ€μ μ΄λ€ μμμ νμ©νκ² λλκ°?
νλ‘μΈμ€μ λ©λͺ¨λ¦¬ μμμΈ Code, Data, BSS, Heap, Stackμ μ κ·Όνμ¬ νμ©νκ² λλ€.
β¨ νλ‘μΈμ€μ λ©λͺ¨λ¦¬
νλ‘μΈμ€μ λ©λͺ¨λ¦¬λ ν¬κ² Code, Data, BSS, Heap, Stackμ μμμΌλ‘ λλλ€.
Code
- κ°μ₯ νλ¨μ μμΉν μμμ΄λ©°, μμ±ν κΈ°κ³μ΄ λλ μ½λκ° λ€μ΄κ°λ€.
- ν¨μ, μ μ΄λ¬Έ, μμ λ±μ΄ λ€μ΄κ°λ€.
- Read-only μμμ΄λ©°, μ»΄νμΌλ¬κ° λ§λ μ½λλΌκ³ λ΄λ 무방νλ€.
Data
- μ μλ³μ, μ μ λ³μ, λ°°μ΄, ꡬ쑰체 λ±μ΄ μ μ₯λλ 곡κ°μ΄λ€.
- μ΄κΈ°ν (initialized) λ λ°μ΄ν°κ° μ μ₯λλ 곡κ°μ΄λ€. μ¦, μ΄κΈ°κ°μ΄ μλ static λ³μκ° λ€μ΄κ°λ€.
BSS (Block-stated Symbol)
- μ μλ³μ, μ μ λ³μ, λ°°μ΄, ꡬ쑰체 λ±μ΄ μ μ₯λλ 곡κ°μ΄λ€.
- μ΄κΈ°νλμ§ μμ (μ΄κΈ°κ°μ΄ μλ) λ°μ΄ν°κ° μ μ₯λλ€.
π Code, Data, BSS λͺ¨λ μ μ μΈ μμμ΄λ©°, compile time μ ν¬κΈ°κ° κ²°μ λμ΄ μ΄νμ λ³λλμ§ μλλ€.
π λν, νλ‘μΈμ€κ° μ’ λ£λ λκΉμ§ κ³μ μλνλ€.
Heap
- νλ‘κ·Έλλ¨Έκ° λμ μΌλ‘ μ¬μ©νλ μμμΌλ‘, λμ κ°μ²΄ λ°μ΄ν°μ ν λΉ λλ λ°νμ΄ μ΄λ£¨μ΄μ§λ μμμ΄λ€.
Stack
- ν¨μκ° ν¬ν¨λμ΄ μκ³ , ν¨μ λ΄μ μ§μλ³μ, 맀κ°λ³μ λ±μ΄ μ μ₯λμ΄ μλ, νλ‘κ·Έλ¨μ΄ μλμΌλ‘ μ¬μ©νλ μμ λ©λͺ¨λ¦¬μ΄λ€.
- LIFO (μ μ νμΆ) μ μ± μ μ¬μ©νλ©°, ν¨μ νΈμΆ μ μμ±λκ³ ν¨μ μ’ λ£μ λ°νλλ€.
π Heap μ μμμ΄ μ¦κ°νμ¬ Stack μμμ μΉ¨λ²νλ Heap Overflow μ μν©μ΄ λκ±°λ, Stack μ μμμ΄ μ¦κ°νμ¬ Heap μ μμμ μΉ¨λ²νλ Stack Overflow μ μν©μ΄ λ λ μ¬μ©λλ λ©λͺ¨λ¦¬μ μμ μμ λν μ‘΄μ¬νλ€.
π νλ‘μΈμ€ λ©λͺ¨λ¦¬μ μλλ Stack > Data > Code > Heap μμΌλ‘ λΉ λ₯΄λ€.
νλ‘μΈμ€μ λ©λͺ¨λ¦¬κ° μ΄λ»κ² ꡬμ±λμ΄ μλμ§ μμ보μμΌλ, μ€λ λκ° μ΄λ€ μμμ μ΄λ»κ² μ κ·Όνκ² λλμ§ μμΈν μ΄ν΄λ³΄μ.
β¨ Single, Multi-thread
μ ν΅μ μΈ μ»΄ν¨ν°λ μ λΆ Single Thread λ‘ μ΄λ£¨μ΄μ‘μ§λ§, μ μ°¨ Multi Thread νλ‘μΈμ±μ΄ κ°λ₯ν μ»΄ν¨ν°κ° λ§μμ§κ³ μλ€.
Single Thread:
- νλμ νλ‘μΈμ€μμ νλμ μ€λ λλ₯Ό μ€ννλ―λ‘, νλ‘μΈμ€ λ΄μ μμ μ μμ°¨μ μΌλ‘ μ€ννλ€.
- μ μ μ μνΈμμ©νλ μ ν리μΌμ΄μ μ κ²½μ°, ν κ°μ§ μμ μ΄ λλ λ€μμΌ λ€μ μμ μΌλ‘ μ΄λνκΈ° λλ¬Έμ μ μ κ° μνλ μμ μνμ΄ λΉ λ₯΄κ² μ΄λ£¨μ΄μ§μ§ μμ μ μλ€. (low-responsiveness)
Multi Thread:
- νλμ νλ‘μΈμ€ λ΄μ μ¬λ¬ κ°μ μ€λ λκ° μ€νλλ€.
- κ°κ°μ μ€λ λκ° λ€λ₯Έ μμ μ ν λΉλ°μΌλ―λ‘, νλ‘μΈμ€κ° λ³λ ¬μ μΌλ‘ μ¬λ¬ μμ μ λμμ μνν μ μλ€.
- Multi-Thread λ νλ‘μΈμ€ λ΄μμ κ°κ° Stackλ§ λ°λ‘ ν λΉλ°κ³ Code, Data, Heap μμμ 곡μ νλ€.
- λ°λΌμ Heap λ©λͺ¨λ¦¬λ μλ‘ λμμ μ½κ³ μΈ μ μμΌλ©°, ν μ€λ λκ° μμμ λ³κ²½νλ©΄ λ€λ₯Έ μ΄μ μ€λ λλ κ·Έ κ²°κ³Όλ₯Ό μ¦μ λ³Ό μ μλ€.
- μ¬λ¬κ°μ μ€λ λκ° λμΌν λ©λͺ¨λ¦¬ μ£Όμλ₯Ό νμ©νλ©΄μ μμ μ μ¬λ¬ κ° μννκΈ° λλ¬Έμ, λ©λͺ¨λ¦¬ μ¬μ©μ΄ ν¨μ¨μ μ΄λ€.
+) μ°Έκ³ λ‘ μ½μ΄ μ νλλΉ νλμ μ€λ λλ₯Ό μ€νν μ μλ€. λ§μ½ μ½μ΄κ° 2κ°μΈ CPU μμ μ€λ λκ° 2κ°μΈ νλ‘μΈμ€κ° μ€νλλ©΄ 2κ°μ μ€λ λλ λ³λ ¬μ μΌλ‘ μ€νλμ§λ§, 4κ°μ μ€λ λκ° μ€νλλ©΄ νλμ μ½μ΄λΉ 2κ°μ μ€λ λλ₯Ό λ΄λΉνμ¬ Context-switching μ ν΅ν΄ λͺ¨λ λ³λ ¬μ μΌλ‘ μ€νλλ κ²μ²λΌ 보μ΄κ²λ νλ€.
β¨ κ·Έλ λ€λ©΄ Javascript λ Single-thread μΈκ°?
μλ°μ€ν¬λ¦½νΈλ₯Ό μλμν€λ κ²μ λ°λ‘ V8 μμ§μ΄λ©°, V8μμ§μ Call Stackκ³Ό Memory Heapλ‘ κ΅¬μ±λμ΄ μλ€. μ΄ V8 μμ§ λλΆμ μλ°μ€ν¬λ¦½νΈλ λΈλΌμ°μ λ΄λΆμμλ, μΈλΆμμλ λμν μ μκ² λλ€. V8 μμ§κ³Ό λ°νμμ΄ λ§λλ©΄ μ΄λ²€νΈ 루νκ° μλνκ² λλ€. μ΄λ²€νΈ 루νλ λΉλκΈ° μ²λ¦¬λ₯Ό κ°λ₯νκ² ν΄μ£Όλ μΌμ’ μ μμ€ν μ΄λ€.
μ΄λ²€νΈ 루νλ μ±κΈ μ€λ λλ‘ μλνλ€. μ΄ λλ¬Έμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ±κΈ μ€λ λ μΈμ΄λΌκ³ λΆλ₯Έλ€. μ΄κ²μ΄ μλ―Ένλ κ°μ₯ ν° λ°λ, μλ°μ€ν¬λ¦½νΈ μ½λκ° μμ°¨μ μΌλ‘ μ€νλλ€λ μ μ΄λ€.μ¦, μ΄μ λΌμΈμ μμ±λ μ½λ μ€νμ΄ μλ£λμ§ μμ μνμμ λ€μ μ½λ μ€ν λ¨κ³λ‘ λμ΄κ°μ§ μλλ€.
π κ·Έλ¬λ μ λ§ μ€μν μ¬μ€μ μ΄κ²μ΄λ€:
π μλ°μ€ν¬λ¦½νΈλ Node λ μΉ λΈλΌμ°μ μ κ°μ λ©ν° μ°λ λ©μ΄ κ°λ₯ν νκ²½μμ μ€νλλ€. λ°λΌμ "μλ°μ€ν¬λ¦½νΈ (μμ§)"μ μ±κΈ μ€λ λμ΄μ§λ§, "μλ°μ€ν¬λ¦½νΈλ₯Ό μ€ννλ λ°νμ" μ μλ²½ν μ±κΈ μ€λ λκ° μλλΌκ³ ν μ μλ€.
β¨ κ·Έλ λ€λ©΄ NodeJS λ Multi-thread μΈκ°?
Node μμ νλμ νλ‘κ·Έλ¨μ΄κΈ° λλ¬Έμ, μ€ν μ¦μ νλμ λ 립λ νλ‘μΈμ€κ° λμ΄ CPU λ‘λΆν° 리μμ€λ₯Ό ν λΉλ°λλ€.
Node μμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€ννλ©΄ μ½λ°±μ ν΅ν΄ μ¬λ¬ κ°μ λΉλκΈ° ν¨μλ₯Ό μ€νν μ μμΌλ©°, fs.readfile λλ DNS read κ³Ό κ°μ μμ λ€λ μνν μ μκ² λλ€.
κ·Έλ¬λ μ΄λ¬ν μμ μ λ¬Έμ μ μ, μ΄λ²€νΈ 루νμ ν° λΆλ΄μ μ£Όμ΄ κ²°κ³Όμ μΌλ‘ μ ν리μΌμ΄μ μ μ±λ₯μ μ€μΌ μ μλ€λ κ²μ΄λ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ Nodejs λ uvlib λΌλ C library λ₯Ό μ¬μ©νκΈ° μμνλ€. κ·Έλ¦¬κ³ ν΄λΉ λΌμ΄λΈλ¬λ¦¬λ λ©ν°μ€λ λ©μ μ§μνλ€.
uvlib
- I/O-intensive μμ κ³Ό CPU-intensive μμ μ μ§μνλ€.
- I/O: μ λ ₯(Input)/μΆλ ₯(Output)μ μ½μλ‘, μ»΄ν¨ν° λ° μ£Όλ³μ₯μΉμ λνμ¬ λ°μ΄ν°λ₯Ό μ μ‘νλ νλ‘κ·Έλ¨, μ΄μ νΉμ μ₯μΉμ΄λ€.
- I/O-intensive: DNS, File System κ΄λ ¨ λ΄μ©μ΄λ€.
- CPU-intensive: Crypto, Zlib κ΄λ ¨ λ΄μ©μ΄λ€.
κ·Έλ λ€λ©΄ Nodejs κ° uvlib λ₯Ό μ¬μ©νμ¬ μλ‘μ΄ μ€λ λλ₯Ό μ¬μ©νλ ꡬ체μ μΈ μν©μ 무μ, λλ μΈμ μΈκ°?
1. DNS 쿼리λ₯Ό ν λ
- Host μ ip λ₯Ό μ½μ΄μΌ νλ μν©μμλ λ©μΈ μ€λ λμΈ μ΄λ²€νΈ 루νλ₯Ό μ¬μ©νμ§ μκ³ μλ‘μ΄ μ€λ λλ₯Ό λ§λ€μ΄ μμ μ μννλ€.
- Fetch API λ±μ νμ©ν λκ° μ΄μ ν΄λΉνλ€.
2. File systemμ μ κ·Όν λ
- Async (λΉλκΈ°) file system μμ μ ν λ μ΄λ²€νΈ 루νμμ μ체μ μΌλ‘ μλ‘μ΄ μ€λ λλ‘ ν΄λΉ μμ μ λκΈ΄λ€.
- μ£Όμν μ μ, readfilesync μ κ°μ λκΈ° ν¨μλ μλ‘μ΄ μ€λ λκ° μλ μ΄λ²€νΈ 루νμμ μ€νλλ€λ μ¬μ€μ΄λ€.
2. Crypto, Zlip
- Crypto λ₯Ό νμ©ν μνΈνλ ν΄μ± μμ λν μ΄λ²€νΈ 루νκ° μλ μ€λ λλ₯Ό νμ©νλ€.
- Zlip: μ½λ λ΄μμ 무μΈκ°λ₯Ό μμΆν λ μμ μ€λ λλ₯Ό νμ©νλ€.
κ²°λ‘ μ μΌλ‘, NodeJS λ λ κ°μ μ€λ λλ‘ κ΅¬μ±λμ΄ μλ€.
1. μ΄λ²€νΈ 루ν (λ©μΈ μ€λ λ)
2. Thread Pool (미리 μμ±λ, λΉμ΄ μλ μ€λ λ κ·Έλ£Ήμ΄λ€. Thread Pool μ ν¬κΈ°λ₯Ό 미리 μ ν΄λμΌλ©΄ λ°λ³΅μ μΈ μ€λ λ μμ±/μμ μ μ°¨λ₯Ό μ€μμΌλ‘μ¨ νλ‘μΈμ€μ μ±λ₯μ κ°μ ν μ μλ€. Nodejs μ Thread Pool κΈ°λ³Έκ°μ 4 κ°μ΄λ€)
Nodejs λ μ΄λ²€νΈ 루νμμ μλνλ€κ°, fs λ ν΄μ± λ±μ μμ μ΄ νμν κ²½μ° μ΄ μμ μ Thread pool λ‘ λμ Έμ£Όμ΄ μλ‘μ΄ thread λ₯Ό μ¬μ©νλ€.
π μ€μν POINT λͺ κ°μ§:
- res.end λ±κ³Ό κ°μ΄, networking κ΄λ ¨ μμ μ νμ! λ©μΈ μ€λ λμΈ μ΄λ²€νΈ 루νλ₯Ό νμ©νλ€.
- μλ²μ μ½λλ₯Ό μμ±ν λ ν΄λΉ μ½λμ μμ μ΄ μ΄λ²€νΈ 루νμμ μ΄λ£¨μ΄μ§λμ§, λ€λ₯Έ μ€λ λμμ μ΄λ£¨μ΄μ§λμ§ νλ¨νλ κ²μ 맀μ°! μ€μνλ€. λμ λ°λΌμ μ΄λ²€νΈ 루νμμ μ§νλλ μμ μΌλ‘ μΈν΄ μμ μλ΅(response)μ λ°μ§ λͺ»ν μλ μκΈ° λλ¬Έμ΄λ€..
β¨ μ 리
κ°νΉ NodeJS λ single-thread λΌλ κΈμ΄ 보μ΄λλ°, μλ§ μμ μΈκΈν νΉμ§ λλ¬Έμ λΉμ΄μ§ νΌμ μ΄ μλκΉ μΆλ€.
NodeJS λ κΈ°λ³Έμ μΌλ‘ Javascript μ μ΄λ²€νΈ 루νλ₯Ό λ©μΈ μ€λ λλ‘ νμ©νκΈ° λλ¬Έμ "μ±κΈ μ€λ λ"μ΄λ€.
κ·Έλ¬λ κΈ°λ³Έ μμ μΈ νΉμ μμ μ μνν λ, μΆκ° μ€λ λκ° νμν κ²½μ°μλ μλ‘μ΄ μ€λ λλ₯Ό μμ±νμ¬ μ€νν μ μλ Multi-thread νλ‘μΈμ€μ΄κΈ°λ νλ€.
π Nodejs μμ μλ²λ₯Ό μ€μΉν λ, μ€λ λ μλ₯Ό 무쑰건 λ§μ΄ λλ €λλ κ²μ μ’μ μ λ΅μ΄ μλλ€. μ΄λ€ μ½λκ° μλ‘μ΄ μ€λ λλ₯Ό trigger νλμ§ νμ νκ³ , μ΄μ λ§μΆ° pooling μμ μ μ§μμ μΌλ‘ νλ κ²μ΄ μ€μνλ€.
β¨ λ°°μ΄ / λλ μ
- μ»΄ν¨ν°μ λ©λͺ¨λ¦¬λ₯Ό νμ€νκ² μμλμ΄μΌ μ€λ λμ νλ‘μΈμ€μ κ°λ μ μ¬ννμ¬ μ΄ν΄ν μ μμ κ²μ΄λ©°. μ΄λ₯Ό μν΄μλ ν¬μΈν° (pointer) κ°λ μ λν μ΄ν΄κ° νμνλ€. λ©λͺ¨λ¦¬μ λν μ§μ μ μΈ μ κ·Όμ νλ μ»΄νμΌ μΈμ΄λ₯Ό λ°°μμΌ νλ€λ μκ°μ΄ λ λ€.
- λ΄κ° μ¬ν Nodejs μ Javascript μ κΉμ μ°¨μ΄μ κΉμ§λ μ΄ν΄νμ§ λͺ»νλ€λ κ²μ λκΌλ€. λ°νμκ³Ό μΈμ΄μ μ°¨μ΄λ₯Ό λμ± ν 보μμΌκ² λ€.
- Node μμ multithreading μ΄ κ°λ₯ν μ΄μ λ μ μ΄μ JS μ½λμ μΌμ λΆλΆμ΄ multi threading μ μ§μνλ c++ μ κΈ°λ°νκΈ° λλ¬Έμ΄λΌκ³ νλ€. λ무 μ κΈ°νκ³ μ¬λ°λ€.
β¨ μ°Έκ³ μλ£
- The Node.js Event Loop: Not so single-threaded
- When is NodeJS Single-Threaded and when is it Multi-Threaded?
- λ©λͺ¨λ¦¬ μμ(Code, Data, Heap, Stack)
- λ©λͺ¨λ¦¬ μμμ μ΄ν΄
- μμ€ν ν΄νΉ κ°μ’ 5κ° - λ©λͺ¨λ¦¬ ꡬ쑰 μ΄ν΄νκΈ° (System Hacking Tutorial 2017 #5)
- Introduction to Threads
- https://link.medium.com/XYUyxHADtjb
'π» DEV > Javascript & NodeJS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Javascript] Javascript μ this λ? (0) | 2021.09.07 |
---|---|
[Javascript] μ΄λ²€νΈ 루ν (Event Loop) λ? (0) | 2021.09.07 |
[Javascript] ꡬ쑰λΆν΄ ν λΉ (0) | 2021.06.05 |
[Javascript] JSON (0) | 2021.06.05 |
[Javascript] ExpressJS (Intro) (0) | 2021.06.05 |
λκΈ