동기 vs 비동기, 블로킹 vs 논블로킹

bp.chys·2021년 6월 3일
0

TIL(Today I Learned)

목록 보기
3/11

동기 (sync)

  • 메소드를 실행시킴과 동시에 결과 값이 기대되는 경우, 요청을 보낸쪽에서 결과가 반환될 때까지 기다린다.
  • 안전성과 실행순서가 보장된다.
  • 느리다.

비동기 (async)

  • 요청을 보낸 쪽이 아니라 응답을 주는 쪽에서 결과를 알려준다.
  • 요청을 보낸 쪽은 응답이 올 때까지 다른일을 하고 있는다.
  • 빠르다.
  • 순서가 보장되지 않기 때문에 처리하기가 까다로울 수 있다.
  • 비동기로 처리하면 백그라운드에서 해당 작업을 처리하는 것을 의미한다.

블로킹(blocking)

  • 스레드에서 발생하는 대기현상
  • 네트워킹을 해야하는 대상이 여럿이라면 블로킹 소켓의 경우 대상 개수만큼 스레드를 생성한다. (멀티 스레드)
  • 스레드가 많아지면 각 스레드가 차지하는 호출 스택 자원과 컨텍스트 스위칭 비용이 많이 발생한다.
  • 즉, 블로킹 매커니즘의 주요 특징은 I/O가 가득 수신할 때까지 주어진 스레드가 아무것도 하지 않는다고 가정하는 것이다. 이 경우 메서드가 제어권을 반환하지 않으므로 애플리케이션 플로우가 블록된다.

논블로킹(non-blocking)

  • 소켓 시스템콜에 대해 네트워크 시스템이 즉시 처리할 수 없는 경우라도 제어권이 바로 리턴되어 프로그램이 블록되지 않게하는 소켓 모드이다.
  • 통신 상대가 여럿이거나 여러 작업을 병행하려면 논블로킹 또는 비동기 모드를 사용해야 한다.
  • 어떤 시스템콜이 성공적으로 실행될 때까지 계속 루프를 돌면서 확인한다.(폴링)
  • 단일 스레드로 운영할 경우 순차 실행을 보장할 수 있지만, 시간이 오래걸리면 그만 큼 다른 채널의 이벤트를 수행하지 못한다. 이럴땐 멀티스레드로 구현해야 한다.
  • 논블로킹 매커니즘은 I/O요청을 즉시 큐에 넣고 애플리케이션 플로우 제어를 반환한다. 요청은 나중에 커널에서 처리된다. (리액티브)
  • 블로킹보다 구현이 어렵지만, 성능과 확장에 유리하다.

논블로킹 ≠ 비동기

  • 논블로킹 환경에서 응답이 빨리 돌아오지 않는다면 API는 에러와 함께 복귀하고 다른 행동을 하지 않는다. 반면 비동기 환경에서는 API는 항상 즉시 복귀하지만 응답은 늦게 돌아오기도 한다.
  • 즉, 논블로킹 매커니즘에서 함수가 호출되어 있어도 제어권이 반환되었으므로 다음 작업을 실행하고, 비동기 매커니즘에서는 함수호출을 스택에 남겨두고 함수호출을 대신하여 작업이 계속 이어진다. (다른 스레드에서!)
  • 비동기는 병렬(parallel)에 가깝고, 논블로킹은 폴링(polling)에 가깝다.
profile
하루에 한걸음씩, 꾸준히

0개의 댓글