개발을 하면서 동기는 시점을 맞추고 비동기는 발생 시점과는 상관없이 실행시켜 놓는 느낌이고
블락은 실행시킨 작업이 끝날 때까지 아무 작업도 하지 못하고 넌블락은 실행시킨 작업과 상관없이 제 할 일을 한다.
이런 식으로 대충 느낌만을 알고 용어를 쓰다 보니,
막상 비동기와 넌블락의 명확한 구분이라던지 동기-논블럭, 비동기-블럭 같이 조금만 때려버리면 정신을 차리지 못해, 이번에 마음먹고 정리해 보려고 한다.
우선, 동기와 비동기에 대해 다루기 전
블럭과 논블럭에 대해 먼저 다뤄보도록 하자.
블로킹(Blocking) vs 논블로킹(Non-Blocking)
블로킹(Bolocking)
쉽게 말하면, 작업이 완료될 때까지 다른 작업을 하지 못하고 기다 대기한다.
I/O 관점에서 블로킹은 다른 작업을 실행(함수 호출 등)할 때 자신은 대기큐에 들어가 해당 작업이 완료된 후 시스템 콜을 받고 돌아오는 상황을 상상할 수 있다.
논블로킹(Non-Blocking)
작업이 완료될 때까지 기다리지 않고, 다른 작업을 수행할 수 있다.
I/O 관점에서 논블로킹은 다른 작업을 실행해도 대기큐에 들어가지 않고 현재 작업을 계속 진행하는 상황을 상상할 수 있다.
보통 이 부분을 제어권이 누구에게 가느냐에 대해서 다룬다고 하는데
블로킹은 제어권이 실행된 다른 작업한테 넘겨지며,
논블로킹은 현재 작업이 계속 제어권을 가지고 있는 상황이다.
즉, 블로킹과 논블로킹은 제어권 관점으로.
해당 내용은 헷갈리는 부분 없이 명료하게 구분할 수 있다.
동기(Synchronous) vs 비동기(Asynchoronous)
동기(Synchronous)
작업이 순차적으로 실행되며, 결과가 나올 때까지 대기한다.
멀티 thead 환경에서 부모 thread가 자식 thread 생성 후 자식 thread가 종료될 때까지 대기하는 것이고
System 관점에서는 System Call 완료를 기다리는 것이다.
비동기(Asynchoronous)
작업을 요청한 후 기다리지 않고 다음 작업을 실행하며, 결과를 나중에 전달받는다.
멀티 thead 환경에서 부모 thead가 자식 thread 생성 후, 부모/자식 thead 모두 동시 진행하며,
Syatem 관점에서는 System Call 완료를 기다리지 않고 자신의 작업을 진행한다.
여기에서 중요하게 보는 것은 실행한 작업의 결과물을 가져오는 시점이다.
동기는 작업 실행 순서에 따라 서순이 보장되며, 비동기를 이를 보장하지 않는다.
즉, 동기는 실행 순서에 따라 결과도 실행 순서에 맞게 가져오며, 비동기는 이를 보장하지 못한다.
실제 업무에서 동기와 비동기에 대해 구분할 때 멀티 스레드 환경을 예시를 들 수 있는데,
위에서 말했다시피 자식 스레드를 실행시킬 때 부모가 계속 작업을 실행하는지 실행하지 않는지에 대해서 구분하곤 한다.
그렇기 때문에 나중에 블로킹과 논블로킹에 대해 생각해 보면 개념이 헷갈리면서 머리가 어지럽게 된다.
동기는 자식 스레드를 실행시키고 대기하지 않나? 그럼 다름 작업을 실행시키며 waiting 하는 블로킹과 다른 점이 뭐지?
비동기 작업은 자식 스레드랑 상관없이 자기 작업을 계속 실행하지 않나?? 그럼 다른 작업 실행할 때 제어권을 넘겨주지 않고 계속 자기 작업을 실행시키는 논블로킹과 다른 점이 뭐지???
그러면 실제로 블로킹과 논블로킹, 동기와 비동기의 차이점에서도 한번 짚고 넘어가도록 하자.
언뜻 보면 비슷해 보이는 둘의 개념을 비교해 보자.
논블로킹(Non-Blocking) vs 비동기(Asynchoronous)
논블로킹과 비동기는 어떻게 보면 둘 다 현재 실행되는 작업이 계속 진행되는 시점에서 동일한 개념이 아닌가?라는 생각이 들 수 있다.
그렇다면 둘의 주요 특징을 잡아서 한번 비교해 보도록 하자.
논블로킹은 현재 작업이 제어권을 계속 가지고 작업을 수행하며,
비동기는 실행 순서와 별개로 결과물을 가져오는 것을 뜻한다.
비동기(Asynchoronous) - 논블로킹(Non-Blocking)
비동기-논블로킹 작업은 위 이미지처럼 진행될 것이다.
일반적인 논블로킹 이미지와 동일하다는 의미이다.
아니 그렇다면,
동기-논블로킹 작업은 어떤 모습일까?
동기(Synchronous) - 논블로킹(Non-Blocking)
이처럼, A 작업은 제어권을 잃지(블로킹) 않아 계속 자신의 작업을 이어나갈 수 있다.
그렇지만 A 작업과 B 작업은 동기를 맞춰야 하기 때문에 A 작업은 계속 B 작업의 완료 여부를 확인하며,
만약 B 작업이 완료된다면 즉시 해당 값을 return 받아 처리한다.
아하, 동기는 "서로 작업을 맞추다" 작업 실행 시점을 통해 작업 완료 시 결과물을 가져오는 시점이 맞추는 것이 중요하겠다.
B 작업이 먼저 작업이 완료 됐다면, B 작업 결과가 먼저 return 되어 처리된다.
그러면 아까 이미지에서 동기와 비동기를 좀 더 알기 쉽게 그린다고 표시했지만,
이 사실을 깨닫고 좀 더 확실하게 비동기를 표현하는 그림은 아래와 같을 것이다.
자, 다시 정리하면
비동기와 동기는 작업의 서순 여부가 지켜지는 것이고
블로킹과 논블로킹은 말 그대로 현재 작업을 waiting 할지 말지 (제어권을 잃을지 말지)에 대한 구분이겠다.
그렇다면, 이 다음도 비교해 보자.
블로킹(Blocking) vs 동기(Synchronous)
이 개념 또한, 언뜻 보면 비슷해 보인다.
동기적으로 스레드가 실행되면 자식 스레드를 실행시킨 부모는 블로킹되기 때문이다.
이 둘의 차이를 명확히 말하자면, System Call의 return을 기다리는 동안 대기큐에 머무는지 여부의 강제성으로 구분할 수도 있다.
즉, 블로킹은 현재 작업이 대기큐에 머물러야 하며, 동기는 그렇지 않다.
동기(Synchronous) - 블로킹(Blocking)
동기-블로킹은 일반적으로 이해되는 개념이다.
일반적인 블로킹 이미지와 동일하게 이해할 수 있다.
그렇다면,
비동기-블로킹은 대체 어떤 모습일까?
비동기(Asynchoronous) - 블로킹(Blocking)
어라, 언뜻 보면 동기-블로킹과 비동기-블로킹의 모습에서 차이가 없어 보인다.
사실 둘의 차이를 비교하면 다음과 같다.
값을 전달받는 모습에서 차이를 확인할 수 있을 것이다.
사실 비동기와 논블로킹의 가장 큰 차이는 System Call이 완료될 때 즉시 return값에 데이터를 가져오는지(논블로킹)
데이터를 가져오지 않는지(비동기)로 구분할 수 있는데,
비동기 작업은 System Call이 완료될 때 결과물이 함께 오지 않고, 나중에 결과물을 가져온다.
즉, callback 형식과 같이 결과물을 가져오는 시점을 즉각적이지 않다는 것이다.
오, 동기와 비동기 차이는 작업 서순이 중요하여 결과값을 가져오는 시점이 중요하다고 했는데,
그렇게 살펴보면 동기-블로킹 작업에서는 B 작업이 완료된 후에 B의 결과값을 바로 return 받아 처리되는 것을 확인할 수 있으며,
비동기-블로킹 작업에서는 A 작업에서 B 작업에 대한 작업 결과물을 Callback을 통해 전달받는 것을 확인할 수 있다.
비동기 작업은 즉시 B 작업에 대한 작업을 return 받지 않기 때문에,
어떻게 보면 B 작업의 결과물을 바로 서순에 맞게 처리되지 않을 수도 있다는 것이다.
블로킹이 끝났다고 해서 바로 즉시 전달받는다는 보장이 없다는 의미,
예를 들어 비동기에서 A에서 블로킹을 해두고, B, C, D 작업을 순차적으로 실행시켰을 때 모든 작업이 끝나고 하나씩 작업을 처리해도 B, C, D 순서를 보장할 필요가 없는 것이다.
자, 그렇다면 다시 한번 더 짚을 수 있는 것이다.
동기/비동기 작업은 작업의 서순 및 결과물을 가져오는 시점을 보고 판별할 수 있으며,
블로킹/논블로킹은 현재 작업을 대기 큐에 넣어 "대기(중지)"할지 말지에 대한 구분이다.
이렇게 네 가지 경우를 전체적으로 확인하면 다음과 같다.
< 최종 정리 >
- 동기 vs 비동기: 시점
- 블로킹 vs 논블로킹: 제어권
추가적으로 알아보면 좋을 부분
- 실제 예시
- 동기 - 논블로킹
- 비동기 - 블로킹
참고 자료
https://www.slideshare.net/slideshow/sync-asyncblockingnonblockingio/50573652
Sync async-blocking-nonblocking-io
Sync async-blocking-nonblocking-io - Download as a PDF or view online for free
www.slideshare.net
https://nesoy.github.io/blog/Synchronized-Asynchronous
Synchronous(동기) Vs Asynchronous(비동기)
Synchronous(동기) Vs Asynchronous(비동기) 예전에 Javascript를 공부하는 과정에 Synchronized와 Asynchronized의 차이점에 대해 공부를 했지만 다른 사람이 물어보았을때 차이점에 대해 명확히 설명할 수 없었기
nesoy.github.io
👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은
inpa.tistory.com
동기, 비동기, 블로킹, 논블로킹 차이점
프로그래밍을 하다 보면 동기와 비동기, 블로킹과 논블로킹이라는 개념을 자주 접하게 됩니다. 이 용어들은 서로 비슷해 보이지만, 실제로는 중요한 차이점을 가지고 있어서 혼란을 겪곤 합니
coor.tistory.com
'Android > 학습' 카테고리의 다른 글
[Android] LiveData란 (vs StateFlow) (6) | 2025.07.19 |
---|---|
[Kotlin] Coroutine Flow란, 그리고 Flow, StateFlow, SharedFlow.. (9) | 2025.07.06 |
[Android] RecyclerView의 동작 과정 (5) | 2025.05.16 |
[Kotlin] Kotlin Coroutine with Dispatcher (1) | 2025.04.09 |
[Android] Paging3의 PagingSource, PagingConfig와의 관계 (0) | 2025.03.29 |