CS 기술면접을 준비하다 정확하게 알고가야 되는 부분이라고 생각해서 글로 적어놓음
블로킹 / 논블로킹, 동기 / 비동기 ?
프로그래밍 관점에서 봤을때, I/O방식은 크게 4가지로 구분된다.
기본 개념을 정리하고 가자면
- Blocking
- 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 떄까지 기다렸다가 자신의 작업을 시작한다
- Non-blocking
- 다른 주체의 작업에 관련 없이 자신의 작업을 한다.
- Synchronous
- 요청이 들어온 순서에 맞게 하나씩 처리한다.
- Asynchronous
- 하나의 요청이 끈나기도 전에, 다른 요청을 동시에 처리할 수 있다.
Synchronous와 Blocking은 무언가를 기다리게하고, Asynchronous와 Nonblocking은 기다리지 않고 바로 처리된다.
Synchronous & Asynchronous
동기 (Synchronous)
- 동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그결과각 동시에 일어난다는 약속
- 요청과 결과가 한 자리에서 동시에 일어남
- A노드와 B노드 사이의 작업 처리 단위를 동시에 맞추겠다.
비동기 (Asynchronous)
- 비동기는 동시에 일어나지 않는다를 의미한다. 요청과 결과가 동시에 일어나지 않을거라는 약속
- 요청한 그 자리에서 결과가 주어지지 않는다.
- 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.
동기와 비동기는 상황에 따라서 각각의 장단점이 있다.
동기방식은 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 되는 단점이 있다.
비동기방식은 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다.
동기 (Synchronous)방식의 예제
1. A의 계좌는 10,000원을 뺄 생각을 하고 있다.
2. A의 계좌가 B의 계좌에 10,000원을 송금한다.
3. B의 계좌는 10,000원을 받았다는 걸 인지하고, A의 계좌에 10,000원을 받았다고 전송한다.
4. A, B 계좌 각 각 차감과 증가가 동시에 발생했다.
순서를 보면 알겠지만 A의 계좌와 B의 계좌는 서로 요청과 응답(1~3과정)을 확인한 후 같은 일을 동시에 진행했다.
(4번 과정) '계좌이체'같은 작업은 동기방식으로 처리해야 A에서 보냈는데 B는 못받는 상황이 없겠죠?
반대로 비동기방식은 위의 예제처럼 노드사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.
비동기 (Asynchronous)방식의 예제
1. 학생은 시험문제를 푼다
2. 시험문제를 모두 푼 학생은 선생님에게 전송한다.
3. 선생은 학생의 시험지를 채점한다.
4. 채점이 다 된 시험지를 학생에게 전송한다.
5. 학생은 선생이 전송한 시험지를 받아 결과를 확인한다.
학생과 선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적)은 서로 다르다.
학생은 시험지를 푸는 역할을 하고 선생은 시험지를 채점하는 역할을 했다.
서로의 행위(목적)가 다르기때문에 둘의 작업 처리 시간은 일치하지 않고, 일치하지 않아도 된다.
Blocking & Non-blocking
블로킹과 논블로킹은 다른 작업을 수행하는 주체를 어떻게 상대하는지가 중요합니다. 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작한다면 이는 블로킹이고, 다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 이를 논블로킹이라고 할 수 있습니다.
스레드 A가 어떤 작업을 하는 다른 대상을 호출하고, 그 대상이 가져온 결과물을 받아 다시 작업을 재개하고 있습니다. 예를 들자면 Java에서 JDBC를 사용하여 DB에 질의를 날리고 결과를 받아오는 작업을 블로킹 작업이라고 부를 수 있습니다. 이와 반대로 다른 주체에게 작업을 요청하고 그 결과를 받을 때까지 기다리지 않으며 자신의 작업을 한다면 이를 논블로킹이라고 할 수 있습니다.
동기/비동기와 블로킹/논블로킹의 조합
동기, 블로킹 조합
동기이며 블로킹인 작업은 어떤 작업이 있을까요? 동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 그리고 블로킹의 조건인 '다른 작업을 하는 동안 자신의 작업을 일시정지할 것' 을 만족하는 작업의 예는 아래와 같습니다.
- JDBC를 이용해 DB에 쿼리 질의를 날린다
- 메서드에서 다른 메서드를 호출하여 결과값을 즉시 받아온다
비동기, 블로킹 조합
비동기의 조건인 '다른 작업과 시작, 종료 시간을 맞추지 말 것'과 블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다릴 것'을 만족해야 합니다. 비동기, 블로킹 조합은 결국 다른 작업이 끝날 때를 기다려야 하기 때문에 동기, 블로킹과 비슷한 작업 효율이 나옵니다. 즉 그리 좋은 효율이 나오지 않습니다. 개발자가 유도해서 이 상황을 만드는 것보다 비동기, 논블로킹 작업을 실행하였지만 자기도 모르게 블로킹 작업을 실행했을 때 이러한 결과가 나옵니다.
- 비동기, 논블로킹 작업을 호출하고 자신의 작업을 하던 도중 호출한 작업의 결과 값을 조회하려고 했을 때(블로킹 메서드 실행)
동기, 논블로킹 조합
동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 논블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 동기, 논블로킹 조합도 비동기, 블로킹 조합처럼 작업 효율이 좋지 않은 편입니다. 논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회합니다.
- Polling
비동기, 논블로킹 조합
'다른 작업과 시작, 종료 시간을 맞추지 말 것', '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 비동기, 논블로킹 조합은 자원이 충분하다면 효율이 좋은 조합입니다. 자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다. 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속할 수 있기 때문에 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적입니다.
- 대규모 사용자에게 푸시메세지 전송
- 다양한 외부 API를 한번에 호출할 때
'Javascript > Node.js' 카테고리의 다른 글
npm / yarn 서로 차이점 (0) | 2022.06.10 |
---|---|
Node.js의 특징 및 장단점 ? (0) | 2022.06.09 |
Restful API, package.json (Node.js) (0) | 2022.03.27 |