Community

오늘의 오전 학습 - node.js 의 event-loop

자바스크립트의 비동기 작업은 node.js에서도 동일하게 이벤트 루프를 통해 처리가 되는데, 이에 대한 포스팅을 요약하였습니다. 참고문헌 https://medium.com/zigbang/nodejs-event-loop%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-16e9290f2b30 요약 Node.js의 구성 * V8 * 자바스크립트 엔진입니다. (heap memory 할당, call stack 실행) * js 코드를 기계어로 해석하여 OS에서 바로 실행할 수 있도록 합니다. (node.js 환경에서 자바스크립트로 file과 network의 I/O 를 처리할 수 있는 이유) * libuv * C언어로 작성된 비동기 I/O를 지원하는 라이브러리입니다. * 윈도우나 리눅스의 비동기 API가 지원하는 작업 -> 요청을 보낸 후 이벤트 큐에 저장 * 지원하지 않는 작업 -> libuv 내 별도 thread pool 에서 처리 후 이벤트 큐에 저장 이벤트 루프는 Main Thread 에서 실행 * libuv 가 별도의 thread pool 을 가지고 있다 하여 node.js가 2개의 스레드를 가지고 있다고 오해하지만, 이는 사실이 아닙니다. * 이벤트 루프는 main thread 에서 실행되며, 비동기 callback 수행될 수 있도록 도와줍니다. * 즉, callback 의 실행은 모두 하나의 call stack 에서 실행됩니다. (이 부분에 대한 코드 예시가 첨부한 포스팅에 있으니 확인하실 수 있습니다.) 6 페이즈를 가지는 이벤트 Queue * Timer * 이벤트 루프의 시작단계입니다 * setInterval, setTimeout 등 시간과 관련된 callback 을 min-heap 기반으로 처리합니다. 처리 이후 queue 로 callback 을 이동시킵니다 * Pending callbacks * 이전 루프에서 대기중인 callback 이 있는지 확인하고 있다면 실행합니다 * Idle, Prepare * Poll 페이즈를 가기위한 준비단계입니다. * Poll * 대기중인 callback 들을 call stack 에 가장 많이 올립니다 * queue 내 callback 함수들이 존재한다면, 페이즈 기간동안 queue 가 소진될 때 까지 모두 call stack으로 올려버립니다. * Check * setImmediate() 만을 위한 페이즈입니다. 이를 활용한 callback 이 있는지 확인합니다. * Close callbacks * close type의 callback 을 관리합니다. (예를 들어, socket.on('close', () => {})

알림

알림이 없습니다