[node.js] 이벤트 루프 Timer Phase

Uhan33·2024년 1월 22일
0

TIL

목록 보기
14/72

이벤트 루프

우리는 이전 시간에 이벤트 루프에 대해 간단하게 알아보았다.
이벤트 루프에 여러 페이즈가 존재하는데 오늘은 그 중 Timer Phase를 알아보자

Timer Phase

말 그대로 setTimeout이나 setInterval과 같은 함수가 만들어 내는 타이머들을 다룬다.

Timer Phase는 setTimeout이 호출되었을 때 타이머의 콜백을 큐에 저장하지 않는다.
그대신 콜백을 언제 실행할 지에 정보가 담긴 타이머를 Timer Phase가 관리하는 min-heap에 넣는다.
min-heap에 타이머가 저장되어있고, 타이머를 실행할 준비가 되면(시간이 됐다면)
타이머가 가리키고 있는 콜백을 호출하는 방식이다.

이벤트 루프에서 Node.js는 현재 페이즈가 관리하는 작업들만 실행할 수 있다.
따라서 Node.js는 Timer Phase에서만 타이머를 검사한다.
즉, Node.js가 Timer Phase에 진입해야만 타이머들이 실행될 기회를 얻는다.

여기서 재미있는 사실.
우리가 Poll Phase에서 setTimeout(fn, 1)을 호출한다 해도
nodejs는 정확히 1ms뒤에 콜백이 실행됨을 보장하지 않는다.
Timer Phase에 진입하는데 1초가 걸린다면 타이머의 콜백을 실행하는 데
1ms가 아닌 '1초 + 1ms' 즉 1초 이상 걸리게 된다.

결국 현재시간에서 delay(여기선 1ms)를 더한 시간(now + delay)에 실행됨을 보장하는 것이 아니라, 적어도 now + delay 이후에 실행됨을 보장한다.

Timer Phase 또한 큐에 있는 모든 작업을 실행하거나 시스템의 실행 한도에 다다르면 다음 페이즈로 넘어간다.
Timer Phase가 어떻게 타이머를 관리하는지 조금만 자세히 더 알아보자.

Node.js가 Timer Phase에 진입하면 min-heap에서 타이머를 하나 꺼낸다.
그리고 그 타이머에 대해서 now - registeredTime >= delay 조건을 검사한다.
만약 만족한다면 타이머를 실행할 준비가 되었으므로 타이머의 콜백을 실행한다.

그리고 다시 타이머를 꺼내서 검사하는데 만약 조건을 만족하지 않는다면?
남은 타이머들은 검사하지 않고 다음 페이즈로 넘어간다.
그 이유는 min-heap이 타이머를 오름차순으로 관리하기에 검사할 필요가 없기 때문이다.
(오름차순으로 정렬되어 있으니 이후 타이머는 검사한 타이머보다 당연히 이후에 실행되어야 하는 작업들이기 때문)

추가적으로 이전에도 언급했듯이 시스템의 실행 한도에 영향을 받는다는 것을 주의해야 한다.
실행할 수 있는 타이머가 남아있다고 해도 시스템 실행 한도에 다다르면 다음 페이즈로 넘어가게 된다.

마치며..

이벤트 루프 내용은 어렵지만 재밌고 흥미롭다.
timer phase가 관리하는 방식때문에 timer 관련 함수를 사용해도 정확히 그 시간을 지키는 것이 아니라는 점도 인상깊었다. 참 재밌는 내용이다.

0개의 댓글