feat. 슬램덩크
" 동기? 그거는 블록킹 아닌가? 비동기는 논블록킹이고?? "
그렇게 서치를 하던 중... 그 둘이 다르다는 글을 발견하게 되고....
잠시 혼돈의 카오스에 있다가 차분히 글을 쓰기로 다짐하는데....
터벅터벅 동기와 블록킹의 세계로.....
동기(Synchronous)와 비동기(Asynchronous)
vs
블록킹(Blocking)과 논블록킹(Non-Blocking)
이 둘이 다르다는데 어디 한 번 뭐가 다른지 파헤쳐보기로 하자.
- 들어가기 전, 개념 정리 -
- 제어권
자신의 함수내용을 실행할 권리
제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다
- 결과값
함수의 리턴값
먼저 Synchronous 어원을 살펴보면,
[ Syn - Together ] [ chron - Time ] : 함께 시간을 맞추는
예를 들면 립싱크, 칼군무를 맞추는 것을 떠올려 볼 수 있다.
동기는 서로 다른 상태를 결합하여 동일한 상태를 유지하는 것.
또는 동시에 발생하는 것
등의 설명이 있다. 동기 : 같은 시간
이라는 의미에서 대학동기, 군대동기라는 뜻이 있듯이 동시에 발생한다는 뜻이 있다.
그리고 다른 포스팅 글에서 '동기'라는 개념을 설명할 때, 현재 작업의 요청과 결과가 동시에 이뤄지는 것
이라고 말한다. 나도 이렇게 메모했었다
하지만 동기 = 같은시간 의 의미를 생각하면 요청과 응답결과 사이에서 같은 시간이란 존재할 수가 없다. 내가 본 글의 evan-moon님은 의미를 더 정확하게 풀어서 설명한 것을 볼 수 있다.
여기에서의 동기는 현재 작업의 응답과 다음 작업의 요청
이라는 설명을 했다. 이는 현재 작업의 요청과 응답이 아니라, 현재 작업의 응답 - 다음 작업의 요청 시간을 맞춘다는 것이다.
따라서 동기의 개념을 정리해보자면,
순서와 결과값을 신경쓰냐의 관점
- 순서
: 현재 작업의 응답 - 다음 작업의 요청이 동시에 이뤄진다- 결과값 신경씀 ⭕️
: 호출된 함수의 결과값을 신경씀
현재 작업의 응답이 나올 때까지, 다음 작업의 요청이 대기
호출한 함수가 호출된 함수의 결과값에 신경 씀
// 호출한 함수(요청자)와 호출받은 함수
function A() { // 호출받은 함수
let a = 1;
let b = 1;
return a+b;
}
function 호출한함수(){
A(); // 호출함. 결과값에 신경씀
B();
}
- 순서
: 현재 작업의 응답 - 다음 작업의 요청이 서로 다른시간에 이뤄진다- 결과값 신경안씀 ❌
: 호출된 함수의 결과값을 신경안씀. 호출된 함수는 작업 종료되면 알려줌
동기/비동기에서 항상 블록킹/논블록킹을 언급할 수 있는 것이 아니다.
직접 제어할 수 없는 대상을 처리하는 방법(제어권 여부)에 따라서 Blocking / Non-Blocking을 설명할 수 있다.
** 직접 제어할 수 없는 대상의 예 ) IO, 멀티쓰레드 동기화
그런데 여기에서 동기/비동기 - 블록킹/논블록킹이 서로 중복되서 나타나기도 하기때문에 같은 개념이라고 오해하기가 쉽다. 하지만 보는 관점이 다르기때문에 나눠서 생각해야 한다.
다른 주체의 작업이 시작될 때,
현재 작업이 제어권 없어서 막히냐? or 제어권 있어서 안막히냐?
- 제어권의 관점 : 제어권이 누구한테 있느냐가 관심사
자신의 작업을 실행하다가 다른 주체의 작업이 시작되면 제어권을 넘기고 다른 작업이 끝날때까지 기다렸다가 자신의 작업을 시작하는 것
다른 주체의 작업에 상관없이 자신의 작업을 실행하는 것
// alert 때문에 console.log가 blocking 된다.
alert("Hello");
console.log("hi"); // blocking 막혀서 안됨
이처럼 관점이 다르기 때문에 각각의 개념을 서로 조합할 수 있다.
Blocking | Non-Blocking | |
---|---|---|
Sync | Blocking / Sync | Non-Blocking / Sync |
Async | Blocking / Async | Non-Blocking / Async |
제어권 넘겨주고 대기 + 결과값 신경 씀
ex) Java, Spring MVC 프레임워크
나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래? 잠깐 기다려봐
나 - 기다리는 중
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - (과정 지켜보고 결과 궁금함.. 다른 데 지원 못감. 발목 잡힘)
나 - 결과 발표했네!
제어권 바로 돌려줌 + 결과값 신경 씀
ex) 게임에서 맵을 넘어갈때. 유저에게 어느정도 로드율 됐는지 보여줄때
나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래, 다른 곳도 지원하던가 너 볼일 봐.
나 - 당연하지;;
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - 나 뽑을 거야 말거야?
구글 - 아직, 기다려
나 - 나 뽑을 거야?
구글 - 아직, 기다려
나 - 나 뽑을 거야?
구글 - 아니 ㅎㅎㅎ
제어권 넘겨주고 대기 + 결과값 관심없음. 요청받은 함수가 끝나면 알아서 결과값 알려줌
나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래? 잠깐 기다려봐
나 - 기다리는 중
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - (과정 안보고 결과도 안궁금.. 근데 다른 데 지원 못감. 발목 잡힘)
구글 - 발표할게!
제어권 바로 돌려줌 + 결과값 관심없음. 요청받은 함수가 끝나면 알아서 결과값 알려줌
fetch('url', option)
.then(res => {return res.json();})
.them(data => {somthing(data)});
나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래, 다른 곳도 지원하던가 너 볼일 봐.
나 - 당연하지;;
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - 애플, 페이스북도 지원하는 중...
구글 - 나 너 뽑는다!!!!!
나 - 아싸~!
[YouTube] 스프링캠프 2017 [Day1 A2] : Async & Spring - 이일민
Boost application performance using asynchronous I/O - IBM Developer (By M. Jones)
동기(Synchronous)는 정확히 무엇을 의미하는걸까? - evan-moon.github.io(문동욱)
Sync VS Async, Blocking VS Non-Blocking - codemcd velog
블로킹(Blocking)/논블로킹(Non-Blocking), 동기(Sync)/비동기 - joooing 티스토리