Blocking/Non-blocking & Synchronous/Asynchronous

글을 시작하기전

function A(){
	B();
    C();
}

이처럼 A가 호출하는 함수 , 나머지가 호출된 함수라고 가정하자.

Blocking/Non-blocking

제어권

개념

간단히 말하자면, A가 B에게제어권을 주냐(Non-Blocking) 안주냐(Blocking) 차이이다.

Blocking


B가 자신의 일을 다 할때까지 제어권을 가진다. A는 기다려야함. 그동안 C로 넘어갈 수 없다.

Non-Blokcing

  • B가 A에게 제어권을 바로 넘겨줘서 A가 자신의 일을 할 수 있다. C로 넘어갈 수 있다.

  • A는 B를 기다리면서 다른일을 한다

    • B의 결과는 어디로???
    • 제어권을 넘겨주면서 콜백함수도 넘겨주는데, 일단 완료되지 않았다는 결과를 넘겨준다고 생각하면 된다

Synchronous/Asynchronous

시간, 동시성

개념

간단히 말하면, B의 종료를 A가 처리하느냐(Sync) 마느냐(Async) 차이

Sync

  • A는 B가 동작 하는 중에, 결과를 기다리면서 상태체크한다. 그리고 B끝나면, 전달받은 값으로 가지고 처리한다.

  • 여기서 Blocking과 다른점이 , Blokcing은 그냥 기다리기만 하는데, Sync는 확인한다는 것이다.

  • Java에서 synchronized 키워드를 통해 쓰레드간 동기화를 할 수 있다 -> data의 thread-safe

    • thread는 공유 메모리 영역을 가지기 때문에 data의 thread-safe이 중요하다. 잘못하면 데이터가 의도치 않은 값으로 변경될 수 있음.

Async

  • A가 B에게 작업을 요구하면 callback을 전달하고 B가 함수결과를 직접처리한다.
  • A가 sync처럼 전달받은 값을 바로 처리하지 않는다.

Blocking/Non-Blocking, Sync/Async의 조합

Java는 block/sync , JS는 non-block/async 인것을 떠올리면 두개는 어느정도 이해가 될 것

Blocking & Synchronous


이런 JAVA에서의 입출력 상황을 생각

Blocking & Asynchronous

  1. 상사에게 서류를 전달했다.(A)
  2. 상사가 서류보는동안(B 시작)기다리란다
  3. 저거 바로 처리할 필요없는 서륜데..하면서 기다린다 (Block)
  4. 상사가 서류를 다보고(B 종료) 바로처리하고 하지만, 바로 할 필요없으니 나중에 처리한다(Async)

이런 경우는 보통 개발자의 실수로 발생한다고 한다.

Non-blocking & Synchronous


출처

while문을 보면 while문으로 자기할일을 계속(Non-Block)하면서
ready를 확인 한다(Sync)
그리고 그결과를 바로처리한다.

예시를 들면,

치킨 시키고 다른일 하면서 치킨언제오는지 계속 확인하는것이다. 오면 바로 먹고

Non-blocking & Asynchronous


B가 진행되는 동안 A는 자기일을 계속한다. (Non-Block)
그리고 A는 B의 결과를 바로 처리하지 않아도 된다(신경x) (Async)

완전 따로따로 논다고 생각하면된다.
보통 JS에서 API 요청을 하고, 다른 작업을 하다가 콜백을 통해 추가적인 작업을 처리할 때 이렇게 한다.

4가지 중 가장 자원을 효율적으로 사용하는 케이스이다






참고 유튜브

좋은 웹페이지 즐겨찾기