λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Javascript & NodeJS

[NodeJS] NodeJS λŠ” Single Thread 일까? Multi Thread 일까?

by vodkassi 2021. 9. 6.
728x90

✨  고민이 μ‹œμž‘λœ 계기

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의 μ˜μ—­μœΌλ‘œ λ‚˜λ‰œλ‹€.

 

 

Thread 의 λ©”λͺ¨λ¦¬ ꡬ쑰

 

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 λ©”λͺ¨λ¦¬λŠ” μ„œλ‘œ λ™μ‹œμ— 읽고 μ“Έ 수 있으며, ν•œ μŠ€λ ˆλ“œκ°€ μžμ›μ„ λ³€κ²½ν•˜λ©΄ λ‹€λ₯Έ 이웃 μŠ€λ ˆλ“œλ„ κ·Έ κ²°κ³Όλ₯Ό μ¦‰μ‹œ λ³Ό 수 μžˆλ‹€.

- μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œκ°€ λ™μΌν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό ν™œμš©ν•˜λ©΄μ„œ μž‘μ—…μ„ μ—¬λŸ¬ 개 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ—, λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ νš¨μœ¨μ μ΄λ‹€.

 

 

μ°Έκ³ : Register λŠ” Stack 의 μ΅œμƒλ‹¨ κ°’μ˜ μ£Όμ†Œλ₯Ό μΆ”μ ν•˜λŠ” 포인터이닀.

 

+) 참고둜 μ½”μ–΄ 수 ν•˜λ‚˜λ‹Ή ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€. λ§Œμ•½ μ½”μ–΄κ°€ 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++ 에 κΈ°λ°˜ν•˜κΈ° λ•Œλ¬Έμ΄λΌκ³  ν•œλ‹€. λ„ˆλ¬΄ μ‹ κΈ°ν•˜κ³  μž¬λ°Œλ‹€. 

 

 

✨  참고자료

λŒ“κΈ€