Blocking
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면
다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
Non-Blocking
다른 주체의 작업에 관련없이 자신의 작업을 하는 것
블로킹과 논블로킹 구별
- 처리되어야 하는 작업이, 전체적인 작업 흐름을 막느냐 안막느냐에 대한 관점
- 제어권이 누구한테 있느냐
블록킹
Blocking
A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨줌
- A함수가 B함수를 호출하면 B에게 제어권을 넘긴다.
- 제어권을 넘겨받은 B는 열심히 함수를 실행한다.
A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다. - B함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
논블록킹
Non-Blocking
A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있음
- A함수가 B함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
- A함수는 계속 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행한다.
즉, 블록킹과 논블록킹은 프로세스의 유휴 상태에 대한 개념으로
동기와 비동기라는 개념과 연관 지을 수 있는데,
서로 연관 짓는 것은
단지 조합하여 사용되기 때문이라는 것을 인지해야함
그럼 동기와 비동기란?
Synchronous
요청이 들어온 순서에 맞게 하나씩 처리하는 것
Asynchronous
하나의 요청이 끝나기도 전에, 다른 요청을 동시에 처리할 수 있는 것
동기와 비동기 구별
- 처리해야 할 작업들을 어떠한 흐름으로 처리 할 것인가에 대한 관점
제어권이란?
자신(함수)의 코드를 실행할 권리 같은 것
(제어권을 가진 함수는 자신의 코드를 끝까지 실행한후, 자신을 호출한 함수에게 돌려줌)
결과값을 기다린다는 것?
A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미
동기
Synchronous
결과를 기다림 (=함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것)
비동기
Asynchronous
결과를 기다리지 않음(=함수 A가 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않음)
함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서,
함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행
조합
Sync-Blocking
결과를 기다림 + 제어권을 돌려줄때까지 기다림
요청자는 결과가 나올때까지 계속 확인함, 요청받은 함수의 작업이 끝나야 제어권을 돌려받음
Sync-Nonblocking
결과를 기다림 + 제어권을 주지 않고, 자신의 코드를 계속 실행
제어권을 주지 않고 자신의 코드만 실행하고 있지만,
A 함수는 B 함수의 리턴값이 필요하기 때문에, B 함수가 함수 실행을 완료했는지 계속해서 조회
Async-Nonblocking
결과를 기다리지 않음 + 제어권을 주지 않고, 자신의 코드를 계속 실행
제어권을 넘기지않고 계속 작업을 실행, B 함수를 호출할 때 콜백함수를 함께 보내서
B 함수는 자신이 작업이 끝나면 A 함수가 준 콜백 함수를 알아서 실행
Async-blocking
결과를 기다리지 않음 + 제어권을 돌려줄때까지 기다림
A 함수는 B 함수의 리턴값에 신경쓰지 않고 콜백함수를 보냄,
B 함수의 작업에 관심이없지만 A 함수는 B 함수에게 제어권을 넘김,
때문에 A 함수는 B 함수의 작업이 끝나기를 기다려야함
Reference Path
'CS' 카테고리의 다른 글
마이크로서비스 아키텍처와 모놀리식 아키텍처 (0) | 2022.11.27 |
---|---|
비즈니스 로직 Business Logic (0) | 2022.11.27 |
로드밸런싱 Load Balancing (0) | 2022.11.20 |
TLS/SSL Handshake (0) | 2022.11.20 |
GET과 POST 방식 (0) | 2022.11.13 |