꼬꼬마 블로그

꼬꼬마의 기술 블로그

보통 동기 = 블로킹, 비동기 = 논블로킹이라고 생각하는 사람이 많습니다. 저 또한 각각의 차이점을 명확하게 알지 못했습니다.

동기, 비동기

먼저 동기와 비동기는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰냐가 관심사입니다.

동기방식 (Synchronous)

동기 방식은 호출하는 함수가 호출된 함수의 작업 완료 여부를 스스로 확인하는 방식입니다.

비동기 방식(Asynchkronous)

비동기 방식은 호출되는 함수에게 callback을 넘겨 호출하는 함수는 호출되는 함수의 작업 완료 여부를 신경 쓰지 않고 호출된 함수에서 작업을 완료한 후 callback함수를 실행하는 방식입니다.

블로킹, 논블로킹

블로킹과 논블로킹은 회출되는 함수가 바로 리턴하느냐 마느냐가 관심사입니다. 조금 다르게 말하면 호출되는 함수가 바로 제어권을 호출한 함수로 넘겨주느냐 가지고 있느냐입니다.

블로킹 방식 (Blocking)

호출된 함수가 자신의 작업을 모두 완료할 때까지 호출한 함수에게 제어권을 넘겨주지 않고 가지는 방식입니다.

논블로킹 방식 (NonBlocking)

호출된 함수가 바로 호출한 함수에게 제어권을 넘겨주고 호출한 함수가 다른 일을 할 수 있도록 하는 방식입니다.

여러 경우로 이해해보자

동기 & 블로킹

수행 여부는 호출한 함수에서 신경인 동기와 작업이 완료될 때까지 제어권은 호출된 함수인 블로킹이 동시에 이루어진다면 위와 같은 그림입니다.

 

작업이 완료될 때까지 호출한 함수는 대기하며 수행 완료 여부는 호출한 함수에서 관리합니다.

비동기 & 논블로킹

위와 반대되는 경우입니다. 수행 여부는 호출된 함수에서 신경인 비동기와 바로 제어권은 호출한 함수로 넘겨줌인 논블로킹입니다.

 

호출한 함수는 함수를 호출한 뒤 바로 제어권을 넘겨받습니다. 그 후 바로 다음 작업을 이어할 수 있습니다. 호출된 함수에서 작업이 완료되었다면 Callback함수를 호출하여 수행 완료합니다.

동기 & 논블로킹

수행 여부는 호출한 함수에서 신경인 동기와 바로 제어권은 호출한 함수로 넘겨줌인 논블로킹입니다. 아마 이제 조금 혼란스러울 수 있습니다.

 

이는 먼저 논블로킹 방식이기에 호출 후 제어권을 넘겨받습니다. 그리고 동기이기 때문에 다른 작업을 하다가 호출된 함수에서 작업이 완료되었는지 수시로 확인해주는 것입니다.

비동기 & 블로킹

수행 여부는 호출된 함수에서 신경인 비동기와 작업이 완료될 때까지 제어권은 호출된 함수인 블로킹입니다.

 

위 그림(블로킹 관련 모든 그림)에서 반환은 값의 반환보단 제어권을 반환한다는 것이 더 옳습니다. 그렇다면 위 방식에서 호출된 함수에서 모든 작업을 수행하면 Callback을 호출합니다.

 

하지만 블로킹 방식이기에 제어권을 호출된 함수에서 가지며 그동안 호출한 함수는 다른 작업을 할 수 없습니다.

정리

동기, 비동기, 블로킹, 논블로킹은 서로 비슷하지만 관심이 다릅니다. 수행 여부 또는 제어권에 따라 구분됩니다. 이런 부분들을 이해하고 사용하면 좋을 것 같습니다.