✅동기/비동기 그리고 🔑블록킹/논블록킹에 대해서
Blocking, Non-Blocking의 기준은 제어권을 어느 쪽이 가지고 있느냐로 나뉘어지지만,
Sychronous, Asynchronous는 작업의 반환에 대해 영향을 받는지 받지 않는지로 나뉘어진다.
Blocking / Non-Blocking을 이야기할 땐 제어권과 반환 두 가지 키워드가 핵심으로 제어할 수 없는 대상의 처리 방법에 대해 논의하는 것을 의미한다.
- Blocking은 직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것으로 제어권이란 행동할 수 있는 권리를 의미한다.
- EX> 호출하는 함수가 IO를 요청했을 때 IO처리가 완료될 때까지 아무 일도 하지 못한 채 기다리는 것을 말한다.
function 호출자 (){ // 1. 호출자 함수가 처음에 제어권을 갖고 있다. function A() // 2. A 함수를 호출하면 제어권을 A에게 넘긴다. // 4. A의 리턴값과 함께 제어권을 넘겨받은 호출자는 그제서야 함수 B를 실행할 수 있게 된다. function B() function C() } function A(){ /*엄청난 로직*/ // 3. 제어권을 넘겨 받은 A는 안에서 로직을 처리한 뒤 리턴하면 값과 함께 제어권을 다시 넘긴다. return Sth; }
- 호출자 함수가 A 함수를 호출하는 순간, 호출자는 A함수가 작업을 마무리하지 못하거나 예외가 발생하면 호출자는 나머지 작업을 수행하지 못한다.
- 즉, 호출자에 대한 권한이 A(직접 제어하지 못하는 대상)를 호출함과 동시에 제어권이 넘어가게 된다.
- Blocking과 반대되는 개념으로 직접 제어할 수 없는 대상의 작업 처리 여부와 상관이 없다.
- EX> 호출하는 함수가 IO를 요청한 후 IO처리 완료 여부와 상관없이 바로 자신의 작업을 할 수 있다.
function 호출자 (){ // 1. 역시 호출자 함수가 처음엔 제어권을 갖고 있다. function A() // 2_1. A 함수를 호출하면 제어권을 A에게 넘겼다가 바로 다시 호출자에게 돌아온다. // 2_3. A의 리턴을 기다리지 않고 호출자 함수는 그대로 B를 C를 이어서 실행한다. function B() function C() } function A(){ /*엄청난 로직*/ // 2_2. 호출받은 A는 제어권없이 그래도 로직을 처리하고 리턴한다. // 3. 그렇다면 함수 A의 결과값은 어떻게 된걸까? return Sth; }
- 제어할 수 없는 함수를 호출 했을 때 제어권이 바로 호출자에게 넘어간다.
- Synchronous는 함께와 시간을 합친 말로, 제어권의 반환 시간과 결과값의 전달하는 시간이 일치하는 것을 의미한다.
- 간단하게 Sync를 떠올리면 1> 함수 A가 끝난 후에 함수 B가 실행되는, A의 끝과 B의 시작과 시간을 맞추는 것을 떠오르는데 뿐만 아니라 2> 함수의 시작과 끝이 같은 경우를 의미하기도 한다.
- 부정형의 의미를 가진 A가 붙은 Asyncronous, 비동기는 1> 함수 A와 B가 실행되고 끝나는 시간이 안맞거나 2> 결과 값도 전달이 안됐는데 제어권을 반환하는 경우를 의미한다.
- 즉 Blocking / Non-Blocking은 제어권을 어떻게 누가 가지고 언제 반환하는지에 대한 이야기로 제어권을 어떻게 하느냐에 따라 제어할 수 없는 대상을 어떻게 처리할지에 대한 개념이다.
- 반면 Sync / Async 제어권을 반환하는 시간, 결과값을 전달하는 시간 혹은 어떤 함수가 끝나고 다음 함수가 시작하는 시간이 일치되었는가 안됐는가에 대한 개념이다.
Synchronous VS Asynchronous
- 두 가지 이상의 대상(메서드, 작업, 처리 등)과 이를 처리하는 시간으로 구분하며
Synchronous: 호출된 함수의 리턴하는 시간과 결과를 반환하는 시간이 일치하는 경우
Asynchronous: 호출된 함수의 리턴하는 시간과 결과를 반환하는 시간이 일치하지 않는 경우Blocking VS Non-Blocking
- 호출되는 대상이 직접 제어할 수 없는 경우 이를 구분햐며
Blocking: 직접 제어할 수 없는 대상의 작업이 끝날 때까지 기다려야 하는 경우
Non-Blocking: 직접 제어할 수 없는 대상의 작업이 완료되기 전에 제어권을 넘겨주는 경우