OS

동기 비동기와 blocking / non-blocking

라우브 2021. 8. 3. 15:57

예전에는 조금 어렵다고 느껴졌었지만 최근에 프로젝트 하면서 이런 부분들을 좀 다루어 보았고,

다루어 보니 생각했던 것보다 더 중요한 부분이라 생각되어 포스팅을 하려고 한다.

 

동기(Synchronous) vs 비동기(Asynchronous)

동기와 비동기의 가장 큰 차이는 '호출되는 함수의 작업 종료를 누가 신경쓰는지' 이다.

 

동기

동기의 경우 호출되는 함수의 작업 종료를 호출 하는 함수가 신경쓴다. 그림에는 B가 종료되는 시점에서 B에서 A로 화살표가 가고 있지만,

이는 B가 작업 종료를 알려준다의 의미가 아니라, 제어권을 반환한다고 생각하는게 더 이해하기 쉬울 듯 하다. 실제로는 A가 B에게

"너 끝났니?" 

"너 끝났니?"

"너 끝났냐고"

반복해서 물어보면서 B의 종료를 확인한다. 이는 즉, A가 B의 종료를 확인하느라 B호출 이후의 작업을 실행하지 못한다.

 

 

비동기

비동기의 경우 호출되는 함수의 작업 종료를 호출 되는 함수가 신경쓴다. 조금 더 이해하기 쉽게 설명하자면 그냥 호출 되는 함수의 작업 종료를 신경 안쓴다라고 생각하는게 더 나을 수도 있겠다. 만약 async하게 동작한다면, A메서드 안에서 B메서드 호출이 일어나면, 새로운 Thread에 B작업을 실행하고 이 새로운 Thread는 백그라운드에서 독자적으로 실행된다.

 

저기요. 그럼 B함수를 비동기로 실행했는데 B함수의 결과값을 받아서 특정 작업을 진행해야 하는 경우에는
어떻게 해요?

이 경우에는 해결책이 두 가지가 있다. 

 

1. CallBack을 함께 전달하기.

B를 실행할 때, "너 이 작업 끝나면 이거해. 중간에 실패하면 이거해" 와 같은 Callback을 함께 전달한다.

 

2. 호출되는 함수의 리턴값을 Future구현체로 설정한 후, 호출 하는 함수측(A)에서 Future.get() 호출하기.

async 메서드의 경우 리턴값을 void 혹은 Future 구현체로 지정할 수 있다. 호출 되는 함수(B)의 결과값을 바탕으로 특정 작업을 실행하고 싶을 경우에는 리턴값을 Future 구현체로 지정해 주면 된다. 이후 호출하는 함수측에서 Future.get()하면 호출되는 함수의 결과값을 받아올 수 있고 이후, 본인이 원하는 작업을 실행하면 된다.

 

중요 중요 완전 중요 !!

2번 방법을 사용할 경우 주의해야 할 점이 있다. A 메서드에서 B함수를 비동기로 실행했다고 가정하자. 하지만 만약 A에서 Future.get()을 호출하는 시점보다 호출 되는 함수(B)의 작업 완료 시점이 더 늦다면, B가 완료될 때까지 A메서드 정확히는 Thread 1이 Block 상태가 된다. 그래서 나는 개인적으로는 CallBack을 전달하는 방법을 더 선호한다. Block이 무엇인지는 밑에서 설명하겠다.

 

 

blocking vs non-blocking

blocking과 non-blocking의 차이는 '호출된 함수가 제어권을 바로 넘겨주는지 안넘겨주는지'이다.

여기서 제어권을 넘겨준다는 것은 B호출과 동시에, 호출 하는 함수(A) 측에서 다음 작업을 실행할 수 있다는 것을 의미한다.

 

blocking

blocking 방식의 경우 호출 되는 함수(B)측에서 즉시 제어권을 넘겨주지 않는다. 즉, A 메서드는 B함수 호출 이후, B함수가 종료될 때까지 다른 작업을 실행하지 못하고 기다려야 한다.

 

non-blocking

non-blocking 방식의 경우 호출 되는 함수(B) 측에서 즉시 제어권(리턴값)을 넘겨준다. 즉, A 메서드는 B함수 호출 이후, B함수 종료 여부와 관계없이 다음 작업을 실행할 수 있다. 이 때, B가 넘겨준 리턴값은 빈 껍데기이다. (호출과 동시에 작업 결과를 반환할 수 있는 경우를 제외 반환할 수 있는 경우는 제외)  

 

 

운영 체제 관점에서의 동기/비동기 와 blocking/non-blocking

참고: https://limdongjin.github.io/concepts/blocking-non-blocking-io.html#ibm-%E1%84%8B%E1%85%A1%E1%84%90%E1%85%B5%E1%84%8F%E1%85%B3%E1%86%AF

 

blocking, non-blocking IO, 동기, 비동기 개념 정리

blocking, non-blocking IO, 동기, 비동기 개념 정리

limdongjin.github.io

 

ㅎㅎ 오늘도 성장했다 뿌듯