여러 기술을 공부하면서 `논블록킹 I/O 기반`, `비동기 처리`와 같은 표현을 쓰곤 하는데, 스스로 정리가 잘 안되어 정리해보는 글이다.
나는 synchronous blocking / asynchronouse blocking 등 다양한 표현이 있다는 것도 최근에 알게 되었다.
Synchronous와 Asynchoronous
동기라는 사전적 의미는 다음과 같다.
happening, existing, or arising at precisely the same time
정확히 같은 시간에 발생, 존재하는 것
실제 사전적 의미는 컴퓨터 공학의 동기가 명확하게 표현되지는 않는 것 같아 다른 의미를 찾아보았다.
having the same period, also : having the same period and phase
같은 기간 또는 같은 기간, 같은 단계를 가지는 것
요청과 응답은 같은 페이즈(단계)를 가져야 한다는 의미로 해석할 수 있다. 다시 말해 요청에 의한 응답이 한 단계에서 마무리가 되고 다음 요청은 다음 단계에서 처리가 된다는 뜻으로 파악된다.
동기는 결국 단계를 거치는 순차적인 흐름이 존재한다는 것을 알 수 있게 되었다.
비동기는 반대로 단계를 거치지 않고 순차적인 흐름이 없다는 것을 수 있다는 것을 알 수 있다.
요청을 시작하면 이에 대한 응답이라는 한 단계를 끝내기 위해 작업 완료 여부를 계속 확인을 하거나, 작업 완료에 대한 응답을 기다리면 동기이다.
요청을 시작하면 이에 대한 응답이라는 한 단계를 끝내지 않고, 응답이 오면 알림을 해달라는 옵션(callback)을 함께 전달해서 응답이 완료되면 전달받은 옵션(callback)을 실행하면 비동기이다.
Blocking과 Non-Blocking
블로킹과 논블로킹은 진행 중인 작업이 '전체 작업 흐름'을 막는냐에 대해서 생각해보면 될 것 같다.
함수를 호출하면 호출되는 함수에게 제어권을 넘겨주어 호출하는 함수가 흐름을 멈추게 되면 블로킹이다.
함수를 호출하면 호출되는 함수에게 제어권을 넘겨주지 않고 계속해서 호출하는 함수가 진행되면 논블로킹이다.
동기/비동기와 블로킹/논블로킹의 조합
Sync + Blocking
A는 결과를 기다리면서 B에게 제어권을 주어 전체적인 작업의 흐름이 멈춘다.
A B
|
B 호출 ----> 제어권: B
|
|
|
제어권: A <---- 결과 리턴
|
|
Sync + Non-Blocking
A는 결과를 기다리지만, B에게 제어권을 주지 않고 전체적인 작업의 흐름이 멈추지 않는다.
A B
|
B 호출 ----> 실행 (제어권: X)
| |
B 완료 여부 <2----1> No
| |
B 완료 여부 <2----1> No
| |
리턴값 사용 <---- 결과 리턴
|
|
Async + Non-Blocking
A는 결과를 기다리지 않고 Callback으로 B에게 후처리를 맡기면서 B에게 제어권을 주지 않고 전체적인 작업의 흐름이 멈추지 않는다.
A B
|
B 호출 --with callback--> 실행 (제어권: X)
A 코드 진행 |
| |
| |
| callback 실행
|
Async + Blocking
A는 결과를 기다리거나 계속해서 확인하지만, B에게 제어권을 주어 전체적인 작업 흐름이 멈춘다.
위의 말을 해석해보면 A는 완료 여부를 매번 하고 싶어도, B에게 제어권을 줬기 때문에 Async답게 사용하지 못한다.
Synchronous와 Blocking과 다를바가 없다.
두 기능은 서로 비슷하면서도 다르기 때문에 헷갈리기 쉬운 개념이라고 생각한다. 그렇기 때문에 관점의 차이와 예시들을 기억해두는게 좋을 것 같다.
'🧑🏻💻Dev' 카테고리의 다른 글
상속관계 매핑 (0) | 2022.12.06 |
---|---|
연관관계 매핑 종류 (0) | 2022.12.05 |
javax.validation 독립적으로 사용하지 않기 (2) | 2022.11.18 |
객체지향 생활 체조 9가지 원칙 (0) | 2022.11.15 |
객체 복사 라이브러리 비교 마지막 편 : MapStruct (0) | 2022.06.26 |