libuv (개념, 아키텍처, 이벤트루프, 쓰레드풀)
참조문서
nodejs의 핵심이 libuv가 아닐까한다. 여기에 이벤트루프와 쓰레드풀들이 모두 있다.
1. libuv가 무엇인가?
libuv는 비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이다. 전통적으로 IO처리는 요청마다 스레드를 사용하는 방식이다. 하지만 libuv는 비동기, 논블로킹 스타일을 사용한다. 이를 이용하기 위해 각 커널의 비동기IO를 이용한다. 리눅스의 경우에는 커널 2.6부터 적용된 AIO가 있고 윈도우에는 IOCP가 있다. 운영체제의 비동기 이벤트는 libuv의 이벤트로 취급된다. 예를들어 파일쓰기가 끝났다고 한다면, libuv층까지 전달되고 이벤트루프에 콜백이 등록된다는 것이다.
또한 윈도우와 리눅스 플랫폼의 비동기 IO인터페이스를 추상화시켰기 때문에 크로스플랫폼으로 역할도 한다. 즉 libuv를 쓰면 각 플랫폼의 가장빠른 비동기IO인터페이스로 통일된 코드로 돌릴 수 있는 장점이 있다.
아래와 같은 기능들이 포함되어 있다.
- epoll, kqueue, IOCP, 이벤트 포트가 지원하는 모든 기능을 갖춘 이벤트 루프.
- 비동기 TCP 및 UDP 소켓
- 비동기 DNS 해결
- 비동기 파일 및 파일 시스템 작업
- 파일 시스템 이벤트
- ANSI 이스케이프 코드로 제어되는 TTY
- Unix 도메인 소켓 또는 명명 된 파이프를 사용하는 소켓 공유가있는 IPC (Windows)
- 하위 프로세스
- 스레드 풀
- 시그널 처리
- 스레딩 및 동기화 프리미티브
2. libuv 아키텍처
3. 이벤트루프
event-driven 프로그래밍에서 프로그램은 특정 이벤트가 발생할 때 응답한다. 이런 이벤트를 모니터링하는 걸 libuv가 처리한다. 이벤트루프는 무한으로 돌아가며, 사용자는 이벤트가 발생했을 때 호출할 콜백함수를 등록할 수 있다.
4. nodejs의 IO작업이 처리되는 쓰레드풀
노드의 핵심철학은 비동기로 동작하며 IO작업일 경우 워커쓰레드에게 던져두고 이벤트루프는 다른일을 한다는 것이다. 이때 IO작업을 처리는 libuv가 담당하며 기본적으로 4개의 쓰레드가 있다.
하지만, 단순히 libuv에서만 처리하는게 아니라 이미 OS단에서 많은 IO작업을 지원해주고 있다.(linux의 AIO) 따라서 꼭 필요할 때만 libuv의 쓰레드풀을 사용한다.
이 쓰레드의 갯수는 일반적으로 코어의 갯수와 동일할 때가 최적이다.
출처: https://sjh836.tistory.com/99?category=710138 [빨간색코딩]
'JavaScript BackEnd > Node.js, Express' 카테고리의 다른 글
V8 inspector을 이용한 디버깅 (0) | 2021.03.18 |
---|---|
nodejs 메모리 누수 (0) | 2021.03.18 |
mongoose-auto-increment (0) | 2021.03.18 |
Mongoose 모듈 (mongodb와 혼용, 연결, 스키마, 타입, 모델, CRUD) (0) | 2021.03.18 |
워커 쓰레드풀 확장을 통한 성능튜닝 (process.env.UV_THREADPOOL_SIZE) (0) | 2021.03.18 |
request 모듈 (0) | 2021.03.18 |
Restify 모듈 (0) | 2021.03.18 |
Express 모듈 (0) | 2021.03.18 |