해당 개념을 이해하기 위해서는 다음의 두 용어를 짚고 넘어가야 한다.
- 제어권
- 제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
- 결과값을 기다린다는 것
- A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다.
Blocking(블로킹) 과 Non-blocking(논블로킹)
블로킹과 논블로킹은 A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.
1) 블로킹
- A 함수가 B 함수를 호출하면 제어권을 B 함수에 넘겨준다.
- A함수가 B함수를 호출하면 B에게 제어권을 넘긴다.
- 제어권을 넘겨받은 B는 열심히 함수를 실행한다. A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
- B함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
2) 논블로킹
- A 함수가 B 함수를 호출해도 제어권은 자신이 가지고 있는다.
- A함수가 B함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
- A함수는 계속 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행한다.
Synchronous(동기)와 Asynchronous(비동기)
동기와 비동기의 차이는 호출되는 함수의 작업 완료 여부를 신경쓰는지의 여부의 차이이다.
1) 동기
- 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것이 동기이다.
2) 비동기
- 함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
- 함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.
블로킹과 논블로킹, 동기와 비동기 비교
1) Sync-Blocking
- A 함수는 B 함수의 리턴값을 필요로 한다. (동기)
- 제어권을 B 함수에게 넘겨주고, B 함수가 실행을 완료하여 제어권을 돌려줄때까지 기다린다. (블로킹)
2) Sync-Nonblocking
- A 함수는 B 함수에게 제어권을 주지않고 자신의 코드를 계속해서 실행한다. (논블로킹)
- A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 마다 B 함수에게 함수 실행 완료여부를 확인한다. (동기)
3) Async-Nonblocking
- B 함수에게 제어권을 주지 않고 자신이 계속 가지고 있는다
이로써, A 함수는 B 함수를 호출한 이후에도 자신의 코드를 계속 실행할 수 있게된다. (논블로킹) - B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행한다. (비동기)
4) Async-blocking
- A 함수는 B 함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다. (비동기)
- B 함수의 작업에 관심없음에도 불구하고, A 함수는 B 함수에게 제어권을 넘긴다. (블로킹)
따라서, A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때 까지 기다려야 한다.
조금더 이해하기 쉽도록 아래 설명을 살펴보자.
'개발(ETC)' 카테고리의 다른 글
프로세스와 스레드 (0) | 2024.07.17 |
---|---|
멀티태스킹과 멀티프로세싱 (0) | 2024.07.16 |
애자일(Agile) 이란 (1) | 2022.07.15 |
대용량 웹 서비스를 위한 마이크로 서비스 아키텍쳐(MSA)의 이해 (0) | 2022.07.01 |