- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
Memory Heap
๊ณผCall Stack
์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.(ex. ๊ตฌ๊ธ์ V8 Engine) - ์๋ฐ์คํฌ๋ฆฝํธ๋
๋จ์ผ ์ค๋ ๋(Single Thread) ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์ธ๋ฐ, ์ด ์๋ฏธ๋ Call Stack์ด ํ๋๋ผ๋ ์ด์ผ๊ธฐ์ด๋ค.- Memory Heap: ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ผ์ด๋๋ ๊ณณ(ex. ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ธํ ๋ณ์, ํจ์ ๋ฑ์ด ๋ด๊ฒจ์ ธ ์์)
- Call Stack: ์ฝ๋๊ฐ ์คํ๋ ๋ ์์ด๋ ๊ณณ Stack ํํ๋ก ์์ธ๋ค. (Stack์ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก, ํ์ ์ ์ถ(LIFO) ๋ฐฉ์์ด๋ค.)
- ๋จ์ผ ์ฝ ์คํ์ ๊ฐ๋ ๋ค๋ ์๋ฏธ๋, ์์ฒญ์ด
๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ
๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. - ๋น๋๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ธ
๋ธ๋ผ์ฐ์
๋Node.js
๊ฐ ๋ด๋นํ๋ค.
- Web API๋ JS Engine์ด ์๋๋ค.
- Web API๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ API๋ก, DOM, AJAX, Timeout ๋ฑ์ด ์๋ค.
- Call Stack์์ ์คํ๋ ๋น๋๊ธฐ ํจ์๋ Web API๋ฅผ ํธ์ถํ๊ณ , Web API๋ ์ฝ๋ฐฑ ํจ์๋ฅผ Callback Queue์ ๋ฃ๋๋ค.
- Event Loop๋ Call Stack๊ณผ Callback Queue์ ์ํ๋ฅผ ์ฒดํฌํ์ฌ, Call Stack์ด ๋น ์ํ๊ฐ ๋๋ฉด, Callback Queue์ ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ ํจ์๋ฅผ Call Stack์ ๋ฃ๋๋ค.
- ์์ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ํ๋์ผ ํฑ(Tick)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๊ณผ์ ์ ๋ฆฌ)
- V8 ์์ง์์ ์ฝ๋๊ฐ ์คํ๋๋ฉด, Call Stack์ ์์ธ๋ค.
- Stack์ ํ์ ์ ์ถ์ ๋ฃฐ์ ๋ฐ๋ผ ์ ์ผ ๋ง์ง๋ง์ ๋ค์ด์จ ํจ์๊ฐ ๋จผ์ ์คํ๋๋ฉฐ, Stack์ ์์ฌ์ง ํจ์๊ฐ ๋ชจ๋ ์คํ๋๋ค.
- ๋น๋๊ธฐ ํจ์๊ฐ ์คํ๋๋ค๋ฉด, Web API๊ฐ ํธ์ถ๋๋ค.
- Web API๋ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ CallBack Queue์ ๋ฃ๋๋ค.
- Event Loop๋ Call Stack์ด ๋น ์ํ๊ฐ ๋๋ฉด Callback Queue์ ์๋ ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ์ Call Stack์ผ๋ก ์ด๋์ํจ๋ค.
- Callback Queue์๋
Task Queue
์Microtask Queue
๊ฐ ์๋ค. - Task Queue๋ setTimeout(), setInterval(), UI๋ ๋๋ง, requestAnimationFrame()์ด ๋ด๊ธด๋ค.
- Microtask Queue๋ Promise(then), MutaionObserver๊ฐ ๋ด๊ธด๋ค.
- Event Loop๋ ์ฐ์ ์ ์ผ๋ก Microtask Queue๋ฅผ ํ์ธํ๋ค. ๋ง์ฝ, Microtask Queue์ ์ฝ๋ฐฑ์ด ์๋ค๋ฉด, ์ด๋ฅผ ๋จผ์ Call Stack์ ๋ด๋๋ค. ๊ทธ๋ฆฌ๊ณ Microtask Queue์ ์ฒ๋ฆฌํด์ผ ํ ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ค๋ฉด, Task Queue์ ํ์ธ ํ ์ฒ๋ฆฌํ๋ค.
- ๋์ ์์ 1)
console.log('script start');
setTimeout(function () {
console.log('setTimeout');
}, 0);
Promise.resolve()
.then(function () {
console.log('promise1');
})
.then(function () {
console.log('promise2');
});
console.log('script end');
- ๊ฒฐ๊ณผ
script start
script end
promise1
promise2
setTimeout
- ์ ๊ฒฐ๊ณผ์ ์ด์ ๋ Promise๋ Microtask Queue์ ๋ด๊ธฐ๊ณ , setTimeout์ Task Queue์ ๋ด๊ธฐ๊ธฐ ๋๋ฌธ์, ์ฐ์ ์์๊ฐ ๋์ Promise์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋จผ์ ์คํ๋๊ณ , ๊ทธ ๋ค์ setTimeout์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ค.
console.log('์ฝ ์คํ!');
setTimeout(() => console.log('ํ์คํฌ ํ!'), 0);
Promise.resolve().then(() => console.log('๋ง์ดํฌ๋กํ์คํฌ ํ!'));
//๊ฒฐ๊ณผ
์ฝ ์คํ!
๋ง์ดํฌ๋กํ์คํธ ํ!
ํ์คํธ ํ!
- ์ ์ผ ๋จผ์ , '์คํฌ๋ฆฝํธ ์คํ' Task๊ฐ Task Queue์ ๋ค์ด๊ฐ๋ค.
- ์ดํ, ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๊ทธ Task๋ฅผ ๊ฐ์ ธ์์ ๋ก๋ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํจ๋ค. ๋ฐ๋ผ์ ๋งจ ์ฒ์์ console.log๊ฐ ์คํ ๋๋ค.
- ๊ทธ ๋ค์, setTimeout() ์ด Call Stack์ผ๋ก ๊ฐ๊ณ Web API๊ฐ ์ด๋ฅผ ๋ฐ์์ ํ์ด๋จธ๋ฅผ ๋์์ํจ๋ค.
- ํ์ด๋จธ๊ฐ ๋๋๋ฉด, setTimeout()์ ์ฝ๋ฐฑ ํจ์๋ฅผ Task Queue์ ๋ฃ๋๋ค.
- Promise๊ฐ Call Stack์ผ๋ก ๊ฐ๊ณ ์ฝ๋ฐฑ ํจ์๋ฅผ Microtask Queue์ ๋ฃ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๋ Microtask Queue์์ ์ ์ผ ์ค๋๋ Task์ธ Promise์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ฐ์ ธ์ Call Stack์ ๋ฃ๋๋ค.
- Promise์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋๋๊ณ Task Queue์์ ์ ์ผ ์ค๋ ๋ Task์ธ setTimeout()์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ฐ์ ธ์ Call Stack์ ๋ฃ๋๋ค.
- setTimeout()์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋๋๋ฉด Call Stack์ด ๋น๊ฒ ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค.
https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/event-loop.md
https://velog.io/@thms200/Event-Loop-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84