[STUDY] 동기/비동기와 블로킹/논블로킹 구분하기 * 수정

sookyoung.k·2023년 7월 4일
0

👀 제어권, 결과값

• 제어권 - 자신의 코드를 실행할 권리

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

• 결과값을 기다린다

결과값을 기다린다는 의미: A 함수가 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리는지 여부

* 요청의 결과값도 return이라고 하고 함수의 결과값도 return이라고 하니까 너무 헷갈린다. 제어권을 준다는 말이 바로 'return'을 준다는 말로 쓰이는 것 같다. 스스로 구분을 해보려고 노력하면서 이해를 해봐야 할 것 같다!

블로킹 & 논블로킹

주로 I/0의 읽기/쓰기에서 사용된다

✔️ 함수를 호출할 때 제어권을 언제 넘겨주는가가 포인트
= 전체적인 작업이 '흐름'을 막는지 안 막는지에 대한 관점

블로킹(blocking)

  • A 함수가 B 함수를 호출할 때 제어권을 B 함수에게 넘긴다
  • 제어권을 넘겨받은 B 함수는 자신의 함수를 실행하고 A 함수는 제어권을 넘겨주었기 때문에 함수 실행을 멈춘다 (호출된 함수의 작업이 끝날 때까지 대기)
  • B 함수는 자신의 함수 실행이 끝나면(함수 실행 완료 후) 제어권을 A 함수에게 돌려준다

→ 호출된 함수가 제어권을 넘기지 않고 자신의 작업을 완료할 때까지 호출한 함수의 실행을 막는다 (BLOCKING)
→ 호출되는 함수가 바로 Return 하지 않으면 Blocking
→ 호출된 함수가 함수 실행 후 제어권과 결과값을 얹어서 호출한 메인 함수에게 준다

논블로킹(non-blocking)

  • A 함수가 B 함수를 호출해도 제어권은 자신이 갖고 있는다
  • 호출된 함수가 실행 되어도 호출한 함수가 제어권을 그대로 갖고 있는다
  • 호출한 함수가 제어권을 그대로 가지고 있기 때문에 B 함수를 호출한 이후에도 자신의 코드를 계속 실행한다

→ 호출된 함수에게 제어권을 넘겼지만 제어권을 바로 다시 돌려준다 = 호출하는 함수의 작업 도중 호출된 함수의 실행과 관련 없이 호출한 함수의 나머지 작업이 그대로 실행된다
→ 호출되는 함수가 바로 Return 하면 Non-Blocking

동기 & 비동기

✔️ 호출되는 함수의 작업 완료 여부를 누가 신경쓰는지가 포인트
= 처리해야 할 작업을 어떠한 '흐름'으로 처리할 것인가에 대한 관점

동기(synchronous)

요청한 작업에 대한 완료 여부를 따진다! (순차적으로 처리)

  • 함수들이 작업을 동시에 시작하거나, 끝나는 타이밍을 맞추거나, 하나가 끝나고 다른 하나를 차례로 실행하는 것
  • 작업을 요청했을 때 결과값(return)을 직접 받는다
  • 요청의 결과값이 return 값과 동일하다 대체 이게 뭔소리임 → 제어권과 결과값을 동시에 반환한다는 얘기같음
  • 호출한 함수가 작업 완료를 신경쓴다
  • 요청에 따른 결과가 반환되기 전까지 아무것도 하지 못하고 대기해야 한다 이 부분이 블로킹과 비슷함 → 호출한 함수는 호출된 함수들이 작업 완료가 되었다는 응답을 받으면 그 때 다른 함수의 실행을 시작한다

→ 호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나, 호출되는 함수로부터 바로 return을 받더라도 작업 완료 여부를 호출한 함수 스스로 확인한다
제어권과 결과값을 동시에 반환한다

비동기(asynchronous)

요청한 작업에 대한 완료 여부를 따지지 않는다! (자신의 다음 작업 그대로 실행)

  • 여러 개의 작업을 동시에 처리할 수 있다 (호출한 함수나 호출된 함수나 서로 언제 시작하고, 언제 작업이 완료되는지 신경쓰지 않는다)
  • 작업을 요청했을 때 결과값(return)을 간접적으로 받는다
  • 요청의 결과값이 return 값과 다를 수 있다
  • 콜백을 통한 처리가 바로 비동기!
  • 호출된 함수(callback함수)가 작업 완료를 신경쓴다
  • 결과가 반환되는 동안 다른 작업을 수행할 수 있다
  • 해당 요청은 별도의 스레드에서 실행

→ 호출되는 함수에게 콜백 함수를 함께 전달해서 호출되는 함수의 작업이 완료되면, 호출되는 함수가 전달받은 콜백 함수를 실행하고, 호출한 함수는 작업 완료를 신경쓰지 않는다
제어권과 결과값이 다른 시점에 따로따로 반환된다

조합

* 참고문헌

https://miracleground.tistory.com/entry/%EB%8F%99%EA%B8%B0Synchronousvs%EB%B9%84%EB%8F%99%EA%B8%B0Asynchronous-block%EA%B3%BC-non-block-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC
https://hyokeun0419.tistory.com/93
https://devlibrary00108.tistory.com/92
https://joooing.tistory.com/entry/%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
https://siyoon210.tistory.com/147
https://hamait.tistory.com/930
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
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#blocking_/_non-blocking
https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking#blocking-vs-non-blocking

profile
영차영차 😎

0개의 댓글