inflearn logo
κ°•μ˜

Course

Instructor

"The Era of AI Clicks" Breaking Through with Principles: Node.js and CS Part 1 - V8 and Core Deconstruction

[Lecture Notes] Session 3: Understanding Asynchronous Non-blocking Architecture through the Restaurant Waiter Analogy

3κ°• 질문

Resolved

69

runeunsong5373

2 asked

0

πŸ’‘[CS 싀무 Point: OS κ³„μΈ΅μ˜ μ—­λŸ‰ ν™œμš© (epoll / kqueue)] 단일 μŠ€λ ˆλ“œλΌκ³  ν•΄μ„œ 컴퓨터가 μ •λ§λ‘œ 혼자 μΌν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 파일 μ½κΈ°λ‚˜ λ„€νŠΈμ›Œν¬ 톡신 같은 무거운 μž‘μ—…μ€ Node.jsκ°€ 직접 μ²˜λ¦¬ν•˜μ§€ μ•Šκ³ , 운영체제 컀널이 μ œκ³΅ν•˜λŠ” κ³ μ„±λŠ₯ 이벀트 톡지 API(Linux의 epoll, macOS의 kqueue λ“± μ‹œμŠ€ν…œ 콜)λ₯Ό 톡해 μš΄μ˜μ²΄μ œμ—κ²Œ μ² μ €ν•˜κ²Œ μœ„μž„(Offloading)ν•©λ‹ˆλ‹€. 즉, Node.js의 메인 μŠ€λ ˆλ“œλŠ” κ΅ν†΅μ •λ¦¬λ§Œ μ•„μ£Ό λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•  뿐, μ‹€μ œ 무거운 짐은 OS 컀널이 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ‚˜λ₯΄κ³  μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μ•ˆλ…•ν•˜μ„Έμš”, μœ„ μ„€λͺ…μ—μ„œ 질문이 μžˆμŠ΅λ‹ˆλ‹€.

μš΄μ˜μ²΄μ œμ— μœ„μž„ν•˜λŠ” μž‘μ—…κ³Ό libuv μŠ€λ ˆλ“œ ν’€μ˜ μ›Œμ»€ μŠ€λ ˆλ“œκ°€ μ–΄λ–€ 연관이 있고 μ–΄λ–»κ²Œ 유기적으둜 λ™μž‘ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

javascript node.js 컴퓨터-ꡬ쑰 frontend backend

Answer 2

1

nhcodingstudio

μ•ˆλ…•ν•˜μ„Έμš” λ°•μ€μ†‘λ‹˜, 질문 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 뢀뢄을 잘 μ΄ν•΄ν•˜κ³  λ„˜μ–΄κ°€λŠ” 것은 μ‹œμŠ€ν…œ 전체λ₯Ό μ‘°λ§ν•˜λ©° 원리λ₯Ό 기반으둜 μ œμ–΄ν•  수 μžˆλŠ” μ‹œλ‹ˆμ–΄ 레벨둜 λ‚˜μ•„κ°€κΈ° μœ„ν•΄ κΌ­ 짚고 λ„˜μ–΄κ°€μ•Ό ν•  쒋은 μ§ˆλ¬Έμž…λ‹ˆλ‹€. κ²°λ‘ λΆ€ν„° λͺ…ν™•ν•˜κ²Œ λ§μ”€λ“œλ¦¬λ©΄, λ§Žμ€ 뢄듀이 λͺ¨λ“  비동기 μž‘μ—…μ΄ μŠ€λ ˆλ“œ ν’€(Thread Pool)둜 κ°„λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Node.js(μ •ν™•νžˆλŠ” libuv 라이브러리)λŠ” μž‘μ—…μ˜ μ„±κ²©μ΄λ‚˜ ν•˜λ“œμ›¨μ–΄μ  νŠΉμ„±μ— 따라 운영체제(OS) 컀널에 직접 μœ„μž„ν• μ§€, μ•„λ‹ˆλ©΄ μžμ‹ μ΄ κ΄€λ¦¬ν•˜λŠ” μ›Œμ»€ μŠ€λ ˆλ“œ ν’€(Worker Thread Pool)에 λ˜μ§ˆμ§€λ₯Ό μ² μ €ν•˜κ²Œ λΆ„λ¦¬ν•΄μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 이 두 κ°€μ§€κ°€ μ–΄λ–»κ²Œ λ‚˜λ‰˜κ³ , 또 μ–΄λ–»κ²Œ 유기적으둜 맞물렀 λŒμ•„κ°€λŠ”μ§€ 컴퓨터 곡학(CS)의 ν•˜λ“œμ›¨μ–΄ λ ˆλ²¨λΆ€ν„° μƒμ„Ένžˆ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

본격적인 μ„€λͺ…에 μ•žμ„œ, μ‰½κ²Œ μ΄ν•΄ν•˜μ‹€ 수 μžˆλ„λ‘ 핡심 μš©μ–΄ λ„€ κ°€μ§€λ₯Ό λ¨Όμ € κ°€λ³κ²Œ 짚고 λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€. 첫째둜 μŠ€λ ˆλ“œ(Thread)λž€ 컴퓨터가 μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” κ°€μž₯ μž‘μ€ μž‘μ—…μž λ‹¨μœ„λ‘œ, μ‹λ‹Ήμ˜ 직원 ν•œ λͺ…이라고 μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. λ‘˜μ§Έλ‘œ λΈ”λ‘œν‚Ή(Blocking)은 이 직원이 κ³ κΈ°λ₯Ό ꡽느라 뢈판 μ•žμ„ λ– λ‚˜μ§€ λͺ»ν•˜κ³  λ‹€λ₯Έ μ†λ‹˜μ˜ 주문을 μ „ν˜€ λ°›μ§€ λͺ»ν•˜λŠ” 멈좀 μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€. μ…‹μ§Έλ‘œ μ˜€ν”„λ‘œλ”©(Offloading)은 λ§€λ‹ˆμ €κ°€ 직접 κ³ κΈ°λ₯Ό κ΅½μ§€ μ•Šκ³  μ£Όλ°© λ‹΄λ‹Ήμžλ‚˜ μ™ΈλΆ€ 업체에 κ·Έ 일을 λ– λ„˜κ²¨ μœ„μž„ν•˜λŠ” 효율적인 ν–‰λ™μž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ μŠ€λ ˆλ“œ ν’€(Thread Pool)은 일이 생길 λ•Œλ§ˆλ‹€ 직원을 μƒˆλ‘œ λ½‘λŠ” λŒ€μ‹ , 미리 κ³ μš©ν•΄ λ‘” 4λͺ… μ •λ„μ˜ μ „λ‹΄ λŒ€κΈ°μ‘°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

이제 ν•˜λ“œμ›¨μ–΄μ™€ CS의 κ΄€μ μ—μ„œ λˆ„κ°€ μ§„μ§œ 일을 ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ»΄ν“¨ν„°μ˜ 핡심 λΆ€ν’ˆλ“€μ€ 속도 차이가 ν½λ‹ˆλ‹€. CPUλŠ” μ΄ˆλ‹Ή μˆ˜λ§Žμ€ 연산을 ν•˜λŠ” 맀우 λΉ λ₯Έ μž₯치이며, RAM은 CPUκ°€ μž‘μ—…ν•  데이터λ₯Ό μ˜¬λ €λ‘λŠ” λ„“κ³  λΉ λ₯Έ μž‘μ—…λŒ€μž…λ‹ˆλ‹€. 반면 Network Card(NIC)λŠ” μ™ΈλΆ€ 인터넷망과 ν†΅μ‹ ν•˜λŠ” μΆœμž…κ΅¬λ‘œμ„œ μƒλŒ€μ μœΌλ‘œ 느리고 μ–Έμ œ 데이터가 μ˜¬μ§€ λͺ¨λ₯΄λŠ” νŠΉμ„±μ΄ 있으며, Storage(SSD/HDD)λŠ” 데이터λ₯Ό 영ꡬ μ €μž₯ν•˜λŠ” κ±°λŒ€ν•œ 창고둜 물리적이고 ꡬ쑰적인 ν•œκ³„ λ•Œλ¬Έμ— κ°€μž₯ λŠλ¦½λ‹ˆλ‹€.

Node.js의 메인 μŠ€λ ˆλ“œμΈ 이벀트 λ£¨ν”„λŠ” 였직 CPU와 RAM μœ„μ—μ„œλ§Œ μ•„μ£Ό λΉ λ₯΄κ²Œ λŒμ•„κ°‘λ‹ˆλ‹€. μ™ΈλΆ€ 데이터λ₯Ό κΈ°λ‹€λ €μ•Ό ν•˜λŠ” λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ΄λ‚˜, 느린 ν•˜λ“œλ””μŠ€ν¬λ₯Ό λ’€μ Έμ•Ό ν•˜λŠ” μž‘μ—…μ— 메인 μŠ€λ ˆλ“œκ°€ λ¬Άμ—¬λ²„λ¦¬λŠ” λΈ”λ‘œν‚Ή μƒνƒœκ°€ 되면 전체 μ„œλ²„κ°€ λ©ˆμΆ”κ²Œ λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ Node.jsλŠ” 이 무거운 짐듀을 μ™ΈλΆ€λ‘œ μ˜€ν”„λ‘œλ”©ν•˜μ—¬ λ„˜κΈ°λŠ”λ°, μ—¬κΈ°μ„œ 두 κ°€μ§€ λ‹€λ₯Έ κ²½λ‘œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

이 두 κ°€μ§€ μœ„μž„ κ²½λ‘œλŠ” OS 컀널과 μŠ€λ ˆλ“œ ν’€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€. libuvλŠ” 메인 μŠ€λ ˆλ“œμ—κ²Œ 비동기 μž‘μ—…μ„ λ°›μ•˜μ„ λ•Œ, 이 μž‘μ—…μ΄ λ„€νŠΈμ›Œν¬ 톡신인지 μ•„λ‹ˆλ©΄ 파일 μž…μΆœλ ₯μ΄λ‚˜ CPU 연산인지 νŒλ‹¨ν•˜μ—¬ μž‘μ—…μ„ λ‹€λ₯Έ 곳으둜 λ³΄λƒ…λ‹ˆλ‹€.

첫 번째 κ²½λ‘œλŠ” 주둜 λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ—μ„œ λ°œμƒν•˜λŠ” OS 컀널 μœ„μž„(epoll / kqueue)μž…λ‹ˆλ‹€. 운영체제(OS)λŠ” 이미 λ„€νŠΈμ›Œν¬ μΉ΄λ“œ(NIC)λ₯Ό λ‹€λ£¨λŠ” 데 μžˆμ–΄ μ „λ¬Έκ°€μž…λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ μ†ŒμΌ“ ν†΅μ‹ μ΄λ‚˜ HTTP μš”μ²­ 등이 λ“€μ–΄μ˜€λ©΄, libuvλŠ” μŠ€λ ˆλ“œ ν’€μ˜ λŒ€κΈ°μ‘°λ₯Ό μ“°μ§€ μ•Šκ³ , λŒ€μ‹  OS μ»€λ„μ—κ²Œ 이 μ†ŒμΌ“μ—μ„œ 데이터가 λ“€μ–΄μ˜€λ©΄ λ‚˜ν•œν…Œ μ•Œλ €λ‹¬λΌκ³  μ•ŒλžŒλ§Œ λ§žμΆ”κ³  λ’€λŒμ•„μ„­λ‹ˆλ‹€. μ‹€μ œλ‘œ 데이터λ₯Ό λ°›κ³  RAM에 μ μž¬ν•˜λŠ” 것은 NIC와 OSκ°€ μ•Œμ•„μ„œ μ²˜λ¦¬ν•˜λ©°, μž‘μ—…μ΄ λλ‚˜λ©΄ OSκ°€ μ•ŒλžŒμ„ 울렀 메인 μŠ€λ ˆλ“œμ—κ²Œ 가져가라고 ν†΅μ§€ν•©λ‹ˆλ‹€.

λ‹€λ§Œ μ—¬κΈ°μ„œ ν•œ κ°€μ§€ μ£Όμ˜ν•΄μ•Ό ν•  μ˜ˆμ™Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. 도메인 μ£Όμ†Œλ₯Ό IP둜 λ°”κΎΈλŠ” dns.lookup() λ©”μ„œλ“œμ˜ 경우, OS의 동기적인 μ‹œμŠ€ν…œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ„€νŠΈμ›Œν¬ μž‘μ—…μž„μ—λ„ μ˜ˆμ™Έμ μœΌλ‘œ OS 컀널이 μ•„λ‹Œ libuv μŠ€λ ˆλ“œ 풀을 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” μ‹€λ¬΄μ—μ„œ 병λͺ©μ„ 좔적할 λ•Œ μ•„μ£Ό μ€‘μš”ν•œ ν¬μΈνŠΈμž…λ‹ˆλ‹€.

두 번째 κ²½λ‘œλŠ” 주둜 파일 I/O, μ•”ν˜Έν™”, μ••μΆ•μ—μ„œ μ‚¬μš©λ˜λŠ” libuv μŠ€λ ˆλ“œ ν’€ μœ„μž„μž…λ‹ˆλ‹€. 파일 μ‹œμŠ€ν…œ 접근은 μš΄μ˜μ²΄μ œλ§ˆλ‹€ 비동기λ₯Ό μ§€μ›ν•˜λŠ” 방식이 νŒŒνŽΈν™”λ˜μ–΄ 있고, μ•”ν˜Έν™”λ‚˜ μ••μΆ• 같이 μˆœμˆ˜ν•˜κ²Œ CPUλ₯Ό 많이 써야 ν•˜λŠ” 연산은 OS μ»€λ„μ˜ 비동기 API둜 ν•΄κ²°ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ΄λ•Œ libuvκ°€ κΊΌλ‚΄ λ“œλŠ” 것이 λ°”λ‘œ κΈ°λ³Έκ°’ 4개λ₯Ό κ°€μ§„ μŠ€λ ˆλ“œ ν’€μž…λ‹ˆλ‹€. 메인 μŠ€λ ˆλ“œκ°€ 이 νŒŒμΌμ„ μ½μ–΄μ˜€λΌκ±°λ‚˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ•”ν˜Έν™”ν•΄ 달라고 ν•˜λ©΄, libuvλŠ” μŠ€λ ˆλ“œ ν’€μ˜ μ›Œμ»€ μŠ€λ ˆλ“œ 쀑 ν•˜λ‚˜λ₯Ό κΉ¨μ›Œμ„œ κ·Έ 일을 μ „λ‹΄μ‹œν‚΅λ‹ˆλ‹€. 이 μ›Œμ»€ μŠ€λ ˆλ“œλŠ” λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ—΄μ‹¬νžˆ νŒŒμΌμ„ μ½κ±°λ‚˜ 연산을 ν•œ λ’€, λλ‚˜λ©΄ 메인 μŠ€λ ˆλ“œμ—κ²Œ κ²°κ³Όλ₯Ό λŒλ €μ€λ‹ˆλ‹€. μ›Œμ»€ μŠ€λ ˆλ“œ μžμ²΄κ°€ λΈ”λ‘œν‚Ήλ˜λ”λΌλ„ 메인 μŠ€λ ˆλ“œμ™€λŠ” λΆ„λ¦¬λ˜μ–΄ μžˆμœΌλ‹ˆ 메인 μŠ€λ ˆλ“œλŠ” μ•ˆμ „ν•˜κ²Œ λ‹€λ₯Έ 일을 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 λͺ¨λ“  과정을 μ’…ν•©ν•˜μ—¬ λŒ€ν˜• λ ˆμŠ€ν† λž‘μ˜ 운영 μ‹œμŠ€ν…œμ— λΉ„μœ ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 메인 μŠ€λ ˆλ“œλŠ” 홀을 μ΄κ΄„ν•˜λŠ” 단 1λͺ…μ˜ λ§€λ‹ˆμ €λ‘œμ„œ, μ†λ‹˜μ˜ 주문을 λ°›κ³  μ™„μ„±λœ μš”λ¦¬λ₯Ό μ„œλΉ™ν•˜λŠ” κ΅ν†΅μ •λ¦¬λ§Œ ν•˜λ©° 주방에 λ“€μ–΄κ°€μ„œ 직접 μš”λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. RAM은 λ§€λ‹ˆμ €κ°€ μ£Όλ¬Έμ„œμ™€ μ™„μ„±λœ μš”λ¦¬λ₯Ό μž„μ‹œλ‘œ μ˜¬λ €λ‘λŠ” μΉ΄μš΄ν„° ν…Œμ΄λΈ” 역할을 ν•©λ‹ˆλ‹€. OS 컀널과 NICλŠ” μ™ΈλΆ€ 배달 λŒ€ν–‰μ‚¬κ°€ μŒμ‹μ„ μˆ˜λ Ήν•΄ κ°€λŠ” μžλ™ν™” λ“œλΌμ΄λΈŒμŠ€λ£¨ μ‹œμŠ€ν…œκ³Ό κ°™μœΌλ©°, libuv μŠ€λ ˆλ“œ 풀은 μ°½κ³ μ—μ„œ 무거운 μ‹μžμž¬λ₯Ό κΊΌλ‚΄μ˜€κ±°λ‚˜ μž₯μ‹œκ°„ κ³ κΈ°λ₯Ό κ΅¬μ›Œμ•Ό ν•˜λŠ” 4λͺ…μ˜ μ „λ‹΄ 특수 μž‘μ—…λ°˜κ³Ό κ°™μŠ΅λ‹ˆλ‹€.

이λ₯Ό λ°”νƒ•μœΌλ‘œ μ‚¬μš©μžκ°€ 사진첩 앱에 접속해 ν”„λ‘œν•„ 사진을 μš”μ²­ν•˜λŠ” APIλ₯Ό ν˜ΈμΆœν–ˆλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. λ¨Όμ € 인터넷망을 타고 λ“€μ–΄μ˜¨ μ†λ‹˜μ˜ μš”μ²­μ΄ μ„œλ²„μ˜ 톡신 μž₯비에 λ„μ°©ν•©λ‹ˆλ‹€. OSλŠ” 이 μš”μ²­μ„ 쑰립해 μΉ΄μš΄ν„°μΈ RAM에 μ˜¬λ €λ‘κ³  λ§€λ‹ˆμ €μΈ 메인 μŠ€λ ˆλ“œμ—κ²Œ μ•ŒλžŒμ„ μšΈλ¦½λ‹ˆλ‹€. μ•ŒλžŒμ„ 듀은 λ§€λ‹ˆμ €λŠ” 달렀가 μ£Όλ¬Έμ„œλ₯Ό ν™•μΈν•˜κ³ , 사진 νŒŒμΌμ„ μŠ€ν† λ¦¬μ§€μ—μ„œ 읽어와야 ν•œλ‹€λŠ” 것을 νŒŒμ•…ν•©λ‹ˆλ‹€. λ§€λ‹ˆμ €λŠ” 이 μž‘μ—…μ„ μžμ‹ μ΄ 직접 ν•˜κ±°λ‚˜ λ“œλΌμ΄λΈŒμŠ€λ£¨ μž₯λΉ„κ°€ ν•  수 μ—†λ‹€λŠ” 것을 μ•ŒκΈ° λ•Œλ¬Έμ—, μ¦‰μ‹œ 4λͺ…μ˜ 특수 μž‘μ—…λ°˜μΈ μŠ€λ ˆλ“œ ν’€ 쀑 λŒ€κΈ°ν•˜κ³  μžˆλŠ” 1λͺ…μ—κ²Œ μž‘μ—… μ§€μ‹œμ„œλ₯Ό λ˜μ§€κ³  λ‹€λ₯Έ μ†λ‹˜μ˜ 주문을 λ°›μœΌλŸ¬ ν™€μ—°νžˆ λ– λ‚©λ‹ˆλ‹€.

κ·Έλ™μ•ˆ μ›Œμ»€ μŠ€λ ˆλ“œλŠ” μ§€ν•˜ 창고둜 λ‚΄λ €κ°€ 물리적인 ν•˜λ“œλ””μŠ€ν¬λ₯Ό λ’€μ Έμ„œ 사진을 κ°€μ Έμ˜΅λ‹ˆλ‹€. μž‘μ—…μ΄ λλ‚˜λ©΄ 특수 μž‘μ—…λ°˜μ€ μΉ΄μš΄ν„°μ— 사진을 μ˜¬λ €λ‘κ³  λ§€λ‹ˆμ €μ—κ²Œ μž‘μ—…μ΄ λλ‚¬λ‹€λŠ” ν‘œμ‹œλ₯Ό λ‚¨κΉλ‹ˆλ‹€. λ§€λ‹ˆμ €λŠ” 홀을 λŒλ‹€κ°€ 이λ₯Ό 보고 μΉ΄μš΄ν„°λ‘œ μ™€μ„œ 사진을 μ±™κΈ΄ λ’€, 사진을 μ†λ‹˜μ—κ²Œ 보내기 μœ„ν•΄ λ‹€μ‹œ λ“œλΌμ΄λΈŒμŠ€λ£¨μ˜ 배좜ꡬ μ†ŒμΌ“μ— 데이터λ₯Ό 던져 λ„£κ³  OSμ—κ²Œ 전솑을 μ§€μ‹œν•˜λ©° 끝을 λ§ΊμŠ΅λ‹ˆλ‹€. μ‹€μ œ λ„€νŠΈμ›Œν¬ λ°”κΉ₯으둜 데이터λ₯Ό μ „μ†‘ν•˜λŠ” 것은 톡신 μž₯비와 OSκ°€ μ•Œμ•„μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

μš”μ•½ν•˜μžλ©΄, 메인 μŠ€λ ˆλ“œλŠ” 쉬지 μ•Šκ³  OS 컀널과 μŠ€λ ˆλ“œ ν’€ μ–‘μͺ½μœΌλ‘œ μž‘μ—…μ„ μ˜€ν”„λ‘œλ”©ν•˜μ—¬ λ˜μ§€κ³  μ™„λ£Œλœ κ²°κ³Όλ₯Ό λ°›μ•„μ˜€λŠ” 컨트둀 νƒ€μ›Œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°μ΄λ‚˜ HTTP 톡신 같은 λ„€νŠΈμ›Œν¬ 톡신은 OS 컀널이 μ „λ‹΄ν•˜λ―€λ‘œ μŠ€λ ˆλ“œ 풀을 μ „ν˜€ μ†Œλͺ¨ν•˜μ§€ μ•ŠμœΌλ©°, 이 덕뢄에 수만 개의 λ™μ‹œ 접속 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. 반면 파일 μž…μΆœλ ₯μ΄λ‚˜ μ•”ν˜Έν™”λŠ” libuv μŠ€λ ˆλ“œ 풀이 λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ₯Ό μ†Œλͺ¨ν•˜μ—¬ μ²˜λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€. 이 μž‘μ—…μ΄ λ„ˆλ¬΄ λͺ°λ¦¬λ©΄ μŠ€λ ˆλ“œ ν’€ 4κ°œκ°€ 꽉 μ°¨μ„œ 병λͺ©μ΄ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ 상황에 따라 μŠ€λ ˆλ“œ ν’€μ˜ 크기λ₯Ό μ‘°μ ˆν•˜λŠ” νŠœλ‹μ΄ ν•„μš”ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. μ΄λ•Œ Node.js의 ν™˜κ²½ λ³€μˆ˜μΈ UV_THREADPOOL_SIZEλ₯Ό μ„€μ •ν•˜μ—¬ μŠ€λ ˆλ“œ ν’€μ˜ 크기λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본값은 4μ΄μ§€λ§Œ, μ„œλ²„μ˜ 물리적 μ½”μ–΄ μˆ˜λ‚˜ μž‘μ—… νŠΉμ„±μ— 맞좰 μ΅œλŒ€ 1024κΉŒμ§€ 늘릴 수 μžˆμ–΄ μ•”ν˜Έν™”λ‚˜ μ••μΆ• 같은 무거운 μž‘μ—…μ΄ λ§Žμ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€. 이처럼 운영체제 μ‹œμŠ€ν…œ 콜과 μŠ€λ ˆλ“œ 풀은 μ„œλ‘œ λ‹€λ£¨λŠ” μ˜μ—­μ΄ λͺ…ν™•νžˆ λ‹€λ₯΄λ©°, 이벀트 루프λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ™„λ²½ν•˜κ²Œ λΆ„μ—…ν•˜μ—¬ 유기적으둜 μ„œλ²„λ₯Ό μš΄μ˜ν•˜κ²Œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, μ‹€μ œ 싀무 상황 예제λ₯Ό 톡해 이 λ©”μ»€λ‹ˆμ¦˜μ΄ μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ ν”νžˆ λ§Œλ“œλŠ” 'νšŒμ›κ°€μž… κΈ°λŠ₯'을 κ°œλ°œν•œλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 이메일과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜κ³  κ°€μž… λ²„νŠΌμ„ λˆ„λ₯΄λ©΄, λ¨Όμ € μ‚¬μš©μžμ˜ κ°€μž… 데이터가 μ„œλ²„μ— λ„μ°©ν•˜λŠ” 과정은 λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ΄λ―€λ‘œ OS 컀널이 μ „μ μœΌλ‘œ λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 데이터가 λͺ¨λ‘ λ„μ°©ν•˜λ©΄ OS 컀널이 메인 μŠ€λ ˆλ“œμ—κ²Œ μ•Œλ¦Όμ„ μ£Όκ³ , 메인 μŠ€λ ˆλ“œλŠ” μš”μ²­ 데이터λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. κ·Έλ‹€μŒ, λ³΄μ•ˆμ„ μœ„ν•΄ μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό ν•΄μ‹±(Bcrypt λ“±)ν•˜λŠ” 과정을 거쳐야 ν•˜λŠ”λ°, 이 μž‘μ—…μ€ CPU 연산을 맀우 많이 μš”κ΅¬ν•˜λŠ” 무거운 μž‘μ—…μž…λ‹ˆλ‹€. λ§Œμ•½ 메인 μŠ€λ ˆλ“œκ°€ 이λ₯Ό 직접 μ²˜λ¦¬ν•˜λ©΄ κ·Έλ™μ•ˆ λ‹€λ₯Έ μ‚¬μš©μžμ˜ 접속을 λ°›μ§€ λͺ»ν•˜λŠ” λΈ”λ‘œν‚Ή μƒνƒœκ°€ λ˜λ―€λ‘œ, 메인 μŠ€λ ˆλ“œλŠ” μŠ€λ ˆλ“œ 풀에 μžˆλŠ” μ›Œμ»€ μŠ€λ ˆλ“œμ—κ²Œ λΉ„λ°€λ²ˆν˜Έ μ•”ν˜Έν™”λ₯Ό μ˜€ν”„λ‘œλ”©ν•˜μ—¬ μœ„μž„ν•©λ‹ˆλ‹€.

μ›Œμ»€ μŠ€λ ˆλ“œκ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ•”ν˜Έν™”λ₯Ό 마치고 κ²°κ³Όλ₯Ό 돌렀주면, 이제 메인 μŠ€λ ˆλ“œλŠ” 이 μ™„μ„±λœ 데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€(DB)에 μ €μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν₯λ―Έλ‘­κ²Œλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„κ°€ DB μ„œλ²„μ™€ ν†΅μ‹ ν•˜λŠ” 과정은 내뢀망이든 외뢀망이든 κ²°κ΅­ λ„€νŠΈμ›Œν¬ ν†΅μ‹ μž…λ‹ˆλ‹€. λ”°λΌμ„œ 메인 μŠ€λ ˆλ“œλŠ” μ΄λ²ˆμ—λŠ” μŠ€λ ˆλ“œ ν’€μ˜ 직원을 λΆ€λ₯΄μ§€ μ•Šκ³ , λ‹€μ‹œ OS μ»€λ„μ—κ²Œ 데이터λ₯Ό DB둜 보내고 닡변이 였면 μ•Œλ €λ‹¬λΌκ³  μ˜€ν”„λ‘œλ”©ν•©λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ DBμ—μ„œ μ €μž₯ μ™„λ£Œ 응닡이 였면 OS 컀널이 메인 μŠ€λ ˆλ“œμ—κ²Œ μ•Œλ¦Όμ„ μ£Όκ³ , 메인 μŠ€λ ˆλ“œλŠ” λΉ„λ‘œμ†Œ μ‚¬μš©μžμ—κ²Œ κ°€μž… μ™„λ£Œ λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•˜κ²Œ λ©λ‹ˆλ‹€. 이처럼 단 ν•˜λ‚˜μ˜ νšŒμ›κ°€μž… APIλ₯Ό μ²˜λ¦¬ν•  λ•Œλ„, μž‘μ—…μ˜ 성격이 CPU 연산인지 λ„€νŠΈμ›Œν¬ 톡신인지에 따라 μŠ€λ ˆλ“œ ν’€κ³Ό OS 컀널을 μ˜€κ°€λ©° 유기적으둜 ν˜‘λ ₯ν•˜λŠ” 것이 Node.js 싀무 μ„œλ²„μ˜ 핡심 λ™μž‘ λ°©μ‹μž…λ‹ˆλ‹€.

μ°Έκ³ ν•΄μ£Όμ„Έμš”!

1

runeunsong5373

λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€. μ—¬λŸ¬ 번 λ³΅μŠ΅μ„ ν•΄μ•Όκ² λ„€μš”.

0

communityai8509

μ•ˆλ…•ν•˜μ„Έμš”, μΈν”„λŸ° AI μΈν„΄μž…λ‹ˆλ‹€. λ°•μ€μ†‘λ‹˜.

Node.js와 κ΄€λ ¨λœ κ³ μ„±λŠ₯ 이벀트 μ²˜λ¦¬μ™€ κ΄€λ ¨ν•˜μ—¬ μ€‘μš”ν•œ 사항을 μ§ˆλ¬Έν•΄ μ£Όμ…¨κ΅°μš”. λ‹€μŒμ€ 운영체제의 μ—­ν• κ³Ό libuv μŠ€λ ˆλ“œ ν’€μ˜ 연관성에 λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€.

Node.jsμ—μ„œμ˜ I/O 처리

  1. 운영체제 μ—­ν• :

    • Node.jsλŠ” 비동기 이벀트 λ“œλ¦¬λΈ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ©°, I/O μž‘μ—… 자체λ₯Ό 직접 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  μš΄μ˜μ²΄μ œμ—κ²Œ μœ„μž„ν•©λ‹ˆλ‹€.
    • μš΄μ˜μ²΄μ œλŠ” epoll(Linux)λ‚˜ kqueue(macOS)와 같은 κ³ μ„±λŠ₯ 이벀트 톡지 λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 파일 μž…μΆœλ ₯, λ„€νŠΈμ›Œν¬ μž…μΆœλ ₯ λ“±μ˜ μž‘μ—… μ™„λ£Œλ₯Ό Node.js 이벀트 루프에 ν†΅μ§€ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 방법을 톡해 Node.js 메인 μŠ€λ ˆλ“œλŠ” λΈ”λ‘œν‚Ή 없이 λ‹€λ₯Έ μž‘μ—…μ„ 계속 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. libuv μŠ€λ ˆλ“œ ν’€:

    • 일뢀 μž‘μ—…(예: 파일 μž…μΆœλ ₯, DNS 쑰회 λ“±)은 μš΄μ˜μ²΄μ œκ°€ μ œκ³΅ν•˜λŠ” 비동기 I/O APIλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , libuv의 μŠ€λ ˆλ“œ ν’€μ—μ„œ 직접 μ²˜λ¦¬λ©λ‹ˆλ‹€.
    • libuv μŠ€λ ˆλ“œ 풀은 기본적으둜 4개의 μ›Œμ»€ μŠ€λ ˆλ“œλ₯Ό κ°€μ§€κ³  있으며, μ΄λŸ¬ν•œ μŠ€λ ˆλ“œλ“€μ΄ λΈ”λ‘œν‚Ή μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • 이런 λ°©μ‹μœΌλ‘œ CPU 집약적인 μž‘μ—…μ΄λ‚˜ 였래 κ±Έλ¦¬λŠ” I/O μž‘μ—…μ΄ 메인 μŠ€λ ˆλ“œμ— 영ν–₯을 μ£Όμ§€ μ•Šλ„λ‘ λΆ„λ¦¬ν•©λ‹ˆλ‹€.

유기적인 λ™μž‘

  • Node.jsλŠ” 메인 이벀트 λ£¨ν”„μ—μ„œ λ„€νŠΈμ›Œν¬λ‚˜ 파일 μ‹œμŠ€ν…œ 같은 I/O μž‘μ—… μš”μ²­μ„ λ°›μœΌλ©΄, μž‘μ—…μ„ μš΄μ˜μ²΄μ œμ— μœ„μž„ν•˜κ±°λ‚˜ libuv μŠ€λ ˆλ“œ ν’€μ—κ²Œ λ§‘κΉλ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ λ„€νŠΈμ›Œν¬ μž‘μ—…μ€ λŒ€λΆ€λΆ„ 운영체제의 비동기 APIλ₯Ό μ‚¬μš©ν•΄ μ²˜λ¦¬λ˜μ§€λ§Œ, 일뢀 파일 μ‹œμŠ€ν…œ μž‘μ—…μ€ libuv의 μŠ€λ ˆλ“œ 풀을 μ‚¬μš©ν•˜μ—¬ λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • μ΄λŠ” μš΄μ˜μ²΄μ œμ™€ libuvκ°€ 각자의 역할을 μˆ˜ν–‰ν•˜λ©°, Node.jsκ°€ 효율적으둜 비동기 처리λ₯Ό ν•˜λ„λ‘ μ§€μ›ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

μΆ”κ°€ μžλ£Œμ™€ κ΄€λ ¨ 질문 URL:
- Understanding the Node.js Event Loop, Timers, and process.nextTick()

Node.jsκ°€ μ–΄λ–»κ²Œ 비동기 I/Oλ₯Ό 효과적으둜 μ²˜λ¦¬ν•˜λŠ”μ§€λ₯Ό μ΄ν•΄ν•˜λ©΄ 보닀 효율적인 μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 섀계할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ λ‚΄μš©μ΄ 도움이 λ˜μ…¨κΈΈ λ°”λžλ‹ˆλ‹€. μ–΄λ– ν•œ 좔가적인 μ§ˆλ¬Έλ„ μ–Έμ œλ“ μ§€ ν™˜μ˜ν•©λ‹ˆλ‹€!

μ €λŠ” μ§ˆλ¬Έμžλ‹˜μ˜ 이해λ₯Ό λ•κ³ μž μ§€μ‹κ³΅μœ μžλ‹˜μ˜ κΈ°μ‘΄ 닡변을 μ°Έκ³ ν•˜μ—¬ μœ μ‚¬ν•œ λ‹΅λ³€ 링크λ₯Ό μΆ”μ²œν•΄λ“œλ¦¬κ³  μžˆμŠ΅λ‹ˆλ‹€.
ν˜„μž¬ 베타 κΈ°λŠ₯으둜 닡변이 λ§Œμ‘±μŠ€λŸ½μ§€ μ•Šμ„ 수 μžˆλŠ” 점 μ–‘ν•΄ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€. πŸ™
μΆ”κ°€μ μœΌλ‘œ κΆκΈˆν•œ 점이 μžˆμœΌμ‹œλ©΄, μ΄μ–΄μ„œ μ§ˆλ¬Έν•΄ μ£Όμ„Έμš”. κ³§ μ§€μ‹κ³΅μœ μžκ»˜μ„œ λ‹΅λ³€ν•΄ μ£Όμ‹€ κ²ƒμž…λ‹ˆλ‹€.

cacheκ΄€λ ¨ 질문 λ“œλ¦½λ‹ˆλ‹€

0

8

0

React 와 Virtual DOM 의 이야기 μ˜μƒ 싀행이 μ•ˆλ©λ‹ˆλ‹€.

0

19

1

ν˜• μ±… μ–΄λ–»κ²Œ λ°›μ•„?

1

34

1

PPT 자료 곡유 받을 수 μžˆμ„κΉŒμš”?

0

27

1

4μ£Όμ°¨ λ―Έμ…˜ κ²Œμ‹œνŒμ΄ μ•ˆλ³΄μ—¬μš”~

0

31

2

κ°•μ˜ 일정 및 μˆ˜μ—… 자료 곡유 κ΄€λ ¨ λ¬Έμ˜λ“œλ¦½λ‹ˆλ‹€!

0

22

1

6번 질문

0

42

2

일반 κ°•μ˜μ™€ 차이점?

1

28

1

μˆ˜κ°•μ™„λ£Œ ν›„ 문의 λ“œλ¦½λ‹ˆλ‹€.

1

34

2

!= μ—°μ‚°μžμ˜ μ—­ν• 

0

28

1

JpaCursorItemReader의 μ •λ ¬ 쑰건 λΆ€μž¬μ˜ 영ν–₯

1

33

2

sizeofλŠ” 컴파일 νƒ€μž„ μ—°μ‚°μžλΌμ„œ CPUλ₯Ό μ‚¬μš©μΉ˜ μ•ŠλŠ”λ‹€

0

27

2

μ€‘μš”ν•˜μ§„ μ•Šμ§€λ§Œ μ„€λͺ…ν•˜μ‹ λΆ€λΆ„μ—μ„œ μ•ˆλœλΆ€λΆ„..

0

24

0

"컴파일 μ‹œμ μ— μ—†λŠ” 값을 μ–΄λ–»κ²Œ μ°Έμ‘°ν•  것인가?" μ„Ήμ…˜

1

43

2

κ°•μ˜ λ“£λŠ” μˆœμ„œκ°€ μ–΄λ–»κ²Œ λ˜λ‚˜μš”?

0

39

1

stopPropagation()에 λŒ€ν•΄μ„œ 질문 μžˆμŠ΅λ‹ˆλ‹€.

0

38

2

12.13) ν•˜λ‹¨ μ—¬λ°± μŠ€νƒ€μΌλ§ κ΄€λ ¨ 질문 λ“œλ¦½λ‹ˆλ‹€.

0

55

2

27κ°• Contextλ‚΄ RSC μ‚¬μš© κ΄€λ ¨ 문의

0

64

3

νŽ˜μ΄μ§• μ²˜λ¦¬μ—μ„œ offset/limit에 λŒ€ν•œ 질문

1

43

1

ν˜Ήμ‹œ λ‹€μŒ κ°•μ˜ μ œμž‘ μ˜ˆμ •λœ 것듀이 μžˆμ„κΉŒμš”?

0

60

1

Enable Linting ν•­λͺ©μ„ μ°Ύμ„μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

0

38

2

1κ°• 질문

0

53

2

aiκ°€ λ§Œλ“  κ°•μ˜μΈκ°€μš”?

0

106

1

2κ°• nodejs 3단계 μ„€λͺ… 질문

0

78

1