Synchronous vs Asynchronous & Blocking vs Non-blocking
Synchronous와 Asynchronous, Blocking과 Non-blocking이라는 말은 운영체제(OS)를 공부하면서 듣게 된 개념이다.
프로그래밍을 함에 있어 중요한 개념인 만큼 이번 기회에 정리를 해보고자 한다.
Synchronous와 Asynchronous
Synchronous
Synchronous의 의미는 동기식이라는 의미로,
작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미한다.
위 그림을 보면 Process A가 작업을 하는 도중 필요로 인해 Process B에게 작업을 요청한 상태이다.
이때 Process A는 Process B의 작업이 완료되는 즉시 결과에 대한 작업을 진행할 것 이다.
동기 방식은 요청한 작업의 결과를 즉시 처리하는 특징이 있다.
그렇기 때문에 위의 예시를 보았듯이 동기식의 흐름 방식은 직관적이기 때문에 이해하기가 쉽다.
Asynchronous
Asynchronous는 비동기식이라는 의미로,
시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미한다.
위 그림 역시 동기식의 상황과는 똑같은 상태이다.
비동기식에서는 Process A는 Process B가 작업을 완료되어 돌아온 결과에 대한 작업을 진행할 수도 있고 안할 수 있다.
비동기 방식은 동기 방식과 다르게 요청한 작업의 결과를 즉시 처리하지 않는다는 특징이 있다.
동기 방식과는 다르게 작업 완료에 대한 결과를 예측하기 어렵기 때문에 직관적이지 못한면이 있다.
위의 설명만으로는 동기와 비동기에 대한 이해가 어려울 수 있기 때문에 식당의 예시를 살펴보자.
웨이터는 주문을 받고 해당 주문을 요리사에게 요청을 한 이후 음식을 제공하는 일을 한다.
웨이터가 동기 방식으로 일을 수행하게 된다면 요리사에게 제공할 음식을 만들어달라고 요청한 이후
기다리거나 다른 일을 하고 있을 것이다.
그 이후 따뜻한 요리를 곧장 제공하기 위해 요리가 나오는 즉시 손님에게 제공을 해줄 것 이다.
요리사는 요리를 한 이후 서빙을 하라고 지시할 것이다. 이때 요리사는 기다리거나 다른 일을 하고 있을 것이다.
만약 식사가 끝난 손님의 빈 접시를 웨이터가 전해주게 된다면
요리사는 들어오는 주문에 맞는 요리를 하느라 빈 접시들이 들어오는 즉시 설거지를 하지 않을 것이다.
즉 동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단할 수 있다.
Blocking과 Non-blocking
Blocking
Blocking이란 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면
해당 작업이 완료될 때까지 기다렸다가 자신의 작업을 재개하는 것을 의미한다.
위의 그림을 보면 Process A가 작업을 하는 도중 Process B의 작업이 시작됨에 따라
Process A의 작업이 일시 중지 되는 것을 볼 수 있다.
Process B의 작업이 끝난 이후 Process A의 작업이 재개되는 것을 확인할 수 있다.
즉, 작업을 진행하는 제어권을 일시적으로 위임했다고 볼 수 있다.
Non-blocking
Non-blocking이란 Blocking과 달리 다른 주체의 작업이 시작된다고 해서
해당 작업이 완료될 때까지 기다리지 않고 자신의 작업을 하는 것을 의미한다.
Non-blocking은 Blocking과 달리 Process B의 작업이 시작되어도 작업이 중단되지 않고
계속해서 작업을 진행하는 것을 볼 수 있다.
즉, 작업을 진행하다 다른 작업이 시작되어도 제어권을 잃지 않는다는 것을 알 수 있다.
이렇듯 Blocking과 Non-blocking은 작업을 진행할 때 본인의 제어권이 있느냐 없느냐로 판단할 수 있다.
마무리
지금까지 Synchronous와 Asynchronous의 차이 및 Blocking과 Non-blocking의 차이에 대해서 알아보았다.
위의 두 부류는 명확하게 다른 개념이므로 헷갈려선 안된다.
또한 더 나아가 다음 게시글에서는
Sync blocking, Sync non-blocking과 Async blocking, Async non-blocking에 대해서도 다뤄볼려고 한다.