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

이하연·2021년 9월 16일
0

[Network] 네트워크

목록 보기
7/9

동기와 비동기

처리해야 할 작업들을 어떠한 "흐름" 으로 처리 할 것인가에 대한 관점

작업을 수행하는 주체가 2개 이상이어야 합니다.

동기와 비동기의 차이

  • 호출되는 함수의 작업 완료 여부를 신경쓰는지의 여부
  • 동기는 작업의 시간을 서로 맞춰야하는 경우 , 비동기는 서로 작업의 시간이 관계 없을 경우

블로킹와 논블로킹

처리되어야 하는 (하나의) 작업이, 전체적인 작업 "흐름"을 막느냐 안막느냐 에 대한 관점

작업의 대상이 2개 이상이어야 합니다.

다른 작업을 수행하는 주체가 어떻게 상대하는지에 따라 달라집니다.

제어권을 어떻게 처리하느냐에 따라 달라집니다.

제어권

제어권이란, 자신(함수)의 코드를 실행할 권리 같은 것입니다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신의 호출한 함수에게 돌려줍니다.


동기 Synchronous

정의

동기란 요청과 응답이 한 자리에서 동시에 일어난다는 의미입니다.

요청을 하게되면 시간과 상관없이 요청한 자리에서 결과를 주어야합니다.

  • 2개 이상의 주체가 서로 동시에 수행하거나 동시에 끝날 경우
  • 한 주체가 끝나는 동시에 다른 주체가 시작할 경우

장점

  • 설계가 매우 간단하고 직관적
  • 유지보수, 디버깅(논리적 오류 찾아내고 수정하는 작업)이 쉽다.

단점

  • 결과가 주어질 때까지 무한대기 → 대기할 동안 아무것도 못함
  • 시간낭비

비동기 Asynchronous

비동기란 요청과 응답이 한 자리에서 동시에 일어나지 않음을 의미합니다.

요청한 자리에서 결과를 주지 않아도 됨으로 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 됩니다.

  • 서로 다른 주체가 각자 하는 작업이 자신의 시작, 종료 시간과는 관계 없이 각자 수행 시작/종료 시간을 가지고 있을 경우

장점

  • 자원을 효율적으로 사용 가능

    → 결과 나올때까지 무한대기 상태가 아닌 그 시간동안 다른 작업을 할 수 있음

단점

  • 지속적으로 응답할 수 있게 해주지만, 동기적 방식에 비해 많이 비용 발생

블로킹

정의

자신의 작업을 하는 도중에 다른 주체의 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작하는 경우

A함수가 B함수를 호출하면, 제어권을 A→B로 넘겨줍니다. 이후 제어권을 받은 B가 함수를 실행하고, 제어권이 없는 A는 함수 실행을 멈추고 기다립니다. B가 함수 실행이 완료가 되면 다시 자신을 호출한 A에게 제어권을 돌려줍니다.

논블로킹

정의

다른 주체의 작업과 관계없이 자신의 작업을 계속하는 경우

다른 주체를 호출해도 제어권은 그대로 자신이 가지고 있습니다.

A함수가 B함수를 호출하면, B함수는 실행되지만 제어권은 그대로 A함수가 가지고 있습니다. 따라서 B함수를 호출한 후로도 계속해도 자신의 코드를 실행합니다.


조합 4가지

1. 동기 , 블로킹

함수 A는 함수 B의 리턴값을 필요로 한다 ( 동기 )

제어권을 함수B에게 넘겨준 후, 함수B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다 ( 블로킹 )

예시 - 메서드에서 다른 메서드를 호출하여 결과값을 즉시 받아온다.

2. 동기, 논블로킹

A함수는 B함수를 호출한다. 이때 A함수는 B함수에게 제어권을 주지 않고 자신의 코드를 계속 실행한다. ( 논블로킹 )

A함수는 B함수의 리턴값이 필요하기 때문에, 중간중간에 B함수에게 함수 실행이 완료됬는지 물어본다 ( 동기 )

예시 - polling

3. 비동기, 블로킹

이 경우는 거의 사용하지 않는다.

A함수는 B함수의 리턴값을 신경쓰지 않고 콜백함수를 보낸다 ( 비동기 )

그런데, B함수의 작업에 관심없음에도 불구하고 A함수는 B함수에게 제어권을 넘긴다 ( 블로킹 )

따라서 A함수는 자신과 관련이 없는 B함수의 작업이 끝날 때까지 기다린다.

4. 비동기, 논블로킹

A함수가 B함수를 호출한다. 이때 제어권을 B함수에게 주지 않고 자신이 계속 가지고 있는다 ( 논블로킹 )

따라서 B함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다.

B함수를 호출할 때 콜백함수를 같이 주는데, B함수는 자신의 작업이 끝나면 A함수가 준 콜백 함수를 실행한다 ( 비동기 )

예시 - 대규모 사용자에게 메시지를 전송할때, 다양한 외부 API를 한번에 호출할 경우

0개의 댓글