매일메일을 통해
하루하루 CS 공부하기!
먼저, Block과 non-block, sync와 async 개념을 이해하기 위해서는 다음의 두 용어를 짚고 넘어가야 한다.
- 제어권
- 제어권은 자신(함수)의 코드를 실행할 수 있는 권한이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다. (하나의 프로세스가 CPU를 점거하는 것과 비슷한 맥락)
- 결괏값
- A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다.
동기와 비동기의 차이
동기와 비동기는 호출하는 함수의 결괏값을 기다리는지 여부의 차이가 있다.
- Synchronous
함수를 호출한 곳에서 응답받는 것
함수 A가 동기로 함수 B를 호출하면 A는 B의 작업이 완료될 때까지 기다려야 하므로, 작업이 순차적으로 진행된다.
- Asynchronous
함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(Callback)에서 결과를 처리하는 것
함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
A는 B의 작업 완료 여부를 신경 쓰지 않고 따로 동작하므로, 작업이 순차적으로 진행되지 않는다.
Blocking과 Non-Blocking의 차이
- Blocking
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
즉, 함수가 호출된 후, 호출한 함수의 결과를 기다리기 위해 실행을 멈추는 상태를 의미한다.
[제어권을 호출 함수에게 넘겨주고 대기하는 상황]
- Non-Blocking
다른 주체의 작업과 관련없이 자기 자신은 작업을 계속 진행하는 것
즉, A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 갖고 있는 것
A함수는 계속 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행한다.
블로킹과 논블로킹, 동기와 비동기 비교
1. Sync-Blocking
함수 A는 함수 B의 리턴값을 필요로 한다(동기). 그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄때까지 기다린다(블로킹).
2. Sync-NonBlocking
논블로킹인 동시에 동기적 처리
A 함수는 B 함수를 호출한다. 이 때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다(논블로킹).
그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행을 완료했는지 물어본다(동기).
3. Async-NonBlocking
A 함수는 B 함수를 호출한다. 이 때 제어권을 B 함수에 주지 않고, 자신이 계속 가지고 있는다(논블로킹).
따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다.
그리고 B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행한다(비동기).
4. Async-Blocking
잘 마주하기 쉽지 않음
A 함수는 B 함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다(비동기).
그런데, B 함수의 작업에 관심없음에도 불구하고, A 함수는 B 함수에게 제어권을 넘긴다(블로킹).
따라서, A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때까지 기다려야 한다.
참고
'Back-end' 카테고리의 다른 글
[Back-End] DBMS에서 동시성을 제어하는 방법 (0) | 2025.01.08 |
---|---|
[Back-End] 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 (1) | 2025.01.07 |
[Back-End] 스레드, 프로세스, 코어의 수는 많을수록 좋을까요? (2) | 2025.01.02 |
[Back-End] Shared Lock과 Exclusive Lock 이란? (0) | 2024.12.31 |
[Back-End] 로그와 메트릭에 대해 설명해봐라! (2) | 2024.12.19 |