[OS] 블로킹(Blocking)/논블로킹(Non-Blocking), 동기(Syncronous)/비동기(ASyncronous)

2026. 3. 9. 21:43·CS/운영체제

1. Blocking / Non-Blocking (제어권의 행방)

1) 블로킹(Blocking)

블로킹은 호출된 함수가 자신의 작업을 마칠 때까지 제어권(함수를 실행할 권리)을 계속 갖고 있는 상태를 뜻합니다.

즉, 호출한 함수는 작업이 끝날 때까지 다음 작업을 수행하지 못하고 대기하게 됩니다.


그림으로 알아보겠습니다.

  1. A함수는 B함수를 호출하며 제어권을 B에게 넘김
  2. B함수는 작업을 수행, A 함수는 제어권이 없기 때문에 대기
  3. B 함수는 작업 완료 후 A에게 제어권 반환
  4. A 함수 다음 작업 수행

즉, B 함수의 작업이 끝나기 전까지 A함수는 아무 작업도 못합니다.



2) 논블로킹(Non-Blocking)

논블로킹은 호출된 함수가 작업 완료 여부와 상관없이 제어권을 즉시 반환하는 상태를 뜻합니다.

즉, 호출한 함수는 작업 결과를 기다리지 않고 다음 작업을 계속 수행할 수 있습니다.

 

  1. A함수가 B함수를 호출
  2. B 함수는 작업을 시작하지만, 즉시 제어권을 A에게 반환
  3. A함수는 B 함수의 작업 완료 여부와 관계없이 계속 실행

논블로킹에서는 작업 수행과 제어 흐름이 분리될 수 있습니다.



2. Synchronous / Asynchronous(작업 완료 관리)

1) 동기(Synchronous)

동기는 호출한 함수가 호출된 함수의 작업완료를 직접 관리하는 방식입니다.


A함수가 B 함수를 호출했을 때, A는 B가 결과를 리턴할 때까지 기다리거나 주기적으로 작업 완료 여부를 체크(Polling)합니다.


동기 방식은 다음과 같은 특징을 갖고 있습니다.

  • 실행 흐름이 직관적
  • 작업 순서 보장
  • 앞선 작업이 끝나기 전까지 다음 작업 수행 불가
    → 대기 시간 발생으로 효율 저하



2) 비동기(Asynchronous)

비동기는 호출된 함수의 작업완료를 관리하지 않는 방식입니다.


A 함수는 B 함수를 호출한 뒤 작업 완료 여부를 신경쓰지 않고 다른 작업을 계속 수행합니다.

B 함수는 작업이 끝난뒤

  • Callback
  • Promise
  • Future

등을 통해 결과를 전달합니다.


비동기 방식은 다음과 같은 특징을 갖고 있습니다.

  • 여러 작업을 동시에 처리하여 자원을 효율적으로 사용
  • 설계가 복잡
  • 순서가 일정하지 않을 수 있음



3. Blocking / Non-Blocking + Sync / Async 조합

위에서 알아봤듯이 Blocking / Non-Blocking은 제어권의 반환 시점에 초점을 맞추고

Sync와 Async는 작업 완료를 누가 관리하냐에 초점을 맞춥니다.


둘은 독립적인 개념이기 떄문에 4가지의 조합이 가능합니다.

간단히 알아보겠습니다.

1) 블로킹(Blocking) + 동기(Syncronous)

가장 전통적이고 일반적인 방식입니다.

호출한 함수는 호출된 함수가 끝날때까지 기다립니다.

작업 완료 여부도 호출한쪽이 직접 확인하고 결과를 이어서 처리합니다.


즉, 제어권도 바로 못 돌려받고 작업완료도 챙겨야 하는 방식입니다.

이 방식은 이해하기 쉽고 흐름이 직관적이라는 특징이 있지만, 호출한쪽이 멈춰있기 때문에 효율이 떨어질 수 있습니다.


대표적인 예시는 다음과 같습니다.

  • 일반적인 함수 호출
  • JDBC 기반 데이터 조회


2) 논블로킹(Non-Blocking) + 동기(Syncronous)

 

호출된 함수는 즉시 제어권을 반환합니다.

이에 호출한쪽은 바로 다음 코드를 실행할 수 있습니다. 하지만, 주기적으로 작업완료 여부를 체크(Polling)합니다.


코드로 치면 이런 구조입니다.

while(!isDone()){
	// Polling
}
result = getResult();

 

분명 작업을 병렬적으로 처리하도록 하지만, 작업 완료를 계속 확인하고 결국 동기적으로 작업을 수행하게됩니다.

이러한 방식은 계속 상태를 확인하기 때문에 CPU를 낭비하기 쉽습니다.


3) 블로킹(Blocking) + 비동기(Asyncronous)

 

A함수는 B함수를 호출하며 제어권을 넘겨줍니다.

비동기이기 때문에 A 함수는 B 함수의 결과에 관심이 없지만 제어권이 없기 때문에 다른 작업을 수행할 수 없습니다.


거의 사용되지 않는 경우입니다.


4) 논블로킹(Non-Blocking) + 비동기(Asyncronous)

가장 효율적인 방법입니다.


A함수는 B함수를 호출 후 제어권을 즉시 반환 받고, 작업 완료 여부도 챙기지 않습니다.

이 방식은 I/O 대기 시간 동안 스레드를 붙잡아 두지 않기 때문에, 적은 수의 스레드로도 많은 요청을 처리할 수 있습니다.

특히 네트워크 I/O가 많은 환경에서 장점이 있습니다.


하지만 구조가 복잡해질 수 있다는 단점 또한 존재합니다.


Non-Blocking + Async의 대표적인 예시는 다음과 같습니다.

  • Node.js
  • Spring WebFlux

'CS > 운영체제' 카테고리의 다른 글

[OS] 프로세스 개념, 프로세스 스케줄링  (0) 2026.04.06
[OS] 운영체제의 개념, 역할 및 구조  (0) 2026.03.07
'CS/운영체제' 카테고리의 다른 글
  • [OS] 프로세스 개념, 프로세스 스케줄링
  • [OS] 운영체제의 개념, 역할 및 구조
단군왕건영
단군왕건영
널리 세상을 이롭게 하고 싶은 개발자
  • 단군왕건영
    홍익인간 개발자
    단군왕건영
  • 전체
    오늘
    어제
    • 분류 전체보기 (90)
      • TroubleShooting (16)
      • Backend (13)
        • Java (2)
        • Spring (9)
        • JPA (2)
      • DB (1)
      • Algorithm (7)
        • 백준 (4)
      • Infra (3)
      • CS (40)
        • 컴퓨터구조 (25)
        • 네트워크 (12)
        • 운영체제 (3)
      • Git (3)
      • Mac (2)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    springboot
    Jenkins
    spring
    네트워크
    백준
    컴퓨터구조
    docker
    java
    컴퓨터 구조
    MariaDB
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
단군왕건영
[OS] 블로킹(Blocking)/논블로킹(Non-Blocking), 동기(Syncronous)/비동기(ASyncronous)
상단으로

티스토리툴바