위의 제목에 써있는 단어들은 프로그래밍 할 때 자주 등장하고 사용되는 단어들입니다.
우리는 흔히
Blocking == Synchronous(동기)
Non-Blocking == Asynchronous(비동기)
와 같이 같다고 생각하시는 분들도 있을 것이라 생각합니다.
위의 개념들은 서로 다른 관점들을 가지고 있습니다.
동기와 비동기는 호출되는 함수의 작업 완료 여부를 누가 신경쓰는가에 관점이 있습니다.
- 호출하는 함수일까?
- 호출되는 함수일까?
블로킹과 넌블로킹은 호출되는 함수가 바로 반환을 하는가에 관점이 있습니다.
서로의 관점이 다르기 때문에 이 4가지 개념은 서로 조합이 되어서 사용될 수 있습니다.
동기 & 비동기
함수 A가 함수 B를 호출했다고 가정하겠습니다.
동기
동기는 함수 A( 호출하는 함수 ) 가 함수 B( 호출되는 함수 ) 의 작업 완료 상태를 알고 싶어합니다.
B의 작업 완료 상태를 알고 싶어하는 이유는, 함수 B의 작업이 완료되어야 호출한 A가 마저 실행이 될 수 있기 때문입니다. 그렇기 때문에 함수의 완료 여부를 묻습니다.
이러한 특징은 호출과 반환에 대한 순서를 보장하는 특징이 있지만,
반환이 될때까지 다른 활동을 할 수 없고 기다려야한다는 특징을 가집니다.
비동기
함수 B만 자신의 작업 완료 상태를 알고 있고 A는 함수 B의 완료상태에 관심이 없습니다.
비동기는 동기와 다르게 B를 호출하는 함수 A가 B의 작업 완료 상태를 신경쓰지 않습니다.
그렇기 때문에 함수 A는 함수 B가 완료되든 말든 자신의 작업을 계속 이어나갈 수 있습니다.
대신에 함수 A는 함수 B에게 CallBack을 전달하여, B가 작업을 다 완료하면 CallBack을 실행해서 A에게 자신의 작업완료 상태를 알립니다.
블로킹 & 넌블로킹
블로킹과 넌블로킹은 함수 A가 함수 B를 호출했을 때 바로 반환하는지 아닌지에 관점이 있습니다.
Blocking
블로킹은 함수 A가 B를 호출했을 때, 바로 반환하지 않습니다.
Non-Blocking
넌블로킹은 A가 함수 B를 호출했을 때, 바로 반환합니다.
위의 4가지 개념들은 서로 다른 관점으로 인하여 서로 조합 될 수 있습니다.
다음이 4가지 조합에 대한 표입니다.
Sync-Blocking( 동기 - 블로킹 )
동기 + 블로킹
동기는 함수 A가 함수 B의 작업 완료 상태를 알고 싶습니다.
블로킹은 함수를 바로 반환하지 않습니다.
따라서 위의 조합을 통해, 함수가 호출되면 바로 반환하지 않고, B의 작업 완료 상태까지 기다렸다가 작업완료상태가 되면
반환하여 함수 A로 돌아와 나머지 작업을 처리합니다.
Sync-NonBlocking ( 동기 + 넌블로킹 )
동기 + 넌블로킹
넌블로킹은 함수를 바로 반환합니다.
하지만 동기는 함수 B의 작업 완료 상태를 알고 싶습니다.
따라서 함수 B의 작업 상태가 완료될 때까지 함수 A는 함수 B에게 작업 완료 상태를 묻습니다.
넌블로킹이기 때문에 작업이 완료될때까지 바로 반환을 해버리고 함수 A는 다른 작업을 할 수 있습니다.
Async-Blocking ( 비동기 + 블로킹 )
비동기 + 블로킹
비동기는 함수 B의 작업 상태를 알고 싶어하지 않으니 CallBack을 넘겨서 B가 작업을 완료하면 호출하라고 합니다.
하지만 블로킹이기 때문에 함수 B가 CallBack을 호출할 때까지 대기하는 모습을 볼 수 있습니다.
Async-NonBlocking
비동기 + 넌블로킹
함수 A는 비동기이기 때문에 함수 B의 완료 상태를 CallBack으로 알게됩니다.
또한 넌블로킹이기 때문에 함수 B는 바로 리턴합니다.
넌블로킹은 함수 B가 작업 중이여도, 대기를 하지 않으므로 다른 작업을 할 수 있습니다.
B는 작업이 완료되면 CallBack을 호출하여 함수 A에게 작업 완료 상태를 알립니다.
정리
동기와 비동기는 작업 완료상태를 함수 A가 신경을 쓰느냐 아닌가의 차이가 있고
블로킹과 넌블로킹은 호출한 함수를 바로 반환하는가 아닌가의 차이가 있습니다.
동기 + 블로킹과 비동기 + 블로킹은 둘다 함수를 호출하는 A가 다른 작업을 할 수 없기 때문에 비슷한 작업 효율을 냅니다.
동기 + 넌블로킹은 함수 A가 다른 작업을 할 수 있지만, 계속 작업 완료상태를 물어봐야하는 특징을 가집니다.
비동기 + 넌블로킹은 가장 효율적으로 작업을 할 수 있는 방식이라고 할 수 있습니다.
출처
http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/