<star />

이벀트 루프와 νƒœμŠ€ν¬ 큐 λ³Έλ¬Έ

JavaScript πŸ“

이벀트 루프와 νƒœμŠ€ν¬ 큐

별깅 2022. 12. 18. 15:07
728x90

(κ°€μš”κ³„μ—λŠ” λ”λ³΄μ΄μ¦ˆ 큐가 μžˆλ‹€.)

 

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•œλ‹€. πŸ™‚

 

μ‹±κΈ€ μŠ€λ ˆλ“œ 방식은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 1️⃣

 

ν•˜μ§€λ§Œ, λΈŒλΌμš°μ € λ™μž‘μ„ μ‚΄νŽ΄λ³΄λ©΄ μˆ˜λ§Žμ€ νƒœμŠ€ν¬κ°€ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§„λ‹€. πŸŒͺ

 

 

 

1) 이벀트 루프

- μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μ‹œμ„± (concurrency) 을 μ§€μ›ν•œλ‹€.

- λΈŒλΌμš°μ €μ— λ‚΄μž₯된 κΈ°λŠ₯ 쀑 ν•˜λ‚˜.

 

⭐️ 콜 μŠ€νƒ (call stack)

- μ†ŒμŠ€ μ½”λ“œ (μ „μ—­ μ½”λ“œλ‚˜ ν•¨μˆ˜ μ½”λ“œ λ“±...) 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³ , μ œκ±°λ˜λŠ” μŠ€νƒ 자료ꡬ쑰인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄ λ°”λ‘œ 콜 μŠ€νƒμ΄λ‹€.

- ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 순차적으둜 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ 순차적으둜 μ‹€ν–‰λœλ‹€.

- μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 단 ν•˜λ‚˜μ˜ 콜 μŠ€νƒμ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ΅œμƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ (μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ) κ°€ μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ 제거되기 μ „κΉŒμ§€λŠ” λ‹€λ₯Έ μ–΄λ–€ νƒœμŠ€ν¬λ„ μ‹€ν–‰λ˜μ§€ μ•ŠμŒ.

 

⭐️ νž™ (heap)

- 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀.

- 콜 μŠ€νƒ μš”μ†ŒμΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” νž™μ— μ €μž₯된 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.

- λ©”λͺ¨λ¦¬μ— 값을 μ €μž₯ν•˜λ €λ©΄ λ¨Όμ € 값을 μ €μ •ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό κ²°μ •ν•΄μ•Ό 함. κ°μ²΄λŠ” μ›μ‹œ κ°’κ³ΌλŠ” 달리 크기가 μ •ν•΄μ Έ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ ν• λ‹Ήν•΄μ•Ό ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό λŸ°νƒ€μž„μ— κ²°μ •. 즉, 동적 ν• λ‹Ήν•΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ, 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간인 νž™μ€ κ΅¬μ‘°ν™”λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” νŠΉμ§•μ΄ 있음.

 

콜 μŠ€νƒκ³Ό νž™μœΌλ‘œ κ΅¬μ„±λœ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ‹¨μˆœνžˆ νƒœμŠ€ν¬κ°€ μš”μ²­λ˜λ©΄ 콜 μŠ€νƒμ„ 톡해 μš”μ²­λœ μž‘μ—…μ„ 순차적으둜 μ‹€ν–‰ν•œλ‹€.

비동기 μ²˜λ¦¬μ—μ„œ μ†ŒμŠ€μ½”λ“œμ˜ 평가와 싀행을 μ œμ™Έν•œ λͺ¨λ“  μ²˜λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 κ΅¬λ™ν•˜λŠ” ν™˜κ²½μΈ λΈŒλΌμš°μ € or Node.jsκ°€ 담당함.

 

예λ₯Ό λ“€μ–΄, λΉ„λ™κΈ°λ‘œ λ™μž‘ν•˜λŠ” setTimeout 의 μ½œλ°±ν•¨μˆ˜μ˜ 평가와 싀행은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ‹΄λ‹Ήν•˜μ§€λ§Œ,

호좜 μŠ€μΌ€μ€„λ§μ„ μœ„ν•œ 타이머 μ„€μ •κ³Ό μ½œλ°±ν•¨μˆ˜μ˜ 등둝은 λΈŒλΌμš°μ € or Node.js κ°€ λ‹΄λ‹Ήν•œλ‹€.

 

λΈŒλΌμš°μ €λŠ” νƒœμŠ€ν¬ 큐와 이벀트 루프λ₯Ό μ œκ³΅ν•œλ‹€.

 

⭐️ νƒœμŠ€ν¬ 큐 ( task queue / event queue / callback queue )

- setTimeout, setInterval κ³Ό 같은 비동기 ν•¨μˆ˜μ˜ μ½œλ°±ν•¨μˆ˜, 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­.

>>>> ν”„λ‘œλ―ΈμŠ€μ˜ 후속 처리 λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐도 μ‘΄μž¬ν•¨. <<<<

 

⭐️ 이벀트 루프 (event loop)

- 콜 μŠ€νƒμ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μžˆλŠ”μ§€ 유무 νŒλ‹¨.

- νƒœμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜ (μ½œλ°±ν•¨μˆ˜, 이벀트 ν•Έλ“€λŸ¬...λ“±) κ°€ μžˆλŠ”μ§€ 반볡 확인.

- 콜 μŠ€νƒμ΄ λΉ„μ–΄ 있고, νƒœμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ 이벀트 λ£¨ν”„λŠ” 순차적 (FIFO : First In First Out) 으둜 νƒœμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜λ₯Ό 콜 μŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚¨λ‹€.

μ΄λ•Œ, 콜 μŠ€νƒμœΌλ‘œ μ΄λ™ν•œ ν•¨μˆ˜λŠ” 싀행됨. 즉, νƒœμŠ€ν¬ 큐에 μΌμ‹œ λ³΄κ΄€λœ ν•¨μˆ˜λ“€μ€ 비동기 처리 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

function foo () {
	console.log("foo");
}

function bar() {
	console.log("bar");
}

setTimeout(foo, 0);	// 0μ΄ˆκ°€ μ•„λ‹ˆλΌ μ‹€μ œλŠ” 4ms 이닀. 4ms 후에 foo ν•¨μˆ˜κ°€ 호좜됨.
bar()

 

μ „μ—­ μ½”λ“œ 및 λͺ…μ‹œμ μœΌλ‘œ 호좜된 ν•¨μˆ˜κ°€ λͺ¨λ‘ μ’…λ£Œν•˜λ©΄ λΉ„λ‘œμ†Œ μ½œμŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ μ‹€ν–‰λœλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

κ·ΈλŸ¬λ‹ˆκΉŒ, μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•œλ‹€λŠ” 것은 λΈŒλΌμš°μ €μ— λ‚΄μž₯된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ΄λΌλŠ” 것이 μ€‘μš”ν•˜λ‹€.

즉, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜μ§€λ§Œ, λΈŒλΌμš°μ €λŠ” λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•œλ‹€.

 

setTimeout ν•¨μˆ˜μ˜ 두 κ°€μ§€ κΈ°λŠ₯인 타이머 μ„€μ •κ³Ό 타이머λ₯Ό λ§Œλ£Œν•˜λŠ”μ½œλ°± ν•¨μˆ˜λ₯Ό

νƒœμŠ€ν¬ 큐에 λ“±λ‘ν•˜λŠ” μ²˜λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•„λ‹ˆλΌ, λΈŒλΌμš°μ €κ°€ μ‹€ν–‰ν•œλ‹€.

λΈŒλΌμš°μ €μ˜ μˆ˜ν–‰κ³Ό μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ€ 병행 처리됨.

이처럼, λΈŒλΌμš°μ €μ™€ 자브슀크립트 엔진이 ν˜‘λ ₯ν•˜μ—¬ 비동기 ν•¨μˆ˜μΈ setTimeout ν•¨μˆ˜λ₯Ό 싀행함.

 

λΈŒλΌμš°μ €κ°€ μˆ˜ν–‰ -> 타이머λ₯Ό μ„€μ •ν•˜κ³  νƒ€μ΄λ¨Έμ˜ 만료λ₯Ό κΈ°λ‹€λ¦Ό. 이후 타이머가 만료되면 콜백 ν•¨μˆ˜κ°€ νƒœμŠ€ν¬ 큐에 ν‘Έμ‹œλ˜μ–΄ λŒ€κΈ°ν•¨.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μˆ˜ν–‰ -> ν•¨μˆ˜μ˜ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μƒμ„±ν•˜κ³ , 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 됨. 이후, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ 팝 됨. μ΄λ•Œ λΈŒλΌμš°μ €κ°€ μ„€μ •ν•œ μ‹œκ°„μ΄ κ²½κ³Όν–ˆλ‹€λ©΄ ν•¨μˆ˜λŠ” 아직 νƒœμŠ€ν¬ νμ—μ„œ λŒ€κΈ° 쀑인 것.

 

728x90

'JavaScript πŸ“' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

κ°€λΉ„μ§€ μ½œλ ‰ν„° (garbage collector)  (0) 2022.12.22
null κ³Ό undefined 의 차이점  (0) 2022.12.21
동기/비동기  (0) 2022.12.10
ν˜Έμ΄μŠ€νŒ…(hoisting)  (0) 2022.12.09
ν΄λ‘œμ € (Closure)  (0) 2022.12.08
Comments