본문 바로가기
공부 및 정리/기타 정리

동기, 비동기, Blocking, Non-Blocking

by 스파이펭귄 2024. 4. 14.
728x90

동기, 비동기, Blocking, Non-Blocking에 대해서는 알고 있었지만 Blocking과 동기, Non-Blocking과 비동기의 차이에 대해서 설명해보라고 하면 대략 정신이 멍해지기에 이를 정리해보려 한다.

먼저 익숙한 놈들끼리의 차이를 알아보자.

 

Blocking과 Non-Blocking의 차이

먼저 Blocking과 Non-Blocking은 작업의 수행 여부를 결정하는 방식에 대한 차이이다.

Blocking 방식은 호출된 함수가 자신의 작업을 모두 마칠때까지 호출한 함수의 제어권을 반환하지 않는다. 이 때문에 호출한 함수는 결과를 기다리는 동안 다른 작업을 수행할 수 없게 된다.

Non-Blocking 방식은 호출된 함수가 바로 제어권을 호출한 함수에 반환하며, 작업의 완료 여부와 상관 없이 호출한 함수는 다른 작업을 수행할 수 있다.

결국 Blocking 방식은 간단하지만, 작업 처리 동안 다른 작업을 하지 못한다는 단점이 있고, Non-Blocking 방식은 작업처리 동안 다른 작업을 할 수 있다는 장점이 있으나, 작업의 완료를 관리할 추가적 로직이 필요하다는 단점이 존재한다.

 

Sync와 Async의 차이

Sync와 Async의 차이는 작업의 완료 시점을 어떻게 처리할 지에 대한 방식의 차이이다.

Sync는 작업을 요청하고 그 작업이 완료될 때까지 기다려 작업 처리 결과가 반환 될 때까지 다른 작업을 수행할 수 없다.

Async는 작업을 요청 후 결과와 상관 없이 바로 다음 작업을 수행하는 방식이다. 작업의 완료와 결과 처리는 non-blocking 처럼 별도의 매커니즘을 통해 이루어진다.

Sync의 장점은 blocking처럼 간단하게 구현할 수 있다는 점이며, 특정 작업이 길어질 경우 시스템 전체적 처리 속도가 느려질 수 있다는 단점이 있다.

Async는 시스템의 자원을 효율적으로 사용할 수 있지만, 동기 방식에 비해 프로그램 복잡도가 증가한다는 단점이 있다.

 

 

Sync와 Blocking, Async와 Non-Blocking 끼리 비슷한거는 느낌이 온다. 그렇다면 왜 이들을 분리해서 말하는걸까?

앞서 말한것처럼 Blocking과 Non-Blocking은 작업 수행 여부를 결정하는 것에 관심 있고, Sync와 Async는 완료 시점을 어떻게 처리할지에 대해 관심이 있다는 차이점이 있다.

실제로 이들은 위처럼 Synchronous Blocking, Asynchronous Non-Blocking과 같이 이들의 개념을 조합해서 사용할 수 있다.

그렇다면 Blocking과 Non-Blocking에서 작업 수행 여부를 결정한다는 것은 무슨말일까?

이는 함수 호출에 대한 반환의 시기를 의미한다.

  • Blocking의 경우 모든 함수의 작업이 끝난 후에 반환
  • Non-Blocking의 경우 완료 확인을 위한 호출시마다 즉시 완료 또는 미완료에 대한 반환

 

Synchronous와 Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰느냐가 주요 요점이다.

  • Synchronous의 경우 호출 되는 함수의 완료를 호출한 함수가 신경써서 완료까지 기다림
  • Asynchronous의 경우 호출되는 함수의 완료를 호출된 함수가 신경써서 Callback을 해줌

 

 

각 조합의 예시

Sync-Blocking은 그냥 file read/write 작업시, Async-NonBlock의 경우는 JS의 AJAX이다.

이는 우리에게 상당히 익숙하므로 넘어가자. 하지만 Async-blocking, sync-NonBlocking의 경우는 상당히 익숙치 않다.

Async-Blocking

이 경우는 Blocking Sync랑 사실 성능적으로 거의 차이가 없기 때문에 별다른 예시가 없다.

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/#about

위 블로그에서는 NonBlocking-Async 과정중 하나라도 Blocking 과정이 있는 경우 의도치 않게 Blocking-Async로 작동한다고 한다.

 

SyncBlocking

이 경우는 future.isDone()이 있다.

예를 들어 JAVA에서 HTTP 요청을 보내면 비동기 작업을 위해 future를 받을 수 있다. 여기서 future에는 isDone이라는 함수가 존재하는데 이 함수는 작업이 모두 완료되었는지 즉시 확인가능한 메서드로 위 그림과 동일한 플로우를 보여준다.

이때 중요한 점으로 비동기 처리가 된다 해도 반드시 병렬로 처리되는 것은 아니다. 멀티 코어가 있는 환경에서는 병렬로 처리될 수 있지만, 단일 코어인 경우 컨텍스트 스위칭을 통해 각 작업을 바꿔가며 한번에 한 작업만 수행되기 때문에 동시에 실행되는 병렬 처리가 될 수는 없다.

 

 

Reference

728x90

'공부 및 정리 > 기타 정리' 카테고리의 다른 글

CTE와 Recursive 쿼리  (0) 2024.04.25
[SQL] DELETE, TRUNCATE, DROP  (0) 2024.04.24
CAP 정리  (1) 2024.03.06
트랜잭션과 ACID  (0) 2024.03.05
스프링-MYSQL 프로젝트 EC2에 올리기  (2) 2024.02.06