InterviewHubPRO
Section Overview
Q1

Question 1 of 60

Part 1: Intro, Candid Experience & Architecture (1 - 5)

2%
Node.js & Libuv•Part 1: Intro, Candid Experience & Architecture (1 - 5)

What is Node.js, and how does its single-threaded, event-driven, non-blocking I/O runtime work?

In Simple Words: Node.js is an open-source, cross-platform JavaScript runtime environment built on Google Chrome's V8 JavaScript engine and the Libuv C library, created by Ryan Dahl in 2009. It enables JavaScript to run directly on server operating systems outside the browser.

Core Architectural Mechanics:

  1. Single JavaScript Thread: User JavaScript code runs on a single main thread, eliminating thread synchronization bugs, deadlocks, and thread-per-connection memory overhead.
  2. Non-Blocking Asynchronous I/O: Network sockets, HTTP requests, and disk operations are non-blocking. When an I/O operation begins, Node.js offloads the operation to the operating system kernel via Libuv abstractions (epoll on Linux, kqueue on macOS, IOCP on Windows).
  3. Libuv Event Loop: The Event Loop continuously coordinates execution through phases:
    • Timers (setTimeout, setInterval)
    • Pending Callbacks (I/O callbacks)
    • Poll (retrieves new I/O events)
    • Check (setImmediate)
    • Close Callbacks (socket.on('close')) (Microtasks from process.nextTick and resolved Promise callbacks drain between every phase).
  4. Libuv Thread Pool: For operations where OS asynchronous primitives do not exist (file system I/O, DNS lookup, crypto hashes, compression), Libuv uses an internal worker thread pool (default 4 threads, configurable up to 1024 via UV_THREADPOOL_SIZE).
typescript
// Demonstrating non-blocking asynchronous I/O vs synchronous blocking:
import fs from 'fs/promises';

async function nonBlockingWorkflow() {
  console.log('1. Initiating asynchronous non-blocking file read...');
  
  // Non-blocking: Libuv offloads to worker thread pool, main thread remains free
  const readPromise = fs.readFile('package.json', 'utf8');
  
  console.log('2. Main thread continues immediately to handle other operations!');
  
  const data = await readPromise;
  console.log(`3. File read complete: ${JSON.parse(data).name} (runtime uptime: ${process.uptime()}s)`);
}

nonBlockingWorkflow();