"매 single-threaded JS 가 매 cooperative scheduler 위에서 매 async 를 흉내낸다.". Call stack + task queue + microtask queue + render pipeline 이 매 tick 의 단위. Promise/async-await 는 매 syntactic sugar — runtime 은 매 microtask drain rule 로 결정.
매 핵심
매 Stack vs Queues
Call stack: 매 동기 frame. LIFO. 매 비어야 매 tick 진행.
Task queue (macrotask): setTimeout, setInterval, MessageChannel, I/O callback, UI event. 매 tick 당 1개 drain.
Microtask queue: Promise.then, queueMicrotask, MutationObserver. 매 tick 마지막에 매 전부 drain (재진입 포함).
Animation frame queue: requestAnimationFrame. 매 paint 직전.
Render steps: style → layout → paint → composite. 매 vsync 와 매 동기화.
// BAD — recursive Promise.resolve() blocks rendering
functionbad(){Promise.resolve().then(bad);// browser never paints
}// GOOD — use setTimeout(0) or MessageChannel for yielding
functiongood(){setTimeout(good,0);}
Event loop lag monitor (Node)
import{monitorEventLoopDelay}from'node:perf_hooks';consth=monitorEventLoopDelay({resolution:20});h.enable();setInterval(()=>{console.log('p99 lag ms',h.percentile(99)/1e6);h.reset();},1000);