멍토의 Blocking vs Non-Blocking, Sync vs Async 의 내용을 정리한 글입니다.

 

Blocking VS Non-Blocking

Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것

Blocking예시
Blocking 설명 그림

                                            호출자                                                                      호출된 함수A

호출자는 함수A가 끝날때까지 기다리면서 다른일을 하지 못한다.

 

 

Non-Bolcing : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것

Non-Blocking 예시

호출자는 함수A를 호출하고 함수 A가 작업을 하는 순간 빠져나와 자기의 일을 합니다.

 

Blocking 설명 그림

                                           호출자                                                                          호출된 함수A

호출자는 함수A를 호출하고 작업을 하는 순간 빠져나와 자기의 일을 합니다.

 

 

다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 구분해 볼 수 있다.

Bolcking와 Non-Blocking은 호출되는 함수가 바로 return하느냐 마느냐가 관심사이다.

 

 

synchronous VS Asynchronous

 

synchronous : 번역을 해보면 동기라는 뜻을 가진다.

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미합니다.

synchronous 예시
synchronous 설명 그림

                                                 호출자                                                                  호출된 함수A

 

호출자는 함수A를 호출하고 호출자가 기다리거나 다른일을 하는 것을 신경 쓰지 않습니다.

 

호출자는 함수A에게 결과값을 반환받고 바로 처리합니다.(결과값을 반환받고 처리하는 시점에 의미를 두세요)

 

 

  • Thread1이 작업을 시작 시키고, Task1이 끝날때까지 기다렸다 Task2를 시작한다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 직접 받는 것이다.
  • 요청의 결과값이 return값과 동일하다.
  • 호출한 함수가 작업 완료를 신경 쓴다.

 

Asynchronous : 번역을 해보면 비동기라는 뜻을 가진다.

시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미합니다.

                                                  호출자                                                             호출된 함수A

호출자는 함수A를 호출하고 호출자가 기다리거나 다른일을 하는 것을 신경 쓰지 않습니다.

 

호출자는 함수A에게 결과값을 반환받고 언젠가 처리합니다.(결과값을 반환받고 처리하는 시점에 의미를 두세요)

결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지로 판단할 수 있습니다.

 

이 그룹은 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사이다.

 

 

  • Thread1이 작업을 시작 시키고, 완료를 기다리지 않고, Thread1은 다른 일을 처리할 수 있다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받는 것이다.
  • 요청의 결과값이 return값과 다를 수 있다.
  • 해당 요청 작업은 별도의 스레드에서 실행하게 된다.
  • 콜백을 통한 처리가 비동기 처리라고 할 수 있다.
  • 호출된 함수(callback 함수)가 작업 완료를 신경 쓴다.

 

4가지의 조합

Block/Sync

Blocking의 관점은 제어권에 있습니다 → 그래서 한 작업이 동작할 때 다른 작업은 동작하지 않습니다.

Sync의 관점은 결과의 처리입니다. → 그래서 kernel에서 결과를 반환하면 해당 업무를 application에서 바로 처리하게 됩니다.

 

  •  

ex) java에서 입력 요청을 할때

Non-Blocking/Sync

Non-Blocking의 관점은 제어권에 있습니다

→ 그래서 한 작업이 동작할 때 다른 작업은 동작합니다(결과가 나왔는지 계속 물어보는 동작) 아직 작업이 끝나지 않았다는 결과를 계속 반환해줍니다.

Sync의 관점은 결과의 처리입니다.

→ 그래서 kernel에서 결과를 반환하면 해당 업무를 application에서 바로 처리하게 됩니다.

 

Blocking/Async

Blocking의 관점은 제어권에 있습니다 → 그래서 한 작업이 동작할 때 다른 작업은 동작하지 않습니다.

ASync의 관점은 결과의 처리입니다. → 그래서 결과를 바로 처리하지 않아도 됩니다.

 

굳이 이렇게 해야할까? → 개발자의 실수 or 기타이유로 이런 코드가 작성되는 경우가 있다고 합니다.

 

Non-Blocking/Async

Non-Blocking의 관점은 제어권에 있습니다 → 그래서 한 작업이 동작할 때 다른 작업은 동작합니다(결과가 나왔는지 계속 물어보는 동작) 아직 작업이 끝나지 않았다는 결과를 계속 반환해줍니다.

ASync의 관점은 결과의 처리입니다. → 그래서 결과를 바로 처리하지 않아도 됩니다.

 

자기 일이 끝나면 받은 결과를 처리합니다.

 

대표적인 예시로 자바스크립트에서 API요청을 하고 다른 작업을 하다가 콜백을 통해서 추가적인 작업을 처리를 할때가 있습니다.

 

 

 

정리

  • 호출된 함수가 바로 return해서 호출한 함수에게 제어권을 넘겨주고호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있으면 non-blocking이다.
  • 호출된 함수가 자신의 작업을 모두 마칠 때까지호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 blocking이다.
  • 호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다면 비동기이다.
  • 호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나호출되는 함수로부터 바로 return 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경 쓴다면 동기이다.

 

예시

상황: 급하게 알아야 하는 답을 누군가에게 물어봐야하는 상황

  • 전화로 물어봐서 즉답을 얻는다. = 동기 요청처리
  • 이메일로 물어보고 메일 송신을 완료(return)했지만 답은 언제 올지 모른다. = 비동기 요청처리
  • 전화를 했는데 상대방이 너무 바빠 전화를 받지 않음전화를 받을때까지 계속 대기 = 동기 + 블록킹
  • 전화를 했는데 안 받음끊었다가 나중에 다시 전화함계속 반복했다가 어느 순간에 받아서 답을 얻음 = 동기 + 논블록킹

 

추가 

java: block, sync

js : non-block, async

 

 

 

출처 : 우아한 테코톡

https://velog.io/@wonhee010/동기vs비동기-feat.-blocking-vs-non-blocking

 

반응형

+ Recent posts