→ 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 다음, 자신을 호출한 함수에게 돌려준다.
→ 결과값을 기다린다는 의미: A 함수가 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리는지 여부
요청의 결과값도 return이라고 하고 함수의 결과값도 return이라고 하니까 너무 헷갈린다. 제어권을 준다는 말이 바로 'return'을 준다는 말로 쓰이는 것 같다. 스스로 구분을 해보려고 노력하면서 이해를 해봐야 할 것 같다!
주로 I/0의 읽기/쓰기에서 사용된다
✔️ 함수를 호출할 때 제어권을 언제 넘겨주는가가 포인트
= 전체적인 작업이 '흐름'을 막는지 안 막는지에 대한 관점
- A 함수가 B 함수를 호출할 때 제어권을 B 함수에게 넘긴다
- 제어권을 넘겨받은 B 함수는 자신의 함수를 실행하고 A 함수는 제어권을 넘겨주었기 때문에 함수 실행을 멈춘다 (호출된 함수의 작업이 끝날 때까지 대기)
- B 함수는 자신의 함수 실행이 끝나면(함수 실행 완료 후) 제어권을 A 함수에게 돌려준다
→ 호출된 함수가 제어권을 넘기지 않고 자신의 작업을 완료할 때까지 호출한 함수의 실행을 막는다 (BLOCKING)
→ 호출되는 함수가 바로 Return 하지 않으면 Blocking
→ 호출된 함수가 함수 실행 후 제어권과 결과값을 얹어서 호출한 메인 함수에게 준다
- A 함수가 B 함수를 호출해도 제어권은 자신이 갖고 있는다
- 호출된 함수가 실행 되어도 호출한 함수가 제어권을 그대로 갖고 있는다
- 호출한 함수가 제어권을 그대로 가지고 있기 때문에 B 함수를 호출한 이후에도 자신의 코드를 계속 실행한다
→ 호출된 함수에게 제어권을 넘겼지만 제어권을 바로 다시 돌려준다 = 호출하는 함수의 작업 도중 호출된 함수의 실행과 관련 없이 호출한 함수의 나머지 작업이 그대로 실행된다
→ 호출되는 함수가 바로 Return 하면 Non-Blocking
✔️ 호출되는 함수의 작업 완료 여부를 누가 신경쓰는지가 포인트
= 처리해야 할 작업을 어떠한 '흐름'으로 처리할 것인가에 대한 관점
요청한 작업에 대한 완료 여부를 따진다! (순차적으로 처리)
- 함수들이 작업을 동시에 시작하거나, 끝나는 타이밍을 맞추거나, 하나가 끝나고 다른 하나를 차례로 실행하는 것
- 작업을 요청했을 때 결과값(return)을 직접 받는다
- 요청의 결과값이 return 값과 동일하다
대체 이게 뭔소리임→ 제어권과 결과값을 동시에 반환한다는 얘기같음- 호출한 함수가 작업 완료를 신경쓴다
- 요청에 따른 결과가 반환되기 전까지 아무것도 하지 못하고 대기해야 한다 이 부분이 블로킹과 비슷함 → 호출한 함수는 호출된 함수들이 작업 완료가 되었다는 응답을 받으면 그 때 다른 함수의 실행을 시작한다
→ 호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나, 호출되는 함수로부터 바로 return을 받더라도 작업 완료 여부를 호출한 함수 스스로 확인한다
→ 제어권과 결과값을 동시에 반환한다
요청한 작업에 대한 완료 여부를 따지지 않는다! (자신의 다음 작업 그대로 실행)
- 여러 개의 작업을 동시에 처리할 수 있다 (호출한 함수나 호출된 함수나 서로 언제 시작하고, 언제 작업이 완료되는지 신경쓰지 않는다)
- 작업을 요청했을 때 결과값(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