동기/비동기 & 블로킹/논블록킹

참고 링크 https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

1. 동기/비동기 & 블로킹/논블로킹

  • 프로그래밍에서 웹 서버 혹은 입출력(I/O) 을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이라는 용어들을 접하게 된다.

  • 동기/비동기, 블로킹/논블로킹 이 두 개념은 표현 형태는 비슷하게 보일지라도, 서로 다른 차원에서 작업의 수행 방식을 설명하는 개념이다.

    • 동기/비동기는 요청한 작업에 대한 완료 여부를 신경써서 작업을 순차적으로 수행할지 아닌지에 대한 관점이다.

    • 블로킹/논블로킹은 단어 그대로 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다.

  • 동기/비동기는 완료 여부!

  • 블로킹/논블로킹은 차단 or 제어권 여부!

1-1. 동기(synchronous) / 비동기(Asynchronous)

  • 동기는 요청한 작업에 대해서 완료 여부를 따져 순차대로 처리하는 것을 의미한다.

  • 비동기는 요청한 작업에 대해서 완료 여부를 따지지 않기 때문에, 자신의 다음 작업을 그대로 수행하게 된다.

1-1-1. 비동기의 성능상 이점

  • 비동기는 요청한 작업의 완료 여부를 확인하지 않고, 자신의 그 다음 작업을 수행하기 떄문에 I/O 작업, API 요청과 같은 느린 작업이 발생할 때, 기다리지 않고 동시에 멀티 작업을 진행할 수 있다.

  • 예를 들어, 웹 어플리케이션에서 결재 처리 시 결제 요청은 동기적으로 처리하여 완료 여부를 확인하지만, 결제 완료 후 영수증 이메일 전송이나 포인트 적립과 같은 부수적인 기능은 비동기로 처리해 성능을 최적화 할 수 있다.

1-1-2. 동기와 비동기는 작업 순서 처리 차이

  • 동기와 비동기를 요청한 작업에 대해 완료 여부에 대한 차이라고 설명했다. 이를 쉽게 설명하면 여러개의 요청 작업을 순서대로 처리하느냐, 아니냐에 따른 차이로 보면 된다.

    • 요청한 작업에 대한 응답을 반드시 받아야 다음 작업을 수행한다는 말이다.

  • 따라서 동기 작업은 요청한 작업에 대해 순서가 지켜지는 것을 말하는 것이고, 비동기 작업은 순서가 지켜지지 않을 수 있다는 것을 말한다.

1-2. 블로킹(Blocking) / 논블로킹(Non-Blocking)

  • 블로킹과 논블로킹은 단어에서 알 수 있듯이 다른 요청의 작업을 처리하기 위해 현재 작업을 block(차단, 대기) 하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식이다.

  • 동기/비동기가 전체적인 작업에 대한 순차적인 흐름 유무라면, 블로킹/논블로킹은 전체적인 작업의 흐름 자체를 막냐 안막냐로 볼 수 있는 것이다.

  • 예를 들어, 파일을 읽는 작업을 생각해보자.

    • 파일을 다 읽을 때까지 대기한다면 블로킹 방식

    • 파일을 다 읽지 않아도 다른 작업을 할 수 있다면 논블로킹 방식

1-2-1. 비동기와 논블로킹의 개념 차이

  • 비동기와 논블로킹의 개념이 혼동될 수 있다.

  • 결국은 비동기나 논블로킹이나 추구하는 결과는 비슷하게 보일 수 있다.

  • 이는 시점과 관련된 이론적인 개념이라 실제 코드에서 경계를 구분하기가 애매하다..

1-2-2. 누가 제어권을 가지고 있는가?

  • 블로킹/논블로킹을 보다 명확하게 구분하기 위해서 '제어권' 이라는 단어를 쓴다.

    • 제어권은 간단히 말해 함수의 코드나 프로세스의 실행 흐름을 제어할 수 있는 권리 같은 것이다.

  • 호출된 함수로 제어권을 넘겨주면 블로킹

  • 호출된 함수로 제어권을 넘겨주지 않는다면 넌블로킹

Blocking
Non Blocking

Last updated