Blocking/Non-Blocking & Sync/Async

0

참고링크

blocking / non-blocking

  • A함수가 B함수를 호출 했을 때, 제어권을 어떻게 처리하느냐에 따라 달라짐(혹은 프로그램이 바로 실행 할 수 있느냐)
  • 제어권
    • 함수의 코드를 실행할 권리 같은 것
    • 제어권을 가진 함수는 자신의 코드를 끝까지 실행 후 자신을 호출한 함수에게 돌려줌

blocking

  • blocking은 A함수가 B함수를 호출하면 제어권을 A가 B로 넘김
  • 직접 제어할 수 없는 대상의 작업이 끝날 때까지 기다려야 하는 경우
  • 제어권을 B에게 넘겼기 때문에 함수 실행을 잠시 멈춤. system call이 끝날 떄 까지 프로그램은 대기
  • waitQueue에 들어감
  • B함수가 완료되면 다시 A에게 제어권을 넘김. system call이 완료되면 그 때야 return

non-blocking

  • A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있음
  • A함수가 B함수를 호출하면, B함수는 실행되지만 제어권은 A함수가 그대로 가지고 있음
  • A함수는 계속하여 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행함
  • waitQueue에 들어가지 않음


sync / async

  • 함수의완료 여부를 신경 쓰는가
  • 가장 큰 차이점은 결과물을 가져오는 시점의 차이
  • synchronous & asynchronous는 결과물을 돌려 받는 시점에 초점을 두면 이해하기 쉬움
  • 동기는 호출한 함수가 내가 원하는 값을 바로 반환, 비동기는 호출한 함수가 내가 원하는 값을 콜백으로 반환

sync

  • A와 B가 시작 시간 또는 종료 시간이 일치하면 동기
  • 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴 값을 계속 확인하면서 신경 쓰는 것이 동기
  • system call이 끝날 때 까지 기다리고 결과물을 가져옴
  • 동기는 함수를 호출할 때 결과를 얻을 때까지는 호출이 아무것도 반환되지 않음

async

  • 호출하는 함수가 호출되는 함수에게 작업을 맡겨놓고 신경을 쓰지 않는 것
  • 함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부는 신경 쓰지 않음
  • system call이 완료되지 않아도 나중에 완료가 되면 그 때 결과물을 가져옴
  • 함수 A가 함수 B를 호출 할 때 콜백함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행

Blocking/Non-Blocking & Async/Sync

  • Blocking / Non-blocking 과 Sync / Async 는 '관점'을 어떻게 두느냐의 차이

Non-Blocking VS Asynchronous

  • system call이 즉시 return 될 때 데이터의 포함 유무
  • Asynchronous는 요청에 처리 완료와 관계없이 응답. 이후 운영체제에서 응답할 준비가 되면 응답
  • Non-Blocking은 요청에 처리할 수 있으면 바로 응답. 아니면 error를 반환

Blocking VS Synchronous

  • waitQueue의 유무
  • Blocking은 System Call의 return을 기다리는 동안 필수로 waitQueue에 머뭄
  • Synchronous는 system call의 return을 기다리는 동안 waitQueue에 머물 수도 있고 아닐 수도 있음

Sync-Blocking / Async-NonBloking

Sync-NonBlocking

  • B함수가 A함수에게 바로 제어권을 돌려주지만 언제 종료되는지 알 수 없는 B함수의 종료를 A함수가 처리되어야함
  • A함수가 직접 결과를 처리해야하는 상황이기에 B함수의 종료를 반복적으로 물어봐야함

Async-Blocking

  • 굉장히 비효율적인 구조

0개의 댓글