본문 바로가기

알게 된 것

[알게 된 것] - 동기 vs 비동기, blocking vs non-blocking

overlapped io에 대해 공부하면서 동기와 비동기, blocking과 non-blocking에 대해서

알게 되었다. 다만 이 둘에 대한 명확한 차이를 알 수가 없어서 나름대로 따로 공부하였고, 이에 대해 정리하고자 한다.

 

 

blocking vs non-blocking

우선 이 둘의 차이에 대해 생각해보면, blocking은 함수 호출 후 그 값이 반환되어 돌아올 때까지 대기하는 방식인데 반해

non-blocking은 함수를 호출 후 반환 되는 값을 기다리지 않고 하던 일을 마저 하는 방식이다.

예를 들어 send() 함수의 경우 blocking이라면 메시지 전송을 완료 할때 까지 다른 일을 하지 못하며

non-blocking으로 동작하는 경우 메시지 전송을 명령 시킨 후 다시 원래 하던 일을 하는 식으로 동작한다.

 

blocking과 non-blocking의 차이는 크게 어렵지 않으나 동기와 비동기를 동시에 생각해본다면 그 개념이 모호해진다.

 

 

동기 vs 비동기

동기와 비동기에 대해 알아보면 많이 보게 되는 이미지다. 위는 read()함수 호출 후 값을 읽어 오는데 성공하여

값이 반환되어 돌아 올때까지 작업을 하지 않는 동기 방식을 나타내고 있다.

 

 

 

위는 비동기 방식으로 동작하는 상황을 나타낸 것이다. 함수 호출 후 값이 반환 되는 것과 관계없이 원래 하던 일을

마저 하는 것을 알 수 있다.

 

문제는 이 설명만으로는 blocking과 non-blocking 그리고 동기와 비동기의 차이점을 알 수가 없다는 것이다.

실제로 인터넷에 존재하는 여러 자료에서 이 두가지 개념이 구분이 되고 있지 않다는 느낌을 많이 받았다.

 

 

 

 

결론적으로, 이 두 가지 개념은 서로 바라보는 관점이 다르다.

https://stackoverflow.com/questions/8416874/whats-the-differences-between-blocking-with-synchronous-nonblocking-and-asynch

 

What's the differences between blocking with synchronous, nonblocking and asynchronous?

I am reading 'Operation System Concepts With Java'. I am quite confused by the concept of blocking and synchronous, what are the differences between them?

stackoverflow.com

blocking 과 non-blocking은 현재 제어권에 가지는 지에 대해 차이가 나는 개념이며,

동기와 비동기는 작업의 순서와 결과에 대해 차이가 나는 개념으로 볼 수 있다.

 

synchronous generally means an activity that must wait for a reply before the thread can move forward. Blocking refers to the fact that the thread is placed in a wait state (generally meaning it will not be scheduled for execution until some event occurs). From here you can conclude that a synchronous call may involve blocking behavior or may not

 

질문에 대한 답변 내용 중 일부이다. 즉, 동기는 다음 작업으로 넘어가기 위해 요청한 작업에 대한 응답을 대기하며 이는 blocking 방식으로 동작 할 수도 non-blocking 으로 동작할 수도 있다는 얘기이다.

 

예를 들어 동기 & non-blocking으로 동작한다면 함수를 호출하여 작업을 명령한 후, non-blocking 이므로 원래 하던일을 멈추지 않고 그대로 진행한다. 하지만 동기방식이므로 작업의 순서가 중요하므로 요청한 작업에 대해 주기적으로 답변을 요청하는 방식으로 진행되는 것이다.

 

 

 

 

 

또한 여러 답변에서 나오는 공통적인 내용으로, 

Blocking is always synchronous.

 

blocking 방식은 항상 동기 방식으로 동작한다. blocking은 요청한 작업이 완료되기까지 대기하는 방식으로 당연히 작업의 순서는 지켜질 수 밖에 없으며 이는 동기 방식을 의미하므로 맞는 말인듯 하다.

 

반은 맞고 반은 틀린 말이다. blocking & 비동기 방식의 조합도 존재는 할 수 있다. 다만 이 방식은 blocking & 동기 방식과 거의 차이가 없을 뿐더러 딱히 사용할 이유도 없다.

 

따지고 보면 그리 어려운 개념은 아니나, 여러 자료에서 이 둘을 혼용해서 사용하고 있다고 느꼈다. blocking과 non-blocking에 대한 개념을 동기와 비동기라는 용어를 가지고 설명하는 자료가 꽤 많았다. 사실 공부하는데에 이 둘을 명확히 구분하여 외울 필요는 없지만 차이에 대해서는 알고 있는게 좋을 듯하다.