Open 7ZXU opened 3 years ago
동기와 비동기는 호출되는 함수의 작업 완료 여부를 신경쓰는지를 관심사로 두는 개념이고 블로킹과 논블로킹은 제어권을 어떻게 처리하는지가 관심사인 개념으로 동작은 비슷하지만 어떤 부분을 중점으로 뒀는지에 차이가 있는 개념입니다.
예를 들어 A함수가 B함수를 호출하는 상황을 가정해봅시다.
동기 방식은 A함수가 B함수를 호출하면 작업을 멈추고, B함수의 작업 완료 여부를 체크하여 작업이 완료되면 자신의 작업을 이어서 실행하는 방식이고 비동기 방식은 B함수의 작업 완료 여부에 관계없이 A함수도 자신의 작업을 계속 진행하다가 B함수의 작업이 완료되면 콜백 함수를 실행하도록 하는 방식입니다. 블로킹은 A함수에서 호출된 B함수로 제어권을 넘겨주고, B함수의 실행이 끝나면 다시 제어권을 돌려주어 실행을 멈춘 A함수가 다시 실행되도록 하는 방식입니다. 즉 병렬 실행이 불가능한 방식입니다. 논블로킹은 B함수를 호출했을 때, 실행은 그대로 되지만 제어권은 그대로 A함수가 가지고 있어서 A함수도 자신의 코드를 계속 실행하는 방식으로 병렬 수행이 가능합니다.
블로킹과 논블로킹은 호출된 함수가 제어권을 호출한 함수에게 바로 넘겨주는지의 여부에 따라 나뉜다. 바로 넘겨준다면 호출된 함수와 호출한 함수가 병렬적인 실행이 가능한 논블로킹이며 바로 넘겨주지 않는다면 호출된 함수의 작업이 완료되어 제어권을 넘겨줄 때까지 호출한 함수는 대기하는 블로킹이라고 한다.
동기와 비동기는 호출된 함수의 작업 완료 여부에 호출한 함수의 실행이 영향을 받는지의 여부에 따라 나뉜다. 영향을 받아서, 호출된 함수의 작업이 완료될 때까지 기다리고 작업을 진행한다면 동기, 영향을 받지 않아서, 호출된 함수의 작업 완료 여부와 관계 없이 작업을 진행한다면 비동기라고 한다.
따라서 동기와 비동기, 블로킹과 논블로킹의 차이를 살펴봤을 때 블로킹과 논블로킹은 호출된 함수가 제어권을 바로 반환하는지에 대해 주목하고 어권을 바로 반환 받아야 병렬 실행 가능) 동기와 비동기는 호출된 함수의 작업 완료 여부에 호출한 함수가 영향을 받는지에 대해 주목한다.