일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- react
- styled-component
- scrapping
- 회고
- 정규표현식
- go
- CDN
- cicd
- component
- docker
- sequelize
- typescript
- route
- socket.io
- 포트포워딩
- graphql
- Recoil
- 웹팩
- 반응형웹
- Modal
- 웹크롤링
- npx
- javascript animation
- AWS
- express
- Redux
- 성능최적화
- Today
- Total
프로그래밍 공부하기
Block vs Non-Block & Sync vs Async 본문
블로킹과 논블로킹, 동기와 비동기 각각에 대해서 무엇인지는 설명할 수 있어도 블록킹과 동기가 무엇이 다른지에 대해 설명하기는 상당히 어렵다. 이들에 대해 정리해보고 차이점이 무엇인지 찾아보자.
1. Block / Non-Block
const B = () => {
console.log("나는 B야");
}
const A = () => {
B();
console.log("나는 A야");
}
2개 이상의 작업이 있을 때 한 작업이 다른 작업이 종료될 때까지 본인의 작업을 진행할 수 있는가에 대한 개념이다. 보통 직접 제어할 수 없는 I/O, 멀티스레드 동기화 등에 적용되는 개념이다. Block/Non-Block은 제어권의 이동이라는 개념으로 설명하기도 한다. 제어권이라는 것은 함수를 실행할 수 있는지를 의미한다. 위와 같이 함수 A 내에서 함수 B를 호출한다 생각해보자.
Blocking은 A의 작업 도중 B를 호출하는 경우 B의 작업이 끝날 때까지 A는 작업을 할 수 없다. 제어권의 개념으로 보면, 제어권이 A에 있다가 B를 호출할 때 B로 제어권이 이동한다. A는 제어권이 없으므로 나머지 로직을 실행하기 위해서 B의 작업이 끝나 제어권이 A로 돌아올 때까지 기다려야 한다.
Non-Blocking은 A의 작업 도중 B를 호출한 후 B의 작업과 상관없이 A의 나머지 작업을 수행하는 것이다. 이 경우 제어권은 B에게 넘어가도 B는 즉시 결과를 return하여 A에게 제어권을 돌려준다.
2. Sync / Async
작업을 수행하는 두 주체가 서로의 작업의 시작/완료 여부를 확인해야 하는가에 대한 개념이다. 더 정확히는 작업을 요청한 측(A)에서 요청한 작업(B)의 완료여부를 확인하면 동기, 그렇지 않으면 비동기이다.
동기 작업은 다수의 작업의 주체들이 서로 동시에 시작하거나, 끝나거나 혹은 끝나는 동시에 시작하는 경우이다. A함수에서 B함수를 호출했을 때 B함수의 완료여부를 A가 기다리거나 B의 작업 완료 여부를 계속 확인한다면 동기이다.
비동기 작업은 다수의 작업의 주체들이 서로의 작업의 시작/완료 시간과 상관없이 별도로 작업을 시작하고 종료하는 경우이다. 예를 들어 A가 B함수를 호출하면서 콜백함수를 함께 전달하여 B의 작업 완료와 상관없이 자신의 작업을 계속해나가는 것이다.
3. Combination
3-1. Sync Blocking
동기 블로킹은 작업들의 시작 시간, 종료 시간이 서로 영향을 받으면서 + 다른 작업을 하는 동안 자신의 작업을 중지해야하는 경우이다. 대부분의 함수 호출이 이에 속한다.
3-2. Sync Non-blocking
동기 논블로킹은 작업들의 시작 시간, 종료시간이 서로 영향을 받으면서 + 다른 작업이 끝나기를 기다리지 않는 경우이다. A작업이 자신의 작업을 수행하면서 B작업이 완료여부를 지속적으로 확인하는 경우가 이에 속한다. Java의 Future.isDone()이 이에 속한다고 한다.
3-3. Async Blocking
비동기 논블로킹은 작업들이 서로의 시작/종료 시간에 관심이 없고 + 다른 작업을 하는 동안 자신의 작업을 중지해야하는 경우이다. 예를 들면 Node.js에서 MySQL을 쓸 경우이다. Node.js에서 MySQL호출 시 MySQL의 드라이버를 사용하는데 이 드라이버가 Blocking방식이라 Node.js의 나머지 코드는 동작을 할 수 없다고 한다.(관련블로그글)
3-4. Async Non-Blocking
비동기 논블로킹은 작업들이 서로의 시작/종료 시간에 관심이 없고 + 다른 작업이 끝나기를 기다리지 않는 경우이다. 예를 들어 비동기 함수를 호출하며 콜백함수를 함께 전달하는 경우가 이에 속한다.
테코톡 영상: https://www.youtube.com/watch?v=IdpkfygWIMk
참고글1: https://deveric.tistory.com/99
참고글3: https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
'Web > [JS] Common' 카테고리의 다른 글
IIFE(즉시 실행 함수 표현) (0) | 2021.06.10 |
---|---|
변수 선언 키워드 - let, const 그리고 var (0) | 2021.06.08 |
함수형 프로그래밍 (0) | 2021.06.03 |
Dependency Injection(의존성 주입) (0) | 2021.05.31 |
socket.io (0) | 2021.04.30 |