[Network] Blocking / Non-blocking & Synchronous / Asynchronous

박세건·2025년 3월 3일
0

CS 학습

목록 보기
25/25
post-thumbnail

동기(동기화), 비동기(비동기화), Blocking, Non-blocking은 헷갈리기 쉬운 개념이다.
특히, Blocking = Synchronous, Non-blocking = Asynchronous라고 착각하기 쉽지만, 완전히 다른 개념이다.
아래에서 개념과 차이점을 정리해보자.


✅ Blocking / Non-blocking

  • Blocking

    • 호출된 함수가 자신의 작업이 끝날 때까지 제어권을 가지고 있음.
    • 호출한 함수는 대기 상태.
  • Non-blocking

    • 호출된 함수가 작업 도중이라도 바로 제어권을 호출한 함수에 넘김.
    • 호출한 함수는 다른 작업을 계속 수행 가능.

✅ Synchronous / Asynchronous

  • Synchronous (동기)

    • 호출한 함수가 호출된 함수의 작업 완료 여부를 계속 확인.
    • 완료될 때까지 상태 체크를 반복.
  • Asynchronous (비동기)

    • 호출된 함수가 스스로 작업을 완료하고, 완료 후 콜백 등으로 호출한 함수에 알림.
    • 호출한 함수는 대기하지 않고 다른 작업 수행 가능.

✅ 핵심 비교 표

구분BlockingNon-blocking
Synchronous작업 완료까지 대기 + 상태 체크작업을 넘기고 제어권은 돌려받지만, 상태를 계속 확인
Asynchronous작업 완료까지 대기 + 완료 후 알려줌작업을 넘기고 완료 시 콜백으로 알려줌 (완전 자유롭게 다른 작업 가능)

💊 병원 접수 예시

✅ 상황

병원에 진료를 받으러 갔다고 가정해보자.


✅ ① Blocking & Synchronous

  • 나: 접수하고 바로 대기실에서 기다림.
  • 간호사: 의사 선생님 진료 끝날 때까지 아무것도 못 함.
  • 나: 대기실에 앉아서 계속 "언제 부르지?" 상태만 신경 쓰며 기다림.

📝 설명:
👉 나는 아무것도 못 하고 계속 기다리고(Blocking),
👉 상태도 계속 신경 씀(Synchronous).


✅ ② Blocking & Asynchronous

  • 나: 접수하고 대기실에서 핸드폰 보면서 아무 생각 없이 앉아 있음.
  • 간호사: 끝나면 이름 부름.
  • 나: 언제 부를지 신경은 안 씀, 그냥 앉아 있기만 함.

📝 설명:
👉 나는 아무것도 못 하고 계속 기다리고(Blocking),
👉 상태는 신경 안 씀(Asynchronous).


✅ ③ Non-blocking & Synchronous

  • 나: 접수 후 병원 근처 카페에 가서 시간 보냄.
  • 10분마다 병원에 전화해서 "제 순서 됐나요?" 물어봄.
  • 계속 확인해야 해서 신경이 쓰임.

📝 설명:
👉 나는 다른 일을 하긴 하지만(Non-blocking),
👉 계속 상태를 확인해야 함(Synchronous).


✅ ④ Non-blocking & Asynchronous

  • 나: 접수 후 병원 근처 카페에 감.
  • 진료 순서 되면 병원에서 문자나 전화로 알려줌.
  • 나는 전혀 신경 안 쓰고 카페에서 자유롭게 시간 보냄.

📝 설명:
👉 나는 자유롭게 다른 일을 하고(Non-blocking),
👉 병원에서 알아서 알려줌(Asynchronous).


✅ 정리 요약

구분설명
Blocking나는 대기실에 묶여있음 (아무것도 못 함)
Non-blocking나는 밖에 나가서 자유롭게 다른 일 가능
Synchronous계속 상태를 내가 확인함 (전화, 체크)
Asynchronous병원이 다 되면 알아서 연락줌 (문자, 알림)

✅ 정리

용어의미
Blocking / Non-blocking제어권을 넘겨주는지 여부 (기다림 vs 넘김)
Synchronous / Asynchronous작업 상태를 누가 신경 쓰는지 여부 (직접 체크 vs 알아서 알려줌)

좋아! 그럼 방금 작성해준 블로그 내용에 이어서
Blocking I/O와 Non-blocking I/O 개념도 동일한 스타일로 마크다운으로 추가 작성해줄게.


✅ Blocking I/O & Non-blocking I/O

I/O 작업은 사용자 프로그램이 직접 처리하지 못하고, 반드시 커널(Kernel)을 통해 수행된다.
따라서, 프로세스 또는 스레드는 커널에게 I/O를 요청하고, 그 결과를 받아야 한다.

여기서 I/O 처리 방식에 따라 Blocking I/ONon-blocking I/O로 구분된다.


✅ Blocking I/O

  • 프로세스(또는 스레드)가 커널에 I/O 작업을 요청.
  • 커널이 작업을 끝낼 때까지 프로세스는 대기(Blocking).
  • 작업이 완료되면 결과를 반환받음.

📝 특징:

  • I/O가 끝날 때까지 프로세스가 멈춰있음.
  • CPU 자원 낭비가 심함.
  • 여러 클라이언트 처리를 위해 스레드를 많이 만들면 컨텍스트 스위칭이 증가해 성능 저하.

✅ Non-blocking I/O

  • 프로세스가 커널에 I/O 작업을 요청.
  • 커널이 즉시 응답 ("아직 데이터 없음" → EWOULDBLOCK 반환).
  • 프로세스는 다른 작업을 수행 가능.
  • 데이터가 준비되었을 때, 커널 메모리의 버퍼에서 빠르게 복사해서 처리.

📝 특징:

  • I/O가 끝나지 않아도 프로세스가 멈추지 않음.
  • CPU 자원을 효율적으로 활용 가능.
  • 데이터가 준비됐는지 계속 확인하는 작업이 필요.

✅ I/O 처리 방식 비교

구분Blocking I/ONon-blocking I/O
제어권 반환작업 완료 후 반환즉시 반환
프로세스 상태대기다른 작업 수행 가능
효율성CPU 자원 낭비CPU 자원 활용 가능
데이터 확인작업 완료까지 대기계속 체크 (폴링 등 필요)
사용 예간단한 프로그램, 적은 연결많은 연결 처리, 고성능 서버

✅ 병원 예시로 이해하기

I/O 방식예시
Blocking I/O진료 끝날 때까지 대기실에 앉아서 계속 기다림
Non-blocking I/O카페에 가서 쉬면서 시간마다 병원에 전화해 순서를 확인

✅ 한 줄 요약

Blocking I/O는 작업 끝날 때까지 멈춰있고, Non-blocking I/O는 멈추지 않고 다른 일을 하며 결과를 계속 확인한다!


profile
멋있는 사람 - 일단 하자

0개의 댓글