[기초] libuv
libuv는 비동기 I/O에 초점을 맞춘 다중 플랫폼 지원 라이브러리다.
libuv
Node.js
문서를 읽다 보면 한 번쯤은 꼭 등장하는 라이브러리이며, 비동기 I/O에 중점을 두고 있다. 최초에는 Node.js
용으로 만들어졌지만, 지금은 크로스 플랫폼을 지원한다. 여기서 중요한 점은 libuv
는 스레드 풀을 사용하여 비동기 I/O 작업을 가능하게 하지만, 네트워크 I/O는 OS에서 처리된다.

위 그림에서 보듯이 쓰레드 풀 위에서 동작하는 것은 File I/O, DNS 조회, 사용자 코드, crypto 등이지, 네트워크 I/O는 아니다. 그렇다면 마음속에 가지고 있던 아래와 같은 궁금증 하나가 약간 해소될 수 있을 것이다.
NodeJS는 분명 싱글 스레드인데, 어떻게 비동기 처리가 가능하지?
NodeJS에서 사용하고 있는 C/C++로 만든 libuv 라이브러리 때문에 가능하다.
libuv
라이브러리는 기본적으로 4개
의 thread
를 사용할 수 있다(기본적이라는 말은 커스텀도 가능하다는 말이다, 최대 libuv 1.30.0 기준 1024개).
다만, 한번 쓰레드 풀을 변경하고 첫 번째 작업이 실행되면, 두 번째 스레드 풀 변경 요청부터는 스레드 풀 크기에 영향을 주지 않는다.
스레드 풀 변경은 전역적으로 적용되며, 모든 이벤트 루프에서 공유된다.
근데 왜 NodeJS를 싱글 스레드 언어라고 하는 것일까? 자바스크립트 언어를 사용하 싱글 스레드 아닌가?
정확히 말하자면 NodeJS는 백그라운드에서 여러 쓰레드를 사용하여 비동기 코드를 실행하는 싱글 스레드 언어
Last updated
Was this helpful?