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

김민창·2022년 1월 15일
0
post-thumbnail

제어권

  • 함수 코드를 실행할 권리
  • 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다

결과값

  • 함수의 리턴값

블로킹과 논블로킹

  • 블로킹과 논블로킹은 함수가 다른 함수를 호출했을 때, 제어권이 누구에게 있는지의 여부에 따라 나뉜다

블로킹(Blocking)

  • 다른 함수를 호출함과 동시에 제어권을 넘겨주는것을 말한다

  • 제어권이 넘어갔기 때문에 호출 이후 자신의 코드는 제어권을 다시 받기 전까지 실행하지 않는다

논블로킹(Non-Blocking)

  • 다른 함수를 호출했지만 제어권은 바로 다시 가져오는것을 말한다

  • 제어권을 여전히 소유하고있기 때문에, 호출된 함수는 호출된 함수대로 돌아가며 제어권을 다시 받은 함수도 실행된다


동기와 비동기

  • 동기와 비동기는 호출되는 함수의 작업 완료 여부를 신경쓰는지의 여부에 따라 나뉜다

동기(Synchronous)

  • 함수 A가 끝난 다음 함수 B가 실행된다

  • 시작과 끝이 하나라도 같다면 동기라고 보는 관점도 있다

  • 제어권의 반환과 결과값의 전달에 시간을 맞추는 것

비동기(Asynchronous)

  • 함수 A와 함수 B의 시간이 맞지 않을때

  • 결과값이 전달되는 시간과 제어권의 반환이 같지 않을 때


블로킹 = 동기 ?

  1. 블록킹은 제어권을 호출한 함수가 가지고 있다가 결과값 반환할 때 같이 준다

  2. 동기는 제어권을 반환하는 시간과 결과값을 전달하는 시간이 같다

  3. 그렇다면 블로킹은 동기와 같은말인것이 아닐까?

  • 하지만 보는 관점이 다르다

  • 블록은 제어에 관한 이야기이고, 동기는 제어권을 반환하는 시간(타이밍)에 관한 이야기다


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

블로킹 + 동기

  • 다른 작업이 시작되는 동안 동작하지 않는다(블로킹)

  • 결과를 반환한다면 해당 업무를 바로 처리한다(동기)

동작 과정

  1. A함수가 B함수를 호출하며 제어권을 B함수에게 넘겨줌

  2. B함수가 실행되며 A함수는 제어권을 잃었기에 기다림

  3. B함수가 종료되면 결과와 제어권을 A함수에게 돌려주며, A함수가 실행


논블로킹 + 동기

  • 다른 작업이 시작되는 동안 자신이 제어권을 가지고 실행한다(논블로킹)

  • 결과를 반환한다면 해당 업무를 바로 처리한다(동기)

  • 결과값에 함수의 완료된 상태 뿐만 아니라 완료되지 않음이라는 상태도 결과값으로 본다

동작 과정

  1. A함수가 B함수를 호출하였지만 제어권은 A가 가지고 있음

  2. B함수는 실행되며, A함수는 제어권을 여전히 가지고 있었기에 실행이됨

  3. A함수는 실행중 B함수에게 결과값이 나왔는지 꾸준히 요청을 보냄

  4. B함수의 작업이 끝나서 결과를 받을 수 있다면, 해당 결과를 가지고 업무를 수행


블로킹 + 비동기

  • 다른 작업이 시작되는 동안 동작하지 않는다(블로킹)

  • 결과를 반환받더라도 해당 업무를 바로 처리하지 않아도 된다(비동기)

동작 과정

  1. A함수가 B함수를 호출하며 제어권을 B함수에게 넘겨줌

  2. B함수가 실행되며 A함수는 제어권을 잃었기에 기다림

  3. B함수가 종료되면 결과와 제어권을 A함수에게 돌려주었지만, 곧바로 결과를 처리하지 않고 자신의 일이 끝나고 난다면 처리


논블로킹 + 비동기

  • 다른 작업이 시작되는 동안 자신이 제어권을 가지고 실행한다(논블로킹)

  • 결과를 반환받더라도 해당 업무를 바로 처리하지 않아도 된다(비동기)

동작 과정

  1. A함수가 B함수를 호출하였지만 제어권은 A가 가지고 있음

  2. B함수는 실행되며, A함수는 제어권을 여전히 가지고 있었기에 실행이됨

  3. A함수는 실행중 B함수에게 결과값이 나왔는지 꾸준히 요청을 보냄

  4. B함수의 작업이 끝나서 결과를 받을 수 있다면, 곧바로 결과를 처리하지 않고 자신의 일이 끝나고 난다면 처리


출처1
출처2

profile
개발자 팡이

0개의 댓글