Comments (22)
libuv
의 공식 홈페이지 설명을 보면 아래와 같이 소개되어 있습니다.
libuv is cross-platform support library which was originally written for Node.js. It’s designed around the event-driven asynchronous I/O model.
즉, libuv
는 비동기 입출력, 이벤트 관련 기능을 지원하기 위해 OS 커널을 추상화한 라이브러리라고 생각할 수 있습니다.
그래서 이벤트 루프는 특정 라이브러리라기보다는 비동기 처리를 하는 방법 중 하나이고 libuv
가 이를 구현했다고 생각하면 편합니다.
위 사진을 보면 알 수 있듯이 Node.js
는 비동기 처리를 libuv
에게 위임하는데 libuv
는 내부적으로 여러 Phase
를 나누어서 비동기 처리를 하고 이 방법이 이벤트 루프라고 생각하면 될 것 같습니다.
그래서 이벤트 루프는 종종 이벤트 드리븐을 구현하는 방법으로 많이 이야기 되고
Spring WebFlux 또한 요청을 처리하기 위해 이벤트 루프를 사용하는 것을 알 수 있습니다.
- 이 부분에 대해서는 다른 글이나 공식 문서에서도 자세한 내용이 없어서 확실하지는 않지만 제가 이해한 바는 아래와 같습니다.
Node.js
는V8
엔진을 기반으로 돌아가기가 때문에js
코드의 실행 또한V8
엔진이 맡게 됩니다. 따라서 이벤트 루프가 생성되고 전체 코드 실행이 완료되면 기다리고 있는 비동기 로직들이 이벤트 루프의 각 페이즈의 큐에 담기게 됩니다.
예를 들어서 main.js
에서 구글에 HTTP 요청을 하나 보냈다면 Poll Phase
에 HTTP 응답을 기다리는 무언가가 큐에 담기게 됩니다. 구글로부터 HTTP 응답이 오면 libuv
는 FD(File Descriptor)
를 통해서 응답이 왔다는 사실을 알게되고 이 FD
와 매칭되는 콜백을 Poll Phase
의 큐에서 찾아서 실행하게 됩니다.
이때 콜백은 결국 js
코드가 되므로 libuv
가 이 콜백을 V8
엔진을 사용해서 실행한다고 생각하면 됩니다. 실제로 libuv
는 이벤트 루프 안에 v8::Isolate
, v8::Context
등을 가지고 있는데 이것을 사용해서 콜백 코드를 실행한다고 생각하면 됩니다.
만약 HTTP 응답 콜백에서 네이버에 HTTP 요청을 보내는 코드가 있다면 아래와 같은 순서로 진행된다고 생각하면 됩니다.
main.js
에서 구글에 HTTP 요청 보냅니다.- 네트워크 요청을 보냄에 따라서
FD
가 할당되고libuv
는Poll Phase
에서 이FD
를 기다리는 콜백을 큐에 넣습니다. - 구글로부터 HTTP 응답이 오면
libuv
는FD
를 통해 응답이 온 것을 감지하고 이FD
에 대응되는 콜백을Poll Phase
의 큐에서 찾아서V8
엔진으로 이 콜백을 실행합니다. - 이 콜백을 실행하면 네이버에 다시 HTTP 요청을 보내고
FD
가 할당되고 이FD
를 기다리는 콜백이 다시Poll Phase
의 큐에 들어갑니다. - 네이버 HTTP 응답이 오면 다시
libuv
는Poll Phase
의 큐에서 콜백을V8
엔진으로 실행합니다. - 이러한 과정이 이벤트 루프에 남아있는 콜백이 없을 때까지 반복됩니다.
.
- 핵심 동작은 비슷할 수 있지만 구현이 달라 세부적인 동작이 다를 수도 있습니다.
실제로Chrome
은libevent
를 사용하고Node.js
는libuv
를 사용합니다.
찾아보니까 아래와 같은 Node.js
와 브라우저 비교 글도 있네요.
저도 자세한 내용은 몰라서 아래 내용들을 참고해보면 좋을 것 같습니다.
https://www.youtube.com/watch?v=u1kqx6AenYw
https://stackoverflow.com/questions/25750884/are-there-significant-differences-between-the-chrome-browser-event-loop-versus-t
https://yoeubi28.medium.com/browser-vs-node-event-loop-차이-9c87f858051d
https://blog.insiderattack.net/javascript-event-loop-vs-node-js-event-loop-aea2b1b85f5c
https://www.reddit.com/r/javascript/comments/downgn/askjs_event_loop_browser_vs_node/
from blog.
@dontbesatisfied
make
의 j
옵션은 빌드를 할 때 병렬적으로 할당하는 작업의 개수를 말합니다. 컴퓨터 코어 수에 맞게 적당한 값을 적어주시면 됩니당
-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If
there is more than one -j option, the last one is effective. If the
-j option is given without an argument, make will not limit the
number of jobs that can run simultaneously.
from blog.
와우... 정말 궁금했던 내용이고 공식문서를 봐도 잘 이해가 안되었던 부분인데 너무 잘 설명해주셔서 감사합니다!!
글을 읽다가 추가로 궁금한점이 생겨서 몇가지 질문을 드리고 싶습니다!
- 이벤트 루프는 libuv에 포함되어 있는건가요?
- 이벤트 루프의 각 Phase에서는 비동기 처리 로직을 libuv에 위임하고 libuv에서 요청을 처리한 이후 콜백을 해당 Phase 큐에 담아주는걸까요?
- Nodejs 이벤트루프 방식과 브라우저의 이벤트루프 방식은 차이가 있을까요?
from blog.
정말 꼼꼼한 답변 감사드립니다!
이해가 잘 안되었던 부분이었는데 이제야 이해가 되네요 ㅎㅎ
좋은 글 보고 자극 얻어갑니다!
from blog.
정말 좋은 글 감사드립니다. 이벤트 루프에 대해 이해가 전혀 되지 않았는데, 글을 읽고 크게 도움을 얻을 수 있었습니다. 계속 반복해서 글을 보면서, 공부하고 있는데 혹시 이 글을 보고 공부한 내용을 블로그에 출처를 남기고 작성해도 괜찮을까요?
from blog.
@epitoneproject 넵 괜찮습니다!
from blog.
정성이 느껴지는 게시글입니다. 재밌게 정독할 수 있었습니다!
from blog.
해당 레포에서
make -j n 의 n이 의미하는것이 무엇인가요?
from blog.
작성자님의 정성으로 제 시간을 세이브했네요 ㅠㅠ... 너무 감사합니다...!!!!
from blog.
정성 가득한 글 너무 잘 읽었습니다. 많은 도움이 되었습니다 :)
from blog.
최고의 글입니다.
from blog.
정말 자세한글 감사합니다!
from blog.
엄청난 글이군요
from blog.
다 읽는데 두시간이 걸렸습니다.
좋은 글 정말 감사합니다 :)
from blog.
정보 정리가 잘되어있네요. 감사합니다.
from blog.
노드 내부 코드가 저렇게 생겼군요! 자세한 글 감사합니다.
from blog.
감사합니다.
from blog.
집요함에 감탄하고 갑니다 ㅎㅎ
from blog.
지금까지 본 글 중에 최고에요. 감사합니다.
from blog.
유용한 정보 감사합니다. 혹시 해당 글에서 적혀진 node 스레드 개수 확인하는 사진은 어떤 명령어를 치면 나오는 결과물인가요..?
from blog.
너무 재미있게 잘 읽었습니다!
from blog.
많은 수고가 묻어나오는 글이네요. 이벤트 루프 리마인드에 많은 도움이 됐습니다. 개인적으로 이벤트 루프에 대하 포스팅을 할까 했는데 이 글보다 더 잘 쓸런지 모르겠어서 보류해야겠네요 😅
from blog.
Related Issues (5)
- military/ HOT 1
- backtick-fix/ HOT 3
- ERESOLVE-unable-to-resolve-dependency-tree/ HOT 1
- ngrinder-ecs/ HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from blog.