이전 게시글에서 Blocking과 Non-blocking의 차이와 Synchronous와 Asynchronous의 차이에 대해서 정리해봤다.
Synchronous vs Asynchronous & Blocking vs Non-blocking
Synchronous와 Asynchronous, Blocking과 Non-blocking이라는 말은 운영체제(OS)를 공부하면서 듣게 된 개념이다.프로그래밍을 함에 있어 중요한 개념인 만큼 이번 기회에 정리를 해보고자 한다.Synchronous와 Asyn
lms0408.tistory.com
비동기와 동기 및 블럭킹과 논-블럭킹에 대한 최종 이야기 남아있다.
바로 위와 같이 2대2 Matrix로 정리된 표이다.
위의 표에 정리된 그림을 보고 이해가 된다면 해당 내용을 알고 있는 것이다.
해당 내용이 이해가 되지 않는다면 이 게시글을 보면서 이해해보도록 하자!
Sync Blocking과 Async Non-blocking
Sync Blocking
Sync-Blocking은 말그대로 Blocking이 이루어지는 동기 방식이다.
위의 그림을 보면 호출이 이루어짐에 따라 작업이 완료되기 전까지
제어권을 일시적으로 위임하는 Blocking의 특성이 보이며
작업이 완료되는 즉시 해당 작업에 대한 처리를 진행하는 Sync의 특성이 돋보이는 방식이다.
작업의 결과가 나오기 전까지 다른 작업을 진행할 수 없는만큼 전체 작업 수행 시간이 오래 걸린다.
간단한 예시로는 위와 같이 식당에서 웨이터가 주문을 받고 요리사에게 음식을 만들어달라고 요청했을 때
요리가 나오기 전까지 웨이터는 아무런 일도 하지 않고 음식이 나오기까지 기다리는 상황과 같다.
이렇게 식당에서 일을 하게 되면 주문 한건에 소요되는 시간이 큰 만큼 하루에 음식을 제공하는 양은 적어질 것 이다.
그렇게 된다면 당연히 매출이 떨어질 것 이기때문에 비효율적인 방식이라고 볼 수 있다.
Async Non-blocking
Async Non-blocking은 Sync Blocking과 정반대되는 방식이다.
필요에 따라 호출을 진행한 이후에도 제어권을 잃지 않기 때문에 Non-blocking 특성이 보이며
작업이 완료되었을 때 즉시 해당 결과에 대한 상황을 처리할지 안할 지는 불명확하다는 면에서
Async의 특성이 보인다.
작업의 결과를 기다리지 않고 다른 작업을 수행할 수 있는만큼 전체 작업 수행 시간이 단축된다.
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
Sync Non-blocking은 제어권을 잃지 않는 것이다.
호출을 통해 작업을 요청했어도 작업이 완료되는 동안 다른 작업을 수행할 수 있다.
다만 다른 일을 수행하면서도 작업이 완료되었는지 중간 중간 확인을 하며
확인 중 작업이 완료되었다는 회신을 통해 결과를 즉시 처리한다.
이번에는 주문에 대한 요리를 요청한 뒤 화장실 청소를 한다고 가정을 해보자.
화장실과 주방에 거리는 멀기 때문에 음식이 나오는 것을 직접 가서 확인해야한다.
확인할 때마다 요리가 나오지 않았다면 다시 청소를 하러 돌아갈 것 이고
요리가 나왔다면 즉시 서빙을 할 것 이다.
Async Blocking
Async Blocking은 제어권을 다른 작업에게 위임하는 것 이다.
호출을 통해 작업을 요청했을 경우 제어권을 위임하기 때문에 제어권을 다시 얻기 전까진
다른 작업을 수행하지 못하고 대기해야한다.
마찬가지로 비동기식이므로 완료된 작업에 대해 즉시 처리 여부는 불명확하다.
이번엔 가게에서 정해진 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
'Study' 카테고리의 다른 글
Synchronous vs Asynchronous & Blocking vs Non-blocking (0) | 2024.10.07 |
---|---|
자료구조 해시 테이블(HashTable) (0) | 2024.09.25 |
싱글톤(Singleton) 클래스와 정적(Static) 클래스 (0) | 2024.08.25 |
가비지 컬렉터(Garbage Collector, GC) (0) | 2024.07.10 |