# * Event Loop

Written by ๐Ÿ“ Juunone

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” "๋‹จ์ผ ์Šค๋ ˆ๋“œ" ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ด๋‹ค.
๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ๋“ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ธ๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋งŽ์€ ์ž‘์—…์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๋งˆ์šฐ์Šค ์ž…๋ ฅ ๋ฐ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์ผ๋“ค์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋‹ค์ˆ˜์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” "์ด๋ฒคํŠธ ๋ฃจํ”„"์— ๊ธฐ๋ฐ˜ํ•œ ๋™์‹œ์„ฑ(concurrency) ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์ฆ‰ "์ด๋ฒคํŠธ ๋ฃจํ”„" ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์‹œ์„ฑ์„ ์ง€์›ํ•œ๋‹ค.

# Javascript Engine

  • Javascript Engine์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์„ธ๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
    • Call stack
    • Task Queue(Event Queue)
    • Heap

javascript_engine

์ถœ์ฒ˜ : Alexander Zlatkov Medium

# Stack

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์„ "Run to Completion" ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.
ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ด ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ์–ด๋–ค ์ž‘์—…๋„ ์ค‘๊ฐ„์— ์‹คํ–‰๋˜์ง€ ๋ชปํ•œ๋‹ค.
ํ˜„์žฌ ์Šคํƒ์— ์Œ“์—ฌ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์ด ์‹คํ–‰์„ ๋งˆ์น˜๊ณ  ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ๋‹ค์Œ ์š”์ฒญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์— ๋‹ด์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

function baz(){
   console.log('Hello from baz');
}
function bar() {
   baz(); 
}
function foo() {
   bar(); 
}
foo();
1
2
3
4
5
6
7
8
9
10

์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

stack_frame

์ถœ์ฒ˜ : ITNEXT Medium

# Heap

๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋“ค์€ ํž™ ์•ˆ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ํž™์€ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ๋„“์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ง€์นญํ•œ๋‹ค.

# Queue

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” Task๋“ค์„ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š”๊ณณ์ด๋‹ค. ํƒœ์Šคํฌํ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ํํ˜•ํƒœ์˜ ๋ฐฐ์—ด์ด๊ณ , ์ด๋ฒคํŠธ๋ฃจํ”„๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์›Œ์งˆ ๋•Œ๋งˆ๋‹ค ํƒœ์ŠคํŠธํ์—์„œ ํ•จ์ˆ˜๋“ค์„ ๊บผ๋‚ด์„œ ๋‹ค์‹œ ์Šคํƒ์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์ค€๋‹ค.

# Event Loop

์•ž์„œ ์„ค๋ช…๊ณผ ๊ฐ™์ด ์ด๋ฒคํŠธ๋ฃจํ”„๋Š” ์ฝœ์Šคํƒ๊ณผ ์ฝœ๋ฐฑํ๋ฅผ ๊ฐ์‹œํ•˜๋ฉด์„œ ์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์„๊ฒฝ์šฐ ์ฝœ๋ฐฑํ์—์„œ ์ฒซ๋ฒˆ์งธ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ์ฝœ์Šคํƒ์— ๋ฐ€์–ด๋„ฃ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

ํ•œ๊ฐ€์ง€ ๊ฐ€์ •์„ ํ•ด๋ณด์ž๋ฉด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ stack์— push ๋œ๋‹ค๋ฉด, ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋๋‚ ๋–„๊นŒ์ง€ ์•„๋ฌด๋Ÿฐ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋จนํ†ต์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์•„๋‹Œ Web API์— ์ •์˜๋˜์–ด์žˆ๋Š” ํ•จ์ˆ˜๋“ค์€ ๋น„๋™๊ธฐ(์ฝœ๋ฐฑ)๋กœ ์‹คํ–‰๋œ๋‹ค.

console.log('Start');

setTimeout(function() { 
    console.log('Time-out');
}, 5000);

console.log('End');

// Start
// End
// 5์ดˆ๋’ค Time-out
1
2
3
4
5
6
7
8
9
10
11

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 'Start', 'End', 'Time-out' ์ˆœ์œผ๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š”๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋จผ์ € ์Šคํƒ์— "console.log('Start')" push ๋˜๊ณ  'Start' ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์Šคํƒ์„ ๋‚˜๊ฐ„๋‹ค.
๋‹ค์Œ setTimeout() ํ•จ์ˆ˜๊ฐ€ ์Šคํƒ์— push ๋˜์ง€๋งŒ 5์ดˆ๋’ค์— ์ž‘๋™ํ•  ํ•จ์ˆ˜๋ฅผ ์Šคํƒ์— ์Œ“์•„๋‘˜ ์ˆ˜ ์—†๋‹ค. ์Šคํƒ์— ์Œ“์•„๋‘์ง€ ์•Š๊ณ  ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค. ๊ทธ๋‹ค์Œ ์Šคํƒ์— "console.log('End')" ๊ฐ€ push ๋˜๊ณ  'End' ๋ฅผ ์ถœ๋ ฅํ•œ๋’ค 5์ดˆ๋’ค "console.log('Time-out')"์ด ์Šคํƒ์— push ๋˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ 'Time-out'์„ ์ถœ๋ ฅํ•œ๋‹ค.

์œ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๊ทธ๋ฆผ์—์„œ Web APIs ์˜์—ญ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

settimeout1

setTimeout ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” Web APIs๋กœ ๋ณด๋‚ด์ง€๊ณ  ์Šคํƒ์—์„œ pop ๋œ๋‹ค.

settimeout1

Web APIs timer 5์ดˆ๋’ค ์ž‘์—…์ด ๋๋‚˜๋ฉด ํƒœ์Šคํฌํ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.

settimeout1

์ด๋ฒคํŠธ๋ฃจํ”„๋Š” ์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํƒœ์ŠคํŠธํ์˜ ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์œผ๋กœ push ํ•ด์ฃผ๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋‹จ, ์ฝœ์Šคํƒ์ด ๋น„์›Œ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํƒœ์ŠคํŠธํ์— ์žˆ๋Š” ์ž‘์—…์„ ์ฝœ์Šคํƒ์œผ๋กœ push ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ์ฒ˜ : Philip Roberts

# Reference

Last Updated: 7/5/2019, 8:38:55 AM