250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

Node.js에서 주로 사용되는 libuv 알아보기 본문

[Snow-ball]프로그래밍(컴퓨터)/NPM

Node.js에서 주로 사용되는 libuv 알아보기

Snow-ball 2024. 3. 30. 16:50
반응형

노드js에서 사용되는 비동기 I/O 작업을 처리하는 핵심 라이브러리 libuv가 존재한다.

 

libuv란?

libux는 Node.js에서 사용하는 크로스 플랫폼 비동기 I/O 라이브러리이다. 이 라이브러리는 Node.js가 비동기식 이벤트 주도 아키텍처를 구현하고, 효율적으로 확장 가능한 네트워크 애플리케이션을 개발할 수 있도록 지원한다. libuv는 UNIX 기반 시스템과 windows에서 비동기 I/O를 지원하기 위해 설계되었다.

 

정리하자면, 자바스크립트는 원래 브라우저에서 사용자 인터페이스와 상호 작용하는 스크립트 언어로 시작하였다. 브라우저 환경에서는 UI가 멈추지 않고 부드럽게 동작해야 하므로, 비동기 처리가 중요하여 자바스크립트는 이벤트 루프와 콜백 함수를 사용하여 비동기 작업을 처리하도록 설계하였다. 그리고 Node.js는 V8 javascript 엔진 위에 구축되었으며, javascript의 싱글 스레드 모델을 그대로 유지하였다. 그렇다면 Node.js에서도 javascript 코드가 한 번에 하나의 작업만 처리하고, I/O 작업이나 네트워크 요청 등은 비동기 방식으로 처리된다는 것이다. 하지만, Node.js에서 비동기 논블로킹 I/O 처리는 javascript의 이벤트 기반 모델과 결합하여, I/O 작업이 백그라운드(libuv)에서 수행되도록 한다. 결국 libuv 라이브러리는 Node.js가 비동기 논블로킹 I/O 작업을 효율적으로 처리할 수 있도록 지원하며, 이 작업은 Node.js의 메인 스레드와는 독립적으로 수행되며 멀티스레드로 처리된다.

 

 

 


 

 

 

위의 그림은 libuv의 설계이다. libuv는 다양한 운영 체제에서 효율적으로 동작하도록 설계되었다.

각 기능들에 대해서 알아보자.

 

1. Network I/O (TCP, UDP, TTY, Pipe): libuv는 비동기 네트워크 통신을 위한 TCP와 UDP 소켓을 지원한다. 또한, 터미널(TTY) 및 파이프(Pipe) 연산도 비동기적으로 처리할 수 있다.

2. File I/O: 비동기 파일 시스템 작업을 지원하여 파일 읽기/쓰기 작업을 비동기적으로 처리할 수 있다.

3. DNS Ops: DNS 조회와 같은 네트워크 이름 해석도 비동기적을 처리한다.

4. User code: 사용자의 코드가 비동기 작업을 요청할 때, libuv를 통해 이를 스케줄링하고 실행한다.

5. epoll, kqueue, event ports: 리눅스, BSD, 솔라리스 같은 유닉스 기반 시스템에서 비동기 I/O 이벤트를 폴링하는 메커니즘이다. 

6. IOCP: I/O Completion Ports는 Windows에서 비동기 I/O 작업을 관리하는 메커니즘이다.

7. Thread Pool: libuv의 내부 스레드 풀에서는 복잡한 작업이나, 비동기로 처리할 수 없는 블로킹 작업을 처리한다.

 

 

 


 

 

 

libuv의 주요 기능:

1. 이벤트 루프: libuv는 이벤트 기반 프로그래밍 모델을 사용하며, 중앙 이벤트 루프를 통해 비동기 이벤트를 관리한다. 이벤트 루프는 I/O작업, 타이머, 신호 처리 등 다양한 종류의 이벤트를 처리한다.

2. 비동기 I/O: 파일 시스템 작업, 네트워크 I/O 등 비동기 I/O 작업을 지원한다. 이를 통해 애플리케이션 I/O 작업을 기다리는 동안 다른 작업을 계속 처리할 수 있다.

3. 스레드 풀: libuv는 파일 시스템 작업과 같이 비동기적으로 수행할 수 없는 작업을 위해 내부 스레드 풀을 사용한다. 이 스레드 풀은 작업을 병렬로 처리하여 성능을 향상시킵니다.

4. 타이머와 시간 제어: 지연 실행 또는 주기적 실행을 위한 타이머 기능을 제공한다.

5. 신호 처리: 운영 체제로부터의 신호를 처리할 수 있는 기능을 제공한다.

 

libuv는 Node.js의 비동기 및 이벤트 주도 아키텍처의 핵심 구성 요소이다. Node.js 개발자가 직접 libuv를 사용하는 경우는 드물지만, Node.js의 내부 작동 방식을 이해하는 데 있어 libuv는 중요한 부분을 차지 한다.

 

 

 


 

 

 

libuv의 이벤트 루프 처리 단계

1. 페이즈(Phases) 개요: libuv의 이벤트 루프는 여러 페이즈를 순차적으로 실행한다. 각 페이즈는 특정 유형의 작업을 처리하도록 설계되어 있다. 각 페이즈는 특정 유형의 작업을 처리하도록 설계되어 있다. 주요 페이즈로는 timers, I/O callbacks, idle, prepare, poll, check, close callbacks 등이 있다.

2. Timers 페이즈: 이 페이즈에서는 'setTimeout()' 또는 'setInterval()'에 의해  지정된 시간이 경과했을 때 실행되어야 하는 콜백을 처리한다. 타이머 콜백은 정확한 시간에 실행될 수 있도록 예약되어 있다.

3. I/O Callbacks 페이즈: 대부분의 비동기 I/O 작업이 완료된 후, 해당 작업과 관련된 콜백이 이 페이즈에서 실행된다. 이는 파일 시스템 작업, 네트워크 작업 등의 콜백을 포함한다.

4. Poll 페이즈: 이 페이즈에서는 새로운 I/O 이벤트 폴링(대기)하고, 이미 완료된 I/O 이벤트의 콜백을 실행한다. 폴 페이즈는 논블로킹 I/O 작업의 완료를 감지하고 관련 콜백을 처리한다.

5. Check 페이즈: 이 페이즈에서는 'setImmediate()'에 의해 등록된 콜백이 실행된다. 이 콜백들은 폴 페이즈가 완료된 직후에 바로 실행되어야 할 작업들이다.

6. Close Callbacks 페이즈: 이 페이즈에서는 소켓이나 핸들과 같은 리소스들이 닫혔을 때 실행되는 콜백 함수들이 처리된다.

 

libuv의 이벤트 루프는 이러한 페이즈들을 순환하면서 비동기 I/O 작업을 효율적으로 관리하고 처리한다. 각 페이즈는 특정 유형의 작업을 책임지며, 루프는 이벤트가 발생하거나 작업이 있을 때 지속적으로 순환한다.

 

 

 

 

 

 

 

반응형
Comments