이전 게시글에서 Blocking과 Non-blocking의 차이와 Synchronous와 Asynchronous의 차이에 대해서 정리해봤다.

 

Synchronous vs Asynchronous & Blocking vs Non-blocking

Synchronous와 Asynchronous, Blocking과 Non-blocking이라는 말은 운영체제(OS)를 공부하면서 듣게 된 개념이다.프로그래밍을 함에 있어 중요한 개념인 만큼 이번 기회에 정리를 해보고자 한다.Synchronous와 Asyn

lms0408.tistory.com

 

비동기와 동기 및 블럭킹과 논-블럭킹에 대한 최종 이야기 남아있다.

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

바로 위와 같이 2대2 Matrix로 정리된 표이다.

위의 표에 정리된 그림을 보고 이해가 된다면 해당 내용을 알고 있는 것이다.

해당 내용이 이해가 되지 않는다면 이 게시글을 보면서 이해해보도록 하자!


Sync Blocking과 Async Non-blocking

Sync Blocking

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Sync-Blocking은 말그대로 Blocking이 이루어지는 동기 방식이다.

위의 그림을 보면 호출이 이루어짐에 따라 작업이 완료되기 전까지

제어권을 일시적으로 위임하는 Blocking의 특성이 보이며

작업이 완료되는 즉시 해당 작업에 대한 처리를 진행하는 Sync의 특성이 돋보이는 방식이다.

 

작업의 결과가 나오기 전까지 다른 작업을 진행할 수 없는만큼 전체 작업 수행 시간이 오래 걸린다.

Sync Blocking Example

간단한 예시로는 위와 같이 식당에서 웨이터가 주문을 받고 요리사에게 음식을 만들어달라고 요청했을 때

요리가 나오기 전까지 웨이터는 아무런 일도 하지 않고 음식이 나오기까지 기다리는 상황과 같다.

 

이렇게 식당에서 일을 하게 되면 주문 한건에 소요되는 시간이 큰 만큼 하루에 음식을 제공하는 양은 적어질 것 이다.

그렇게 된다면 당연히 매출이 떨어질 것 이기때문에 비효율적인 방식이라고 볼 수 있다.

Async Non-blocking

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Async Non-blocking은 Sync Blocking과 정반대되는 방식이다.

필요에 따라 호출을 진행한 이후에도 제어권을 잃지 않기 때문에 Non-blocking 특성이 보이며

작업이 완료되었을 때 즉시 해당 결과에 대한 상황을 처리할지 안할 지는 불명확하다는 면에서

Async의 특성이 보인다.

 

작업의 결과를 기다리지 않고 다른 작업을 수행할 수 있는만큼 전체 작업 수행 시간이 단축된다.

Async Non-blocking Example

Sync Blocking과 마찬가지로 비슷한 상황이라고 가정할 때

Async Non-blocking방식은 요리사가 요리를 하는 동안 청소를 한다던지 다른 손님의 주문을 받는다던지 등

음식을 기다리지 않고 다른 일을 할 수 있다.

또한 음식이 나오더라도 상황에 따라 즉시 서빙을 할지 안할지는 모른다.

위의 상황은 음식이 나왔더라도 다른 손님의 주문을 받고 있어 서빙이 나중에 이루어지는 모습이다.

 

Sync Blocking과는 다르게 주문 한건에 시간이 소요되는 동안 다른 주문도 받기때문에 하루에 음식을 제공하는 양이 앞선 방식보단 많아질 것 이다.당연히 매출은 증가할 것 이고 효율적인 방식이라고 볼 수 있다.

 

위의 두 방식은 우리가 프로그램을 만들 때 익숙하게 이용한 방식이다.

 

Sync Blocking의 예시를 들자면

C언어에서 사용자의 입력값에 따라 출력되는 프로그램이라고 볼 수 있다.

Async Non-blocking의 경우 

Unity C#에서 제공하는 Addressables API를 이용하여

번들을 로드한 이후 Completed 콜백을 통해 추가적인 작업을 처리할 때로 볼 수 있다.


Sync Non-blocking과 Async Blocking

Sync Non-blocking

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Sync Non-blocking은 제어권을 잃지 않는 것이다.

호출을 통해 작업을 요청했어도 작업이 완료되는 동안 다른 작업을 수행할 수 있다.

다만 다른 일을 수행하면서도 작업이 완료되었는지 중간 중간 확인을 하며

확인 중 작업이 완료되었다는 회신을 통해 결과를 즉시 처리한다.

Sync Non-blocking Example

이번에는 주문에 대한 요리를 요청한 뒤 화장실 청소를 한다고 가정을 해보자.

화장실과 주방에 거리는 멀기 때문에 음식이 나오는 것을 직접 가서 확인해야한다.

확인할 때마다 요리가 나오지 않았다면 다시 청소를 하러 돌아갈 것 이고

요리가 나왔다면 즉시 서빙을 할 것 이다.

Async Blocking

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

Async Blocking은 제어권을 다른 작업에게 위임하는 것 이다.

호출을 통해 작업을 요청했을 경우 제어권을 위임하기 때문에  제어권을 다시 얻기 전까진

다른 작업을 수행하지 못하고 대기해야한다.

Async Blocking Example

마찬가지로 비동기식이므로 완료된 작업에 대해 즉시 처리 여부는 불명확하다.

이번엔 가게에서 정해진 break time으로 인해 잠시 가게를 닫은 다음

이 시간을 활용해 웨이터는 요리사에게 점심 식사를 요구한 상태라고 가정하자.

 

요리사가 점심 식사를 준비할 때까지 심심한 나머지 웨이터에게 말동무가 되어달라고 한다.

요리사는 본인의 옆에서 이야기를 하는 걸 좋아하기때문에 웨이터는 다른 일을 하지 못하게 된다.

점심 식사 준비를 완료가 된 이후 자유가 된 웨이터는 점심 식사를 바로 할지

화장실에서 손을 씻고 밥을 먹을지는 알 수가 없다.

 

위의 두 방식은 Sync Blocking 및 Async Non-blocking과 다르게 우리가 흔히 이용하는 방식은 아니다.

그렇기 때문에 예시를 통해 이해가 되었더라도 이 방식들이 어떻게 실제로 적용된 사례가 있을지는 감이 오지 않을 수도 있다.

 

Sync Non-blocking의 경우 게임의 로딩 progress를 예시로 들 수 있다.

로딩이 진행되는 동안 수시로 어느 정도 진행이 되었는지 확인을 하며 UI를 업데이트하기 때문이다.

Async Blocking의 경우는 

비효율적인 면이 크게 나타나므로 보통은 해당 의도를 가지고 구현하는 경우는 거의 없다.

보통 의도를 Async Non-blocking으로 하려다 개발자의 실수 혹은 기타 이유로 인해 일어난다.


마무리

이전부터 정말 헷갈려 하는 개념을 제대로 이해하고 정리하게 되면서 마음이 많이 홀가분해졌다.

Sync 및 Async와 Blocking과 Non-blocking은 명확히 다른 개념이며

이 두 부류는 공존 할 수 있다는 것을 알 수 있다.


참고 영상 : https://www.youtube.com/watch?v=oEIoqGd-Sns&list=LL&index=1&t=528s

Synchronous Asynchronous, Blocking Non-blocking이라는 말은 운영체제(OS)를 공부하면서 듣게 된 개념이다.

프로그래밍을 함에 있어 중요한 개념인 만큼 이번 기회에 정리를 해보고자 한다.


Synchronous와 Asynchronous

Synchronous

Synchronous의 의미는 동기식이라는 의미로,

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미한다.

https://www.koyeb.com/blog/introduction-to-synchronous-and-asynchronous-processing

위 그림을 보면 Process A가 작업을 하는 도중 필요로 인해 Process B에게 작업을 요청한 상태이다.

이때 Process A는 Process B의 작업이 완료되는 즉시 결과에 대한 작업을 진행할 것 이다.

 

동기 방식은 요청한 작업의 결과를 즉시 처리하는 특징이 있다.

그렇기 때문에 위의 예시를 보았듯이 동기식의 흐름 방식은 직관적이기 때문에 이해하기가 쉽다.

Asynchronous

Asynchronous는 비동기식이라는 의미로,

시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미한다.

https://www.koyeb.com/blog/introduction-to-synchronous-and-asynchronous-processing

위 그림 역시 동기식의 상황과는 똑같은 상태이다.

비동기식에서는 Process A는 Process B가 작업을 완료되어 돌아온 결과에 대한 작업을 진행할 수도 있고 안할 수 있다.

 

비동기 방식은 동기 방식과 다르게 요청한 작업의 결과를 즉시 처리하지 않는다는 특징이 있다.

동기 방식과는 다르게 작업 완료에 대한 결과를 예측하기 어렵기 때문에 직관적이지 못한면이 있다.

 

위의 설명만으로는 동기와 비동기에 대한 이해가 어려울 수 있기 때문에 식당의 예시를 살펴보자.

Synchronous Example

웨이터는 주문을 받고 해당 주문을 요리사에게 요청을 한 이후 음식을 제공하는 일을 한다.

 

웨이터가 동기 방식으로 일을 수행하게 된다면 요리사에게 제공할 음식을 만들어달라고 요청한 이후

기다리거나 다른 일을 하고 있을 것이다.

그 이후 따뜻한 요리를 곧장 제공하기 위해 요리가 나오는 즉시 손님에게 제공을 해줄 것 이다.

Asynchronous Example

요리사는 요리를 한 이후 서빙을 하라고 지시할 것이다. 이때 요리사는 기다리거나 다른 일을 하고 있을 것이다.

만약 식사가 끝난 손님의 빈 접시를 웨이터가 전해주게 된다면

요리사는 들어오는 주문에 맞는 요리를 하느라 빈 접시들이 들어오는 즉시 설거지를 하지 않을 것이다.

 

즉 동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단할 수 있다.


Blocking과 Non-blocking

Blocking

Blocking이란 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면

해당 작업이 완료될 때까지 기다렸다가 자신의 작업을 재개하는 것을 의미한다.

Blocking Processing

위의 그림을 보면 Process A가 작업을 하는 도중 Process B의 작업이 시작됨에 따라

Process A의 작업이 일시 중지 되는 것을 볼 수 있다.

Process B의 작업이 끝난 이후 Process A의 작업이 재개되는 것을 확인할 수 있다.

즉, 작업을 진행하는 제어권을 일시적으로 위임했다고 볼 수 있다.

Non-blocking

Non-blocking이란 Blocking과 달리 다른 주체의 작업이 시작된다고 해서

해당 작업이 완료될 때까지 기다리지 않고 자신의 작업을 하는 것을 의미한다.

Non-blocking Processing

Non-blocking은 Blocking과 달리 Process B의 작업이 시작되어도 작업이 중단되지 않고

계속해서 작업을 진행하는 것을 볼 수 있다.

즉, 작업을 진행하다 다른 작업이 시작되어도 제어권을 잃지 않는다는 것을 알 수 있다.

 

이렇듯 Blocking과 Non-blocking은 작업을 진행할 때 본인의 제어권이 있느냐 없느냐로 판단할 수 있다.


마무리

지금까지 Synchronous와 Asynchronous의 차이 및 Blocking과 Non-blocking의 차이에 대해서 알아보았다.

위의 두 부류는 명확하게 다른 개념이므로 헷갈려선 안된다.

 

또한 더 나아가 다음 게시글에서는

Sync blocking, Sync non-blocking Async blocking, Async non-blocking에 대해서도 다뤄볼려고 한다.


참고 영상 : https://www.youtube.com/watch?v=oEIoqGd-Sns 

+ Recent posts