[운영체제] 동기 vs 비동기 그리고 블로킹 vs 논블로킹

2025. 8. 8. 20:35·CS/운영체제

들어가며

개발을 하면서, 동기/비동기 그리고 블로킹/논블로킹에 대해서 들어본 경험이 있을 것이다. 이번 포스트에서는 이 개념들에 대한 설명을 해보고자 한다. 일단 동기/비동기 그리고 블로킹/논블로킹은 굉장히 비슷한 형태라고 생각이 될 수도 있다. 그러나, 서로 다른 차원에서의 작업 수행 방식을 설명하는 개념이다. 

동기/비동기는 요청한 작업에 대해 완료 여부를 신경써서 작업을 순차적으로 수행할지 아닌지에 대한 관점이고
블로킹/논블로킹은 단어 그래도 현재 작업이 block(차단,대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다. 

 

조금 더 자세히 알아보자.


동기(Synchronous) vs 비동기(Asynchronous) 

동기 (Synchronous) : 요청한 작업에 대해 완료 여부를 따쳐 순차적으로 처리 - 기다린다
비동기 (Astnchronous) : 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수 있다. - 안 기다린다

 

비동기의 성능 이점  

요청한 작업에 대하여 완료 여부를 신경 쓰지 않고 그 다음 작업을 수행한다. 그렇기 때문에 I/O 작업과 같은 느린 작업이 발생했을 경우에 기다리지 않고 다른 작업들을 처리한다. 그렇기 때문에 전반적으로 시스템 향상에 도움을 줄 수 있다. 

 

블로킹(Blocking) vs 논블로킹(Non-Blocking)

블로킹과 논블로킹은 다른 요청의 작업을 처리하기 위해 현재 작업을 block(차단/대기)하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식이다. 

  • 파일을 읽는 작업이라고 했을 때, 블로킹 방식으로 읽으면 파일을 다 읽을 때까지 대기하고
  • 논블로킹 방식으로 읽으면 파일을 다 읽지 않아도 다른 작업을 할 수 있다. 

비교

Blocking vs. Non-Blocking

'호출하는 쪽에서 일을 할 수 있는가 ?' 의 여부에 초점이 맞춰져 있다. 

  • 블로킹은 호출하는 쪽은 아무것도 하지 못하고 대기를 한다. 
  • 논블로킹은 결과의 여부와 상관 없이 호출하는 쪽에서는 무언가를 할 수 있다. 

또한, 호출되는 함수가 바로 return을 하는가 ? (A가 B를 호출했다고 가정하자.)

  • 블로킹에서는 B는 호출되자마자 바로 return을 한다. 
  • 논블로킹에서는 B는 작업이 끝날 때까지 return을 하지 않는다. return이 있어야만 다음으로 이어갈 수 있기 때문에 A는 B가 return 될 때까지 대기한다. 

Synchronous vs Asynchronous 

호출하는 쪽에서 호출되는 쪽을 신경쓰는가 ? 

  • Sync에서는 호출된 쪽의 함수의 실행 결과와 순서를 신경쓴다. 
  • Async에서는 호출된 쪽의 함수에는 관심이 없다. 실행 결과는 호출된 쪽이 콜백으로 알아서 처리하기 때문이다. 

작업 결과를 누가 처리하는가 ? (A가 B를 호출했다고 가정하자.)

  • Sync에서는 A는 B의 결과값을 받아 후처리한다. 
  • Async에서는 B는 콜백 함수를 통해 자신의 실행 결과의 후처리를 한다. 

4가지 조합 

프로그램 아키텍처에서는 이 두 개념이 조합되어 사용되며 4가지 조합을 만들 수 있다. 

  1. Sync Blocking (동기 + 블로킹)
  2. Async Blocking (비동기 + 블로킹)
  3. Sync Non-Blocking (동기 + 논블로킹)
  4. Async Non-Blocking (비동기 + 논블로킹) 

1. Sync Blocking (동기 + 블로킹)

다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고(Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다. 

2. Async Non-Blocking (비동기 + 논블로킹)

다른 작업이 진행되는 동안 자신의 작업을 처리하고 (Non-Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않는 경우에 활용할 수 있다. 

대표적인 예가 바로, 웹 브라우저의 파일 다운로드이다. 웹 브라우저는 웹 사이트에서 파일을 다운로드할 때 파일의 전송이 완료될 때까지 다른 작업을 하지 않고 기다리는 것이 아니라 다른 탭이나 창을 열어 웹 서핑을 할 수 있다. 이는 웹 브라우저가 파일 다운로드를 비동기적으로 처리하고, 다운로드가 완료되면 알려주는 방식으로 구현되어있기 때문이다. 

3. Sync Non-Blocking (동기 + 논블로킹)

다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non-Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행하는 (Sync) 방식이다. 

4. Async Blocking (비동기 + 블로킹)

다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다. 잘 마주하기 쉽지 않은 방식이다. 


마무리하며

헷갈린다...!!! 계속해서 헷갈린다....

뭔가 예시로 마무리를 해보겠다........ 내가 헷갈려서 만든 예시.. 

 

카페에서 커피를 주문하는 상황이라고 가정하자. 

Sync + Blocking : 카운터 앞에서 계속 서서 기다림 가장 오래 걸림, 집중해서 결과만 기다림
Sync + Non-Blocking : 자리에 앉았다가, 몇 분마다 카운터 가서 커피 나왔나 확인 순서는 지키지만 중간에 다른 일 함
Async + Blocking : 자리에 앉아있는데, 커피가 나올 때까지 아무것도 안 함 이상한 경우, 거의 안 씀
Async + Non-Blocking : 자리에 앉아 책 읽다가, 다 되면 직원이 가져다줌 가장 효율적, 현대 웹 서비스가 선호


참고

 

👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은

inpa.tistory.com

 

 

Sync / Async / Blocking / Non-Blocking

머리로 이해하고 마음으로 느껴야하는 토픽인 것 같다--! 내 나름대로 이해한 것을 이해의 과정에 따라 정리해보겠다. 1. 개념적 차이 1) Blocking vs Non-Blocking : 호출하는 쪽에서 "블락(막힘)" 당하는

buchu-doodle.tistory.com

 

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

[운영체제] 리눅스(Linux)와 유닉스(Unix) 비교하기  (0) 2025.10.14
[운영체제] 프로세스(Process) 와 스레드(Thread)  (2) 2025.08.09
'CS/운영체제' 카테고리의 다른 글
  • [운영체제] 리눅스(Linux)와 유닉스(Unix) 비교하기
  • [운영체제] 프로세스(Process) 와 스레드(Thread)
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    레디스
    코드레빗
    docker
    Spring
    깃허브
    MongoDB
    지라
    운영체제
    스프링
    promtail
    java
    github
    스프링부트
    자바
    OS
    jira
    redis
    네트워크
    git
    STT
    CoolSMS
    몽고디비
    도커
    springboot
    파인튜닝
    AI
    TDD
    깃
    coderabbit
    Network
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[운영체제] 동기 vs 비동기 그리고 블로킹 vs 논블로킹

티스토리툴바