블로킹 I/O는 연산이 끝날 때까지 호출한 스레드를 멈추고, 논블로킹 I/O는 즉시 반환하여 연산이 완료되는 동안 스레드가 다른 일을 하게 합니다. 동기 vs 비동기는 API 수준에서 같은 개념을 기술합니다.
동작 방식
- 블로킹 / 동기: 스레드가 데이터가 도착할 때까지
read()에서 멈춰 대기합니다. 단순하지만 그동안 스레드는 놀고 있죠 — 느린 클라이언트 N개를 처리하려면 N개의 스레드가 필요합니다.
블로킹 I/O는 연산이 끝날 때까지 호출한 스레드를 멈추고, 논블로킹 I/O는 즉시 반환하여 연산이 완료되는 동안 스레드가 다른 일을 하게 합니다. 동기 vs 비동기는 API 수준에서 같은 개념을 기술합니다.
read()에서 멈춰 대기합니다. 단순하지만 그동안 스레드는 놀고 있죠 — 느린 클라이언트 N개를 처리하려면 N개의 스레드가 필요합니다.Blocking: ──[ wait for disk ]── (thread stuck, does nothing)
Non-blocking: ──▶ returns now; event loop notified when ready
// Blocking: nothing else runs until the file is read
const data = fs.readFileSync('big.txt');
// Non-blocking: thread keeps going; callback fires later
fs.readFile('big.txt', (err, data) => { /* handle later */ });
// or async/await on top of non-blocking primitives
const data2 = await fs.promises.readFile('big.txt');
이것이 확장 가능한 서버의 핵심입니다. Node.js와 nginx가 적은 스레드로 막대한 수의 연결을 처리하는 것은 바로 I/O가 논블로킹이기 때문입니다 — 대기가 스레드를 붙잡아두지 않죠. 스크립트에서는 단순함을 위해 블로킹 호출을 쓰고, 고동시성 네트워크 서비스에는 논블로킹을 쓰되, CPU를 많이 쓰는 작업으로 이벤트 루프를 절대 블로킹하지 마세요.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기