β¨ JS, Event Loop, Single Thread
NodeJs μ single/multi thread μ¬λΆλ₯Ό μ 리νλ€λ³΄λ Js μ Event Loop κ°λ μ μ‘°κΈ λ νμ€ν μμλμ΄μΌκ² λ€λ μκ°μ΄ λ€μλ€.
μλ°μ€ν¬λ¦½νΈλ μ±κΈμ€λ λ μΈμ΄μ΄λ€. νμ§λ§ μ΄μ κΈμμλ λ³Ό μ μμλ―, λ©ν°μ€λ λμ²λΌ λμμ μ¬λ¬ νμ€ν¬μ μλμ΄ κ°λ₯νλ€. μ΄ νΉμ§μ λΈλΌμ°μ λ°νμ νκ²½μμλ λμΌνλ€.
μμΌκΉ?
λ°λ‘ λ°νμ νκ²½ (Node, λΈλΌμ°μ )μ μ΄λ²€νΈ 루νλΌλ μμ€ν λλΆμ΄λ€. κ·Έλ λ€λ©΄ μ΄λ²€νΈ 루νκ° λ¬΄μμΈμ§ ꡬ체μ μΌλ‘ λ€μ΄κ°λ³΄μ.
β¨ Javascript ?
μ°μ MDN μ΄ μ μνλ Javascript λ λ€μκ³Ό κ°λ€.
JavaScript(JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions. While it is most well-known as the scripting language for Web pages, many non-browser environments also use it, such as Node.js, Apache CouchDB and Adobe Acrobat...
μ. μ€λͺ μ΄ λ€μ μ΄λ ΅λ€λ κ°μ΄ μ, λ€λ₯Έ μ μλ₯Ό μ°Ύμλ³΄κ² λμλ€.
W3 Schools μμλ Javscript λ₯Ό κ°λ΅ν μ μνκ³ μλ€.
JavaScript is the Programming Language for the Web.
μ΄μ λ³΄λ€ μ‘°κΈ λ μ§κ΄μ μ΄λ©° λͺ νν μ€λͺ μ΄λ€. "μλ°μ€ν¬λ¦½νΈλ μΉμ μν νλ‘κ·Έλλ° μΈμ΄μ΄λ€."
μλ°μ€ν¬λ¦½νΈκ° μΉμ νΉνλ μΈμ΄λΌλ©΄, μλ°μ€ν¬λ¦½νΈκ° μΉμμ μλν μ μλλ‘ νλ μΌλ ¨μ μ₯μΉλ€μ΄ λΆλͺ μ‘΄μ¬ν κ²μ΄λ€. νΉν, λΉλκΈ° μμ μ μν μ₯μΉκ° μ‘΄μ¬ν κ²μ΄ λΆλͺ νλ€. κ·Έ 'μΌλ ¨μ μ₯μΉ'κ° λ°λ‘ μ΄λ² κΈμμ λ€λ£¨κ² λ "Event Loop" μ΄λ€.
β¨ Heap & Call Stack
Javascript λ κ·Έ μμ²΄λ‘ μ€νλμ§ μμΌλ©°, Javascript λ₯Ό μ€ννκ² ν΄μ£Όλ νΉμ μμ§μ΄ νμνλ€. κ·Έ μ€ νλκ° λ°λ‘ Chrome μ λ΄μ₯λ μλ°μ€ν¬λ¦½νΈ μ€ν μμ§ V8 μ΄λ€. νμ§λ§ μ΄λ³΄λ€ κΉκ² λ€μ΄κ°κΈ° μ μ, Javascript μμ§μΈ V8μ ν¬κ² λ κ°μ§ ꡬμ±μμλ‘ λλλ€λ μ¬μ€μ μμμΌ νλ€.
Heap:
- λ©λͺ¨λ¦¬ ν λΉμ΄ μ΄λ£¨μ΄μ§λ 곡κ°
Call Stack:
- μ€νλμ΄μΌ νλ μμ μ΄ μμ΄λ κ³΅κ° (console.log λ μ¬μ©μ μ§μ ν¨μ)
- Single-thread μ΄κΈ° λλ¬Έμ, ν λ²μ νλμ μμ λ§ μν κ°λ₯νλ€.
π μ¬κΈ°μ μ€μν κ²μ Call Stack μ μλ λ°©μμ΄λ€.
ν¨μ μ€ν call μ΄ μ΄λ£¨μ΄μ§λ μκ°, ν΄λΉ ν¨μλ call stack μ λ΄κΈ°λ©°,
ν¨μ λ΄λΆμ μμμ λ°λ₯Έ μ€ν μμλλ‘ stack μ κ³μ μμ ν λ΄μμ΄ μμ΄κ² λλ€.
Stack μ λ μ΄μ λ΄μ μ μλ call μ΄ μλ€λ©΄, λμ€μ λ€μ΄μ¨ μμ λΆν° μ€νμ΄ λμ΄ Stack μ λΉ μ Έλκ°λ€. (LIFO, μ μ νμΆ λ²μΉ)
π Stack μ μλ μμ μ΄ μ€νλλ μκ°μ΄ λ§€μ° κΈΈλ€λ©΄? μ΄ νμμ΄ λ°λ‘ Blocking μ΄λ€.
Stack μμλ ν μμ μ μννλ λμ λ€λ₯Έ μμ μΌλ‘ λμ΄κ° μ μκΈ° λλ¬Έμ, νΉμ μμ μν μκ°μ΄ κΈΈμ΄μ§λ©΄ λλ¨Έμ§ μμ μ΄ κ³μ "λκΈ°μ€" μνμ 머무λ₯Ό μλ°μ μλ€. μ΄λ¬ν Blocking νμμ΄ μ 체 μΉ λ λλ§ μμ λ°μνκ² λλ€λ©΄ μ μ λ νΉμ μμ μ΄ λλ λκΉμ§ λ²νΌ ν΄λ¦μ νμ§ λͺ»νκ±°λ, κ³μ λ‘λ©μ°½μ λ°λΌλ³΄κΈ°λ§ ν΄μΌ ν μλ μλ κ²μ΄λ€.
β¨ Asynchronous (λΉλκΈ°) ν¨μμ Event Loop
μμμ μΈκΈλ Stack μ κΈ°λ³Έμ μΈ μλ νλ¦μ΄ μΌκΈ°νλ λ¬Έμ μ μ λν κ°λ¨ν ν΄κ²°μ± μ΄ λ°λ‘ λΉλκΈ° ν¨μμ΄λ€. μμ μκ°μ΄ μ€λ 걸리λ μ½λμ κ²½μ°, λΉλκΈ°μ μΌλ‘ μ€ννλλ‘ μ€μ ν΄ λ μΌλ‘μ¨ Call Stack μ΄ μλ "λ€λ₯Έ μμ" (μΆν μ€λͺ μμ ) μμ μμ μ νλλ‘ νλ κ²μ΄λ€. μ΄ κ²½μ°, Blocking νμμ λ°©μ§ν λΏλ§ μλλΌ μ½λ μ€νμ μ¬λ¬ μΈ‘λ©΄μμ ν¨μ¨μ μΌλ‘ ν μ μκ² λλ€.
π κ·Έλ λ€λ©΄ λΉλκΈ° ν¨μλ₯Ό μ€ννλ κ·Έ "λ€λ₯Έ μμ"μ λ체 μ΄λμΈκ°?
μ¬κΈ°μ μ‘΄μ¬κ°μ λλ¬λ΄λ κ²μ΄ μκΉ μΈκΈνλ μ΄λ²€νΈ 루νμ΄λ€. μ΄λ²€νΈ 루νλ λ°νμ νκ²½μ λ΄μ₯λ μ¬λ¬ μ₯μΉλ€κ³Ό μλ°μ€ν¬λ¦½νΈ μμ§μ νμ©ν΄ λΉλκΈ° μ²λ¦¬λ₯Ό νλ μΌμ’ μ λμ μμ€ν μ΄λ€. μλ°μ€ν¬λ¦½νΈ λ°νμμ ν λ²μ ν κ°μ§ μμ λ§ μνν μ μμ§λ§, λΈλΌμ°μ μμ μ 곡νλ Web API λλΆμ λΉλκΈ° ν¨μλ₯Ό λ³λ ¬μ μΌλ‘ μ²λ¦¬ν μ μκ² λλ€. (Nodeμμλ C++ API λ₯Ό ν΅ν΄ κ°λ₯νλ€)
π Event Loop μ μν
Event Loop μ μν μ, Task Queue μ Call Stack μ κΎΈμ€ν κ°μνλ κ²μ΄λ€.
μ€ν¬λ¦½νΈ μ€ν μ€ Stack μ λ€μ΄μ¨ λκΈ° ν¨μλ λ°λ‘ μ€νλμ΄ Stack μ λΉ μ Έλκ°μ§λ§, λΉλκΈ° ν¨μλ λΈλΌμ°μ μ Web ApI λ‘ μ΄λν΄ μ΄ κ³΅κ°μμ μμ μ μ§ννλ€. κ·Έλ¦¬κ³ λΉλκΈ° ν¨μμ μμ μ΄ μλ£λλ μκ° λΈλΌμ°μ μ "Task Queue" λΌλ 곡κ°μΌλ‘ λ€μ΄κ°λ€. μ΄λ²€νΈ 루νλ Queue μ Stack μ κ³μ μ§μΌλ³΄λ€κ°, Stack κ° λΉμλ€λ κ²μ μμ차리λ μκ°, Task Queue μ λ€μ΄μ¨ 첫 λ²μ§Έ μμλΆν° μμλλ‘ λ€μ Stack μ μ¬λ € ν¨μκ° μ€νλλλ‘ νλ€.
μ΄λ κ² νμ¬ JS μμμ λκΈ°/λΉλκΈ° ν¨μμ μ€ν μ리, κ·Έλ¦¬κ³ μ΄λ²€νΈ 루νμ κ°λ κΉμ§ κ΄λͺ©νμ¬ μ 리λμλ€.
β¨ λ°°μ΄ λ΄μ©
- Event Loop λ .. μμ§μ΄ μλλ€.. κ·Έλμ μλͺ»λ ννμ μ¬μ©ν΄ μλλ°, μμΌλ‘λ μ©μ΄μ λ μ κ²½ μ¨μΌκ² λ€.
- λΈλΌμ°μ λ°νμκ³Ό Node μ μλ μ리λ κΈ°λ³Έμ μΌλ‘ λμΌνλ€. κ·Έ μ€ν νκ²½μ΄ νμ©νλ API λλ μΈμ΄ λ°°κ²½μ΄ λ¬΄μμ΄λμ μ°¨μ΄κ° μμ λΏμ΄λ€.
β¨ μ°Έκ³ μλ£
'π» DEV > Javascript & NodeJS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[NodeJS] Node μ this λ? (+ νμ΄ν ν¨μμ this) (2) | 2021.09.10 |
---|---|
[Javascript] Javascript μ this λ? (0) | 2021.09.07 |
[NodeJS] NodeJS λ Single Thread μΌκΉ? Multi Thread μΌκΉ? (1) | 2021.09.06 |
[Javascript] ꡬ쑰λΆν΄ ν λΉ (0) | 2021.06.05 |
[Javascript] JSON (0) | 2021.06.05 |
λκΈ