[기초] 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개).

process.env.UV_THREADPOOL_SIZE

다만, 한번 쓰레드 풀을 변경하고 첫 번째 작업이 실행되면, 두 번째 스레드 풀 변경 요청부터는 스레드 풀 크기에 영향을 주지 않는다.

const fs = require('fs');

process.env.UV_THREADPOOL_SIZE = 10; // Works well!

fs.readFile('./jacob.html', function readFile(err, data) {
	process.env.UV_THREADPOOL_SIZE = 10; // This won't!
	
    if(err) return throw err;
    console.log(data);
}

스레드 풀 변경은 전역적으로 적용되며, 모든 이벤트 루프에서 공유된다.

근데 왜 NodeJS를 싱글 스레드 언어라고 하는 것일까? 자바스크립트 언어를 사용하 싱글 스레드 아닌가?

정확히 말하자면 NodeJS는 백그라운드에서 여러 쓰레드를 사용하여 비동기 코드를 실행하는 싱글 스레드 언어

Last updated