JAVA

Blocking , NonBolocking

whyWhale 2021. 5. 23.

동기(Synchronous) vs 비동기(Asynchronous)


동기(Synchronous)

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

비동기(Asynchronous)

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

 

blocking vs non-blocking


IO의 읽기, 쓰기에서 사용된다.

 

blocking

  • 요청한 작업을 마칠 때까지 계속 대기한다.
  • 즉시 return한다.
  • return 값을 받아야 끝난다.
  • Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용/대기 한다.

non-blocking

  • 요청한 작업을 즉시 마칠 수 없다면 즉시 return한다.
  • 즉시 리턴하지 않는다. (일을 못하게 막는다.)
  • Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.

 

 

 

블록킹, 논 블록킹, 동기, 비동기 차이


  • 관심사가 다르다.
    • Blocking, NonBlocking
      • 호출되는 함수가 바로 return 하는것인가 안하는 것인가 중점이다.
        • blocking  : 호출된 함수가 자신의 작업을 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않고 대기하면 Blocking
        • Non blocking : 호출된 함수가 바로 ret해서 호출 함수에게 제어권을 넘겨주고 호출 함수가 다른일을 할 수 있는 것을 Non Blokcing
    • Sync,Async
      • 호출되는 함수의 작업 완료 여부가 누구인가가 중점이다.
        • 호출하는 함수가 호출되는 함수의 작업 완료 후 ret을 기다리거나 호출되는 함수로부터 바로 ret 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하면 동기.
        • 호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면 호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다면 비동기.

 

 

 

 

표 관점 설명


 

blocking + Synchronous / non-blocking + Asynchronous

  • blocking + Synchronous
    • 결과가 처리되어 나올때까지 기다렸다가 return 값으로 결과를 전달한다.
  • non-blocking + Asynchronous
    • 작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 return 한다.
      결과는 별도의 작업 후 간접적으로 전달(callback)한다.

 

non-blocking + Synchronous

  • 결과가 없다면 바로 return한다.
  • 결과가 있으면 바로 결과를 return 한다.(결과가 생길때까지 계속 완료 되었는지 확인 pull)

 

 

blocking + Asynchronous

  • 호출되는 함수가 바로 return하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는다.( 이점이 없어서 일부러 이 방식을 사용하진 않는다.)
  • (의도하지 않게 blocking+Async로 동작하는 경우가 있다고 한다) non-blocking+Async를 추구하다 의도가 변질되어버린다( 대표적으로 Node.js + MySQL.)

 

 

 

더보기

ref

https://www.youtube.com/watch?v=IdpkfygWIMk

'JAVA' 카테고리의 다른 글

객체 판별  (0) 2021.10.18
동시성  (0) 2021.05.31
Enum class  (0) 2021.05.17
인터페이스, 추상클래스  (0) 2021.05.16
static  (0) 2021.05.04

댓글