본문 바로가기

기타

[기타] Sync - Async / Blocking - Non-Blocking

반응형

Async 관련해서 공부를 하다가 항상 sync - async 와 비교되어 나오는 blocking - non-blocking 개념이 궁금해서 정리를 해보았다. 사실 처음에 읽어 보았을 때는 동기 비동기와 비슷해 보였는데, 두 개념을 섞어서 비교해보니 차이점을 확실히 알 수 있었다.

 

 

1. Sync - Async

 

동기와 비동기는 특정 작업을 수행할 때 해당 작업의 완료 여부를 신경쓰는지에 따라 구분된다.

A 함수가 B 함수를 호출하여 작업을 수행할 때, A 함수가 B 함수가 종료될때까지 기다리다가 그 결과값을 받고나서 다음 작업을 수행하는 경우를 동기, 반면에 B 함수의 종료까지 기다리지 않고 A 함수가 다음 작업을 수행하면 비동기가 된다. 이때 B 함수의 작업 결과는 콜백함수로 반환된다. 결국 A 함수가 B 함수의 결과를 직접 받느냐, 간접적으로 받느냐로 구분할 수 있다.

 

- Sync: 호출하는 함수가 해당 작업의 결과 값을 받아서 다음 작업을 수행
- Async: 호출하는 함수는 해당 작업의 결과 값을 상관하지 않고, 호출되는 함수가 콜백으로 결과 값을 넘겨주는 방식 등으로 결과 처리

 

 

2. Blocking - Non-Blocking

 

블로킹, 논블로킹은 작업을 수행할 때 제어권이 누구한테 있는지에 따라 구분된다.

특정 작업을 수행할 때, 블로킹은 작업이 완료될 때까지 제어권을 반환하지 않는다. 작업의 수행이 완료될 때까지 계속 대기하다가 작업이 완료되면 제어권을 받아서 다른 작업을 수행한다. 반면에 논블로킹은 해당 작업을 바로 완료할 수 없는 경우에 제어권을 먼저 반환하여 해당 작업을 호출한 쪽에서 다른 작업을 수행할 수 있는 기회를 준다.

- Blocking: 해당 작업이 완료될 때까지 다른 작업 수행 불가
- Non-Blocking: 해당 작업이 완료되기 전에 다른 작업 수행 가능

 

 

3. Sync-Async vs Blocking-NonBlocking

 

위의 설명을 읽으면 sync 와 blocking 이 비슷하고 async 와 non-blocking 이 비슷하다고 느낄 수 있다. 사실 두 개념의 차이가 거의 안느껴지기도 한다. 하지만 이 두 개념을 섞어서 설명하면 이들의 차이점을 이해할 수 있다.

 

- Sync-Blocking

 

일반적인 동기 함수의 동작 방식이다. 함수가 다른 함수를 호출하고, 그 결과를 반환받아서 다음 작업을 이어나간다.

 

- Async-NonBlocking

 

일반적인 비동기 함수의 동작 방식과 같다. 함수가 다른 함수를 호출하고 바로 제어권을 반환받는다. 제어권을 반환받은 함수는 호출된 함수의 작업 결과에 상관없이 바로 다른 작업을 할 수 있기 때문에 다음 라인으로 넘어간다. 호출된 함수는 작업을 수행하고 그 결과를 콜백함수로 반환한다.

 

- Sync-NonBlocking

 

동기적으로 실행되지만 논블로킹이기 때문에 제어권은 바로 반환받게 되는 구조이다. 동기적으로 돌기 때문에 호출한 함수는 호출된 함수의 작업 완료 여부, 결과값 반환에 관심을 가지게 된다. 그렇기 때문에 논블로킹으로 제어권을 바로 반환받아 다른 작업을 할 수 있음에도 호출된 함수의 완료 여부를 계속해서 문의하게 된다.

 

 

- Async-Blocking

 

비동기 블로킹 함수는 비동기 이기 때문에 호출된 함수의 결과에는 관심이 없지만, 블로킹 구조로 제어권을 가지지 못하기 때문에 호출된 함수의 작업이 완료될 때까지 대기하게 된다. 호출된 함수의 작업이 끝나고 콜백함수가 호출되어 결과가 반환되고 나면 대기하고 있던 작업 함수를 호출한 함수는 다음 작업을 수행하게 된다.

 

사실상 이점이 없는 방식이기 때문에 잘 구현하지 않는다. 주로 Async-NonBlocking 구조를 구현하려다가 제어권을 잘 반환하지 못해서 Async-Blocking 으로 동작하는 경우가 종종 있다고 한다.

 

 

4. 정리

 

이렇게 각 개념과 이들을 비교해본 결과 다음과 같이 정리할 수 있다.

 

- Sync / Async

작업의 결과를 직접 받아서 사용할 것인지와 관련이 있다.
동기는 작업의 결과를 직접 호출한 함수에서 반환받도록 한다. 반면에 비동기는 작업의 결과를 호출한 함수가 직접 반환받지 않는다. 호출한 함수는 해당 작업에 관심이 없고, 작업의 결과를 반환해야 한다면 콜백 함수를 사용하는 등의 방식으로 호출한 함수와는 상관없이 간접적으로 반환하도록 한다.
작업의 결과를 어떻게 처리할 지 방식의 차이로 이해할 수 있다.

- Blocking / Non-Blocking

작업의 제어권, 작업의 흐름과 관련이 있다.
블로킹은 제어권을 반환하지 않고 하나씩 순서대로 수행되는 반면에 논블로킹은 제어권을 반환하여 다음 작업을 바로 시작할 수 있도록 한다.
해당 작업의 함수를 호출한 쪽의 입장에서 대기해야 하는지, 다음을 실행해도 되는지에 대한 관점으로 이해할 수 있다.

 

 

[reference]

- http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

Blocking-NonBlocking-Synchronous-Asynchronous

꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면

homoefficio.github.io

 

반응형

'기타' 카테고리의 다른 글

[Gradle] Gradle 사용법 - 설치, 초기화 및  (1) 2023.01.17
[Gradle] Gradle 이란?  (1) 2023.01.14
[Kafka] Kafka Consumer 예제  (0) 2022.03.22
[Kafka] Kafka Producer 예제  (0) 2022.03.21
[Kafka] Kafka 기본 개념  (0) 2022.03.19