꾸물꾸물 졔의 개발공부
[CS] Blocking/Non-blocking , Sync/Async 본문
이 그림을 봐서 가장 확실하게 알 수 있는건 Blocking 이라고 반드시 Sync 인게 아니며, Non-blocking 이라고 반드시 Async 인 것도 아니라는 것이다.
즉, Blocking/Non-blocking 과 Sync/Async는 별개의 개념이다. 어디에 '관점'을 두고 있느냐에 따라 나눌 수 있다.
Blocking / Non-Blocking 은 호출된 함수가 자신을 호출한 함수에게 제어권을 돌려주느냐 마느냐,
Sync / Async은 호출된 함수의 수행 결과와 종료를 호출한 함수가 처리하느냐, 호출된 함수가 처리하느냐의 차이이다.
🔎Blocking / Non-blocking
Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신의 제어권이 있는지 여부로 구분한다.
블로킹 Blocking
A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 모두 끝날 때까지 A 함수에게 제어권을 돌려주지 않는 것
즉, 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 해당 작업이 끝날 때까지 기다렸다가 자신의 작업을 이어서 하는 것을 의미한다.
논블로킹 Non-Blocking
A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것
즉, 다른 주체의 작업 완료 여부와 관계 없이 자신의 작업을 하는 것을 의미한다.
🔎Sync / Async
Sync와 Async는 결과를 돌려주었을 때 순서와 결과에 관심을 가지고 있는지 여부로 판단한다. 즉 신경을 쓰고 있느냐 마느냐의 차이.
동기 Synchronous
A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A 함수가 처리하는 것. 즉, 호출된 함수의 수행 결과 및 종료를 호출한 함수와 함께 신경 쓰는 경우를 의미한다.
비동기 Asynchronous
A 함수가 B 함수를 호출 할 때, B 함수의 결과를 B 함수가 처리하는 것. (callback) 즉, 호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 쓰고 처리하는 경우를 의미한다.
조금 더 단순하게 한마디로 정리해보면,
- Blocking / Non-Blocking : 제어권을 안넘기는지 / 넘기는지
- Sync / Asycn : 결과를 돌려줄 때 결과와 순서에 관심이 있는지 / 없는지
Sync - Blocking / Async - Non-Blocking 모델
가장 일반적으로 흔히 접하는 모델이다.
Sync - Non Blocking 모델
- Synchronous : A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A가 처리하는 것
- Non-blocking : A 함수가 B 함수를 호출 한 뒤, B 함수가 A 함수에게 제어권을 바로 돌려주는 것
( A : 호출한 함수 , B : 호출 된 함수 )
이 두 개념을 조합해보면, B 함수가 A 함수에게 제어권을 바로 돌려줌으로써 A 함수는 다른 작업을 수행 할 수 있지만, 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 한다.
A 함수가 B의 작업 완료 여부를 신경쓰며 직접 B의 결과를 처리해야 하는 상황이기 때문에 B 함수의 종료 여부를 반복적으로 물어보며 확인해야 한다는 의미이다.
👉 호출한 함수가 다른 작업을 수행 할 수 있게 되었음에도 불구하고 호출된 함수의 결과를 계속해서 신경써야 하기 때문에 제 할일을 못하게 되는 형태가 된다.
Async - Blocking 모델
- Asynchronous : A 함수가 B 함수를 호출 할 때,B 함수의 결과를 B가 처리하는 것 (A는 B의 결과, 순서에 관심이 없음)
- Blocking : A 함수가 B 함수를 호출 한 뒤, B 함수가 A 함수에게 제어권을 돌려주지 않는 것
( A : 호출한 함수 , B : 호출 된 함수 )
최악의 조합. 두 개념을 조합해보면, A 함수는 B의 작업 결과에 관심이 없음에도 불구하고 B의 결과를 기다리고 있어야 하는 형태이다.
이 조합은 굉장히 비효율적이고 흔한 케이스도 아니지만, 이 형태로 동작하는 경우가 있다고 한다.
대표적으로는 NodeJS와 MySQL의 조합. NodeJS에서 콜백 지옥으로 Async 방식을 사용해도 결국 DB 작업 호출시에는 MySQL에서 제공하는 드라이버를 호출하게 되는데, 이 드라이버가 Blocking 방식으로 동작하여 Async +Blocking 구조가 된다.🥲
🌟마무리
흔히 접할 수 있는 모델은 Sync+Blocking / Async+Non-Blocking (동기/비동기) 형태의 모델이다. 추가적으로 Sync+Non-Blocking과 Async+Blocking 모델이 존재하긴 하지만, 비효율적이고 흔한 케이스도 아니다.
제어권을 가지고 있느냐 없느냐와 순서, 결과에 관심이 있느냐 없느냐를 기준으로 단어의 조합을 생각하여 살펴보자!
'CS' 카테고리의 다른 글
[CS] 메모리 구조, 스택(Stack)과 힙(Heap) (0) | 2023.08.26 |
---|---|
[CS/JAVA] JVM이란? (0) | 2023.08.23 |
[DB] 트랜잭션(Transaction)이란? ACID, COMMIT, ROLLBACK (0) | 2023.05.09 |
[DB] JOIN문, JOIN의 종류 : INNER, OUTER, CROSS, SELF (0) | 2023.04.29 |
[CS] Cache(캐시) 란? (0) | 2023.04.19 |