07.event-loop

이벀트 루프(event loop)κ°€ λŒ€μ²΄ 뭐야?

What the heck is the event loop anyway? | Philip Roberts | JSConf EU youtube μ˜μƒ λ³΄λŸ¬κ°€κΈ° λ₯Ό 톡해 배운 λ‚΄μš©μ„ 정리 λ§€μš°κ°•μΆ”

JavaScript

A single-threaded non-blocking asynchronous concurrent language. μ‹±κΈ€ μŠ€λ ˆλ“œ λ…Ό 블둝킹 비동기 동적 μ–Έμ–΄

JavaScript has Call stack, an event loop, a callback queue some other apis and stuff

여기에 μžˆλŠ” 단어듀을 ν•˜λ‚˜μ”© νŒŒμ•…ν•΄ 보자!

  • μ‹±κΈ€ μŠ€λ ˆλ“œ

  • λΈ”λ‘œν‚Ή

  • 비동기

  • call stack

  • event loop

  • callback queue

  • apis

event loopλ₯Ό μœ„ν•΄.. μ•Œμ•„μ•Ό ν• κ²Œ μ°Έ λ§Žκ΅¬λ‚˜.

μ‹±κΈ€ μŠ€λ ˆλ“œ

ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ€ λ™μ‹œμ— ν•˜λ‚˜μ˜ μ½”λ“œλ§Œ μ‹€ν–‰ν•  수 μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λŸ°νƒ€μž„μ„ κ°€μ§€κ³  μžˆμ–΄, κ²°κ΅­ ν•œλ²ˆμ— ν•˜λ‚˜μ˜ μ‹±κΈ€ 콜 μŠ€νƒλ§Œμ„ κ°€μ§€κ³  μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€μŠ€λ ˆλ“œλ‹€.

blocking

느리게 λ™μž‘ν•˜λŠ” μ½”λ“œ, 주둜 느린 λ™μž‘μ΄ μŠ€νƒμ— λ‚¨μ•„μžˆλŠ” 경우λ₯Ό λ§ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ…Ό-λΈ”λ‘œν‚Ήμ΄λ‹€.

동기 vs 비동기 (synchronous vs asynchronous)

synchronous vs asynchronous 상단에 μžˆλŠ” κ·Έλž˜ν”„κ°€ 동기 / μ•„λž˜κ°€ 비동기닀. λ™κΈ°λŠ” 였직 ν•œκ°€μ§€ 일만 μ²˜λ¦¬ν•˜λ©° 마λƒ₯ λλ‚ λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„ - 크둬 V8

v8

μ›Ή λΈŒλΌμš°μ €λ₯Ό λ§Œλ“œλŠ” 데 κΈ°λ°˜μ„ μ œκ³΅ν•˜λŠ” μ˜€ν”ˆ μ†ŒμŠ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이닀.(μœ„ν‚€λ°±κ³Όμ°Έμ‘°) 크둬과 node.jsμ—μ„œ μ‚¬μš©λœλ‹€.

λŸ°νƒ€μž„ (runtime)

ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κ³  μžˆμ„ λ•Œ μ‘΄μž¬ν•˜λŠ” 곳을 λ§ν•œλ‹€. 이 μ΄λ―Έμ§€λŠ” V8의 λŸ°νƒ€μž„μ„ μ‹œκ°ν™” ν•œ 것이닀.

v8ꡬ성

V8의 λŸ°νƒ€μž„ - Memory Heap κ³Ό Call Stack

  • Memory Heap: λ©”λͺ¨λ¦¬ 할당이 μ΄λ£¨μ–΄μ§€λŠ” κ³³(자료ꡬ쑰 heapμ΄λž‘μ€ λ‹€λ₯΄λ‹€.)

  • Call Stack: μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ μŒ“μ΄λŠ” κ³³

V8 μ†ŒμŠ€μ—λŠ” setTimeout μ΄λ‚˜ DOM, HTTP μš”μ²­μ„ κ΄€λ¦¬ν•˜λŠ” μ½”λ“œλ“€μ€ μ°Ύμ•„ λ³Ό 수 μ—†λ‹€! 비동기 μ½”λ”©μ—μ„œ κ°€μž₯ λ¨Όμ € λ– μ˜€λ₯΄λŠ” 것듀이 μ—†λŠ”κ±°λ‹€.

λΈŒλΌμš°μ €

browser

λΈŒλΌμš°μ €λŠ” Web APIs(DOM, Ajax, timeout λ“±)와 event loop와 callback queueλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

μ½œμŠ€νƒ(Call Stack)

콜 μŠ€νƒμ€ 데이터 슀트럭처둜 μ‹€ν–‰λ˜λŠ” μˆœμ„œλ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλ‹€. ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μŠ€νƒμ— ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜λ₯Ό μ§‘μ–΄λ„£κ²Œ λ˜λŠ”λ° ν•¨μˆ˜μ—μ„œ 리턴이 μΌμ–΄λ‚˜λ©΄ μŠ€νƒμ˜ κ°€μž₯ μœ„μͺ½μ—μ„œ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό κΊΌλ‚΄κ²Œ λœλ‹€. 이게 μ½œμŠ€νƒ!

콜백 큐(Callback Queue)

ν•¨μˆ˜λ“€μ΄ μ€„μ„œμ„œ κΈ°λ‹€λ¦¬λŠ” 곡간이닀.

Run To Completion

μžλ°”μŠ€ν¬λ¦½νŠΈ μ„±μ§ˆ. ν•œλ²ˆ μ‹€ν–‰λ˜λ©΄ 끝μž₯을 λ³Έλ‹€.

console.log(1);

console.log(2);

setTimeout (function() {
  console.log(4);

  setTimeout(function() {
    console.log(6);
  }, 1000);

  console.log(5);
}, 1000);
console.log(3);

단계단계 끝μž₯을 봐야 λ‹€μŒ μˆœμ„œκ°€ 싀행될 수 μžˆλ‹€.

μ •ν™•νžˆ 2초 후에 μ‹€ν–‰λ˜λŠ”κ°€?

setTimeout(function() {
    alert(1);
},2000);

이런 ν•¨μˆ˜κ°€ μžˆλŠ”λ° μŠ€νƒ -> 콜백 큐둜 κ°€λŠ” μ‹œκ°„λ„ ν¬ν•¨λœλ‹€.

Render Queue

λ³΄μ—¬μ§ˆ μž‘μ—…λ“€μ„ 쀄 μ„Έμš΄λ‹€.

Dom Construction

λ°”μ΄νŠΈλ‘œ λ¨Όμ € λ°›λŠ”λ‹€ -> 문자둜 λ³€κ²½λœλ‹€ -> tokenν™” ν•œλ‹€. λ…Έλ“œλ‘œ λ§Œλ“€κΈ° μ „μ²˜λ¦¬ μ „ -> node(객체둜 ν•˜λ‚˜ν•˜λ‚˜ λ§Œλ“ λ‹€) -> 트리ꡬ쑰둜 λ§Œλ“ λ‹€.

DOM 트리 + CSSOM 트리 => Render Tree -> layout -> paint

Records

  • layout

  • paint - μ‹€μ œλ‘œ 픽셀을 μ±„μ›Œκ°€λŠ”.

Last updated

Was this helpful?