동기와 비동기
동기와 비동기 개념
- 동기
- 동기는 요청한 작업을 완료했는지를 확인하여 순차적으로 처리하는 것을 말합니다.
- 비동기
- 비동기는 요청한 작업을 완료했는지 확인하지 않고 비순차적으로 처리하는것을 말합니다.
동기와 비동기 처리 순서
- 동기
- A,B,C 요청 👉 A → B → C로 순서대로 실행
- 예시) A영화 예매를 하기 위해 줄을 섰는데 A가 1장, B가 100장, C가 2장을 구매하려 한다.
이때 직원이 일처리를 어떻게 하는가?
A는 한 장이라서 바로 티켓을 받을 수 있다. (B와 C는 한 장만큼 기다림)
B는 백장이라서 백장의 예매 처리가 될 때까지 기다렸다가 백장 티켓을 받는다. (C는 백한장만 큼 기다림)
C는 마지막으로 두장 처리가 된 후 티켓을 받는다.
즉 A, B, C 순차적으로 처리하기 때문에 B처럼 오래걸리는 일이 있어도 무조건 C는 B 다음에 처리가 되어 가장 늦게 받는다.
- 비동기
- A,B,C 요청 👉 C → B → A 혹은 B → A → C 등 무작위 실행
- 예시) A영화 예매를 하기 위해 줄을 섰는데 A가 1장, B가 100장, C가 2장을 구매하려 한다.
이때 직원이 일처리를 어떻게 하는가?
A는 한 장이라서 바로 티켓을 받는다. (B와 C는 한 장만큼 기다림)
마지막에 C가 요청을 했지만 비교적 빨리 끝나기 때문에 C의 두장을 먼저 처리해 줌 (B는 세장만큼 기다림)
마지막으로 B 백장을 처리 후 티켓을 받는다.
즉, A, B, C 순차적으로 처리하지 않고 우선 처리가 가능한 것부터 처리를 해줍니다.
우리가 흔히 동기는 블로킹이고 비동기는 논블로킹이다라고 생각하게 된 이유가 뭘까 생각을 하게 됐습니다.
어떤 이유일까 생각을 해보았는데요. 그 이유로는 싱글스레드를 기본 베이스를 깔아서가 아닐까 싶었습니다. 싱글스레드는 처리할 수 있는 공간이 하나인 것인데요, 처리 공간이 하나이니 동기처리를 하면 싱글스레드가 하나의 작업을 끝낼 때까지 다음 동작을 하지 않기 때문에 블로킹으로 생각을 하게 된 것 같고 비동기 처리의 경우에는 싱글스레드여도 동시다발적으로 진행이 되기 때문에 논블로킹으로 생각을 하게 된 것 같습니다.
동기는 순차적으로 작업하기 때문에 총 작업 시간이 각각의 작업 시간을 더한 값과 같지만 비동기는 비순차적으로 진행되기 때문에 총 작업 시간은 가장 오래 걸리는 작업시간만큼만 걸리는 것을 확인할 수 있습니다.
블로킹과 논블로킹
블로킹과 논블로킹 개념
- 블로킹 : 작업의 흐름을 차단
- 논블로킹 : 작업의 흐름을 차단하지 않음
기본적으로 블로킹과 논블로킹은 작업을 할 때 흐름을 막냐 안 막냐로 구분이 됩니다. 흐름을 막게 되면 블로킹, 막지 않으면 논 블로킹이라고 부르는데요 블로킹으로 진행이 된다면 다음 작업은 진행을 할 수가 없습니다. 논블로킹일때는 다음작업이 들어오면 막지 않고 작업을 계속 실행합니다. 이런 블로킹과 논 블로킹을 구분하는 것으로는 제어권이 존재합니다.
블로킹과 논블로킹의 제어권
- 블로킹
A함수에 제어권이 존재하는데 B함수가 호출이 되면 B함수로 제어권을 넘기게 됩니다. 이때 A함수는 제어권이 없어서 진행을 할수 없는 상황이 됩니다. B함수 실행 후 B함수가 완료가 되면 A함수에게 다시 제어권을 돌려줍니다. 제어권을 돌려받은 A함수는 다시 함수를 실행을 할 수 있습니다. - 논블로킹
A함수에 제어권이 존재하는데 B함수가 호출이 되면 제어권은 A함수에 두고 B함수만 실행을 시킵니다. 제어권은 A함수에 존재하기 때문에 A함수와 B함수가 둘 다 실행이 됩니다.
동기/비동기 + 블로킹/논블로킹 조합 정리
동기와 비동기, 블로킹과 논블로킹으로 조합할 수 있습니다.
- 동기 + 블로킹 ( Sync Blocking )
- Sync : 순차적으로 일을 수행
Blocking : 하나의 작업 실행 중에 다른 작업을 진행하지 않음
- Sync : 순차적으로 일을 수행
- 동기 + 논블로킹 ( Sync Non-Blocking )
- Sync : 순차적으로 일을 수행
Non-Blocking : 하나의 작업이 실행 중에도 다른 작업을 진행, 계속 다른 작업 완료 확인을 함
- Sync : 순차적으로 일을 수행
- 비동기 + 블로킹 ( Async Blocking )
- Async : 비순차적으로 일을 수행
Blocking : 하나의 작업 실행중에 다른 작업을 진행하지 않음 - 실무에서 거의 사용하지 않는 방법
실제로 사용하는 예시 : node.js + Mysql을 사용할 때
- Async : 비순차적으로 일을 수행
- 비동기 + 논블로킹 ( Async Non-Blocking )
- Async : 비순차적으로 일을 수행
Non-Blocking : 하나의 작업이 실행중에도 다른 작업을 진행, 다른 작업의 결과가 자신에게 영향을 주지 않은 경우에 활용
- Async : 비순차적으로 일을 수행
'개발지식' 카테고리의 다른 글
메모리 구조와 메모리 할당 (0) | 2024.01.22 |
---|---|
컴파일 언어와 스크립트 언어 (0) | 2024.01.22 |
Authentication과 로그인 (0) | 2023.12.25 |
env 환경변수 (0) | 2023.12.25 |
code refactoring (0) | 2023.12.12 |