자바스크립트는 싱글 스레드
그리고 노드 js는 자바스크립트 언어를 사용합니다. 그리고 자바스크립트 언어는 싱글 스레드입니다. 싱글 스레드면 한 번에 하나의 작업만 할 수 있는데 노드 js를 사용할 때 보면 어떻게 비동기로 파일을 열고 HTTP 리퀘스트도 보낼 수 있을까요?
아래 도표에서 처럼 어떠한 Task들이 들어오면 Libuv에 있는 이벤트 루프를 이용해서 처리해주고 있습니다.
Libuv에 있는 Event Loop 덕분에 비동기 Input & Output 작업을 처리를 할 수 있게 됩니다.
노드를 사용할 때 비동기 함수를 콜 하면 이벤트 루프로 전달됩니다.
파일 시스템과 네트워크 작업도 똑같이 이벤트 루프로 전달됩니다.
Event Loop는 언제 코드를 실행할지 정하며, OS에게 이 함수 실행하라고 전달하고, 일이 끝나면 끝났다고 전달받습니다.
결국 새로운 이벤트를 계속 Listen 하고 OS에 전달하므로 인해서 main thread가 Block 되지 않게 합니다.
Kernel은 OS의 핵심 부분이며, 컴퓨터의 하드웨어와 통하며, 여러 스레드를 가지고 있습니다. 인터넷을 통해서 다른 컴퓨터와 통신하는 것 같은 기본 적인 Operation을 잘 처리합니다.
DNS: dns.lookup()
, dns.lookupService()
.
File System: All file system APIs except fs.FSWatcher()
and those that are explicitly synchronous use libuv's threadpool.
Crypto: crypto.pbkdf2()
, crypto.scrypt()
, crypto.randomBytes()
, crypto.randomFill()
, crypto.generateKeyPair()
.