TIL - Sync vs Async / Blocking vs Non-Blocking

moontag·2022년 5월 27일
0

JavaScript TIL

목록 보기
18/20
post-thumbnail

feat. 슬램덩크





" 동기? 그거는 블록킹 아닌가? 비동기는 논블록킹이고?? "

그렇게 서치를 하던 중... 그 둘이 다르다는 글을 발견하게 되고....
잠시 혼돈의 카오스에 있다가 차분히 글을 쓰기로 다짐하는데....
터벅터벅 동기와 블록킹의 세계로.....

동기(Synchronous)와 비동기(Asynchronous)
vs
블록킹(Blocking)과 논블록킹(Non-Blocking)

이 둘이 다르다는데 어디 한 번 뭐가 다른지 파헤쳐보기로 하자.











- 들어가기 전, 개념 정리 -

  • 제어권
    자신의 함수내용을 실행할 권리
    제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다

  • 결과값
    함수의 리턴값








Q. 동기가 뭐야?

먼저 Synchronous 어원을 살펴보면,
[ Syn - Together ]   [ chron - Time ] : 함께 시간을 맞추는
예를 들면 립싱크, 칼군무를 맞추는 것을 떠올려 볼 수 있다.

  동기는 서로 다른 상태를 결합하여 동일한 상태를 유지하는 것. 또는 동시에 발생하는 것 등의 설명이 있다. 동기 : 같은 시간 이라는 의미에서 대학동기, 군대동기라는 뜻이 있듯이 동시에 발생한다는 뜻이 있다.
  그리고 다른 포스팅 글에서 '동기'라는 개념을 설명할 때, 현재 작업의 요청과 결과가 동시에 이뤄지는 것 이라고 말한다. 나도 이렇게 메모했었다
하지만 동기 = 같은시간 의 의미를 생각하면 요청과 응답결과 사이에서 같은 시간이란 존재할 수가 없다. 내가 본 글의 evan-moon님은 의미를 더 정확하게 풀어서 설명한 것을 볼 수 있다.
여기에서의 동기는 현재 작업의 응답과 다음 작업의 요청이라는 설명을 했다. 이는 현재 작업의 요청과 응답이 아니라, 현재 작업의 응답 - 다음 작업의 요청 시간을 맞춘다는 것이다.

따라서 동기의 개념을 정리해보자면,

1. A와 B가 동시에 시작시간 또는 종료시간이 일치하는 것

  • A, B 쓰레드가 동시에 작업을 시작하는 것 (자바에서 CyclicBarrier)
    A --------> A
    B --------> B

2. A가 끝나는 지점(응답)과 B가 시작하는 시간(요청)이 같은 것

  • (자바에서 synchronized, BlockingQueue)
    A -------->  A
                          B --------> B




1. Sync 동기 vs Async 비동기

순서결과값을 신경쓰냐의 관점

동기 (Synchronous)

  • 순서
    : 현재 작업의 응답 - 다음 작업의 요청이 동시에 이뤄진다
  • 결과값 신경씀 ⭕️
    : 호출된 함수의 결과값을 신경씀
  • 현재 작업의 응답이 나올 때까지, 다음 작업의 요청이 대기

  • 호출한 함수가 호출된 함수의 결과값에 신경 씀

    // 호출한 함수(요청자)와 호출받은 함수
    function A() { // 호출받은 함수
      let a = 1;
      let b = 1;
      return a+b;
    }
    
    function 호출한함수(){
      A();   // 호출함. 결과값에 신경씀
      B();
    }

비동기 (Asynchronous)

  • 순서
    : 현재 작업의 응답 - 다음 작업의 요청이 서로 다른시간에 이뤄진다
  • 결과값 신경안씀 ❌
    : 호출된 함수의 결과값을 신경안씀. 호출된 함수는 작업 종료되면 알려줌
  • 현재 작업의 응답을 기다리지 않고, 다음 작업의 요청이 가능
  • 결과값을 신경쓰지 않음






2. Blocking vs Non-Blocking

동기/비동기에서 항상 블록킹/논블록킹을 언급할 수 있는 것이 아니다. 직접 제어할 수 없는 대상을 처리하는 방법(제어권 여부)에 따라서 Blocking / Non-Blocking을 설명할 수 있다.
** 직접 제어할 수 없는 대상의 예 ) IO, 멀티쓰레드 동기화

그런데 여기에서 동기/비동기 - 블록킹/논블록킹이 서로 중복되서 나타나기도 하기때문에 같은 개념이라고 오해하기가 쉽다. 하지만 보는 관점이 다르기때문에 나눠서 생각해야 한다.

다른 주체의 작업이 시작될 때,
현재 작업이 제어권 없어서 막히냐? or 제어권 있어서 안막히냐?

  • 제어권의 관점 : 제어권이 누구한테 있느냐가 관심사

Blocking

자신의 작업을 실행하다가 다른 주체의 작업이 시작되면 제어권을 넘기고 다른 작업이 끝날때까지 기다렸다가 자신의 작업을 시작하는 것

  • 제어권을 다른 작업에 위임함. 다른 주체의 작업을 대기했다가 제어권을 돌려받음
    ex) 전화, 재채기

Non-Blocking

다른 주체의 작업에 상관없이 자신의 작업을 실행하는 것

  • 제어권을 넘겨줬다가 바로 돌려받음
    ex) 문자
    예) JavaScript
    **JavaScript 예외 : alert는 blocking function다.
    // alert 때문에 console.log가 blocking 된다.
    alert("Hello");
    console.log("hi"); // blocking 막혀서 안됨









  • 동기와 비동기 : 순서와 결과값의 관점
  • 블록킹과 논블록킹 : 제어권의 관점

이처럼 관점이 다르기 때문에 각각의 개념을 서로 조합할 수 있다.





4가지 조합


BlockingNon-Blocking
SyncBlocking / SyncNon-Blocking / Sync
AsyncBlocking / AsyncNon-Blocking / Async

1. Blocking / Sync

제어권 넘겨주고 대기 + 결과값 신경 씀
ex) Java, Spring MVC 프레임워크

나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래? 잠깐 기다려봐
나 - 기다리는 중
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - (과정 지켜보고 결과 궁금함.. 다른 데 지원 못감. 발목 잡힘)
나 - 결과 발표했네!

2. Non-Blocking / Sync

제어권 바로 돌려줌 + 결과값 신경 씀
ex) 게임에서 맵을 넘어갈때. 유저에게 어느정도 로드율 됐는지 보여줄때

나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래, 다른 곳도 지원하던가 너 볼일 봐.
나 - 당연하지;;
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - 나 뽑을 거야 말거야?
구글 - 아직, 기다려
나 - 나 뽑을 거야?
구글 - 아직, 기다려
나 - 나 뽑을 거야?
구글 - 아니 ㅎㅎㅎ

3. Blocking / Async

제어권 넘겨주고 대기 + 결과값 관심없음. 요청받은 함수가 끝나면 알아서 결과값 알려줌

나 - 거기 지원했으니깐 저 좀 뽑아주시죠
구글 - 그래? 잠깐 기다려봐
나 - 기다리는 중
구글 - (지원서 확인, 포폴 확인, 맥북 확인 ...)
나 - (과정 안보고 결과도 안궁금.. 근데 다른 데 지원 못감. 발목 잡힘)
구글 - 발표할게!

4. Non-Blocking / Async

제어권 바로 돌려줌 + 결과값 관심없음. 요청받은 함수가 끝나면 알아서 결과값 알려줌

  • 각자 작업 처리. 자신의 일 끝나면 다른작업 결과를 처리함
    ex) JavaScript, Node.js
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 티스토리










profile
터벅터벅 나의 개발 일상

0개의 댓글