[Node.js] libuv 의 Design overview

Language/Node.js 2020. 2. 23. 00:27 posted by TechNote.kr


libuv

Node.js 를 위해 작성된 cross-platform 을 지원하는 라이브러리
(Event-driven (이벤트 기반) asynchronous (비동기) I/O (입출력)을 지원하기 위해 설계)

 

libuv 의 전반적인 Design overview

출처 : http://docs.libuv.org

 

I/O (혹은 Event) loop 는 libuv 의 핵심 부분으로 모든 I/O 동작에 대해 Single thread 에서 처리 될 수 있도록 한다. 그리고 loop 가 반복되는 동안 I/O waiting 을 하지 않으므로 별도로 들어온 I/O 작업에 대해 수행할 수 있다.

 

 

Network I/O

libuv의 모든 Network I/O 는 non-blocking socket 위에서 동작하도록 되어 있다. 이를 위해 각 platform 에서 지원하는 방식을 사용하는데 Linux 에서는 epoll, OSX 및 기타 BSD 에서는 kqueue, SunOS 에서는 event ports, Windows 에서는 IOCP 를 사용한다.  

 

 

Network I/O 외 기타 I/O

libuv 에서는 Network I/O 외에도 하기 I/O 들 또한 지원한다. 

  • File system operations
  • DNS functions (getaddrinfo and getnameinfo)
  • User specified code via uv_queue_work()

 

 Network I/O 와는 달리 각 platform에서는 해당 기능을 위한 non-blocking I/O 를 지원하는 기능이 마땅치 않다. 이에 따라 기본적으로 사용되는 blocking 을 thread pool 을 통해 접근하는 방식을 취하고 있다. 

 

 File I/O의 경우 thread pool 을 통한 접근 외에도 cross-platform file I/O 방식을 통하기도 한다.

(관련 링크 : https://blog.libtorrent.org/2012/10/asynchronous-disk-io/)

 

 

참고 문헌

http://docs.libuv.org/en/v1.x/design.html