동기, 비동기 그리고 블로킹, 논블로킹은 프로그램을 개발할 때 중요한 개념 중 하나입니다. 기초 프로그래밍을 배우고 응용 파트인 병렬 프로그래밍을 익힐 때 나오는 개념이고 익히기 쉽지 않은 개념이기도 합니다.
동기와 비동기 개념과 블로킹과 논블로킹은 혼용하여 사용하는 경우가 있지만 엄연히 서로 다른 개념입니다. 흔히 '동기' == '블로킹', '비동기' == '논블로킹'으로 헷갈리기도 합니다. 하지만 실제로는 두 개념은 서로 크게 연관관계가 없는 별개의 개념입니다.
동기/비동기는 작업을 수행하는 주체가 두 개 이상이어야 합니다. 이 때 작업의 시간(시작, 종료 등)을 서로 맞춘다면 이를 동기라고 부르고, 서로 작업의 시간이 관계없다면 이를 비동기라고 부릅니다. 반면 블로킹/논블로킹은 작업의 대상이 2개 이상이어야 합니다. 두 개념이 서로 바라보는 관점이 다르기 때문에 동기/블로킹, 동기/논블로킹, 비동기/블로킹, 비동기/논블로킹의 다양한 조합이 가능합니다.
동기/비동기
동기 작업이란 작업을 수행하는 두 개 이상의 주체가 서로 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작할 때를 의미합니다. 시작과 종료를 동시에 하거나, 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작하면 이는 동기 작업이라고 볼 수 있습니다.
비동기 작업은 두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있을 때를 뜻합니다. 서로 다른 주체가 하는 작업이 자신의 작업 시작, 종료시간과는 관계가 없을 때 비동기라고 부를 수 있습니다.
블로킹/논블로킹
블로킹과 논블로킹은 다른 작업을 수행하는 주체를 어떻게 상대하는지가 중요합니다. 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작한다면 이는 블로킹이고, 다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 이를 논블로킹이라고 할 수 있습니다.
스레드 A가 어떤 작업을 하는 다른 대상을 호출하고, 그 대상이 가져온 결과물을 받아 다시 작업을 재개하고 있습니다. 예를 들자면 Java에서 JDBC를 사용하여 DB에 질의를 날리고 결과를 받아오는 작업을 블로킹 작업이라고 부를 수 있습니다. 이와 반대로 다른 주체에게 작업을 요청하고 그 결과를 받을 때까지 기다리지 않으며 자신의 작업을 한다면 이를 논블로킹이라고 할 수 있습니다.
동기/비동기와 블로킹/논블로킹의 조합
동기, 블로킹 조합
동기이며 블로킹인 작업은 어떤 작업이 있을까요? 동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 그리고 블로킹의 조건인 '다른 작업을 하는 동안 자신의 작업을 일시정지할 것' 을 만족하는 작업의 예는 아래와 같습니다.
- JDBC를 이용해 DB에 쿼리 질의를 날린다
- 메서드에서 다른 메서드를 호출하여 결과값을 즉시 받아온다
비동기, 블로킹 조합
비동기의 조건인 '다른 작업과 시작, 종료 시간을 맞추지 말 것'과 블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다릴 것'을 만족해야 합니다. 비동기, 블로킹 조합은 결국 다른 작업이 끝날 때를 기다려야 하기 때문에 동기, 블로킹과 비슷한 작업 효율이 나옵니다. 즉 그리 좋은 효율이 나오지 않습니다. 개발자가 유도해서 이 상황을 만드는 것보다 비동기, 논블로킹 작업을 실행하였지만 자기도 모르게 블로킹 작업을 실행했을 때 이러한 결과가 나옵니다.
- 비동기, 논블로킹 작업을 호출하고 자신의 작업을 하던 도중 호출한 작업의 결과 값을 조회하려고 했을 때(블로킹 메서드 실행)
동기, 논블로킹 조합
동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 논블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 동기, 논블로킹 조합도 비동기, 블로킹 조합처럼 작업 효율이 좋지 않은 편입니다. 논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회합니다.
- Polling
비동기, 논블로킹 조합
'다른 작업과 시작, 종료 시간을 맞추지 말 것', '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 비동기, 논블로킹 조합은 자원이 충분하다면 효율이 좋은 조합입니다. 자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다. 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속할 수 있기 때문에 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적입니다.
- 대규모 사용자에게 푸시메세지 전송
- 다양한 외부 API를 한번에 호출할 때
Reference
Spring Camp 2017 Async & Spring
https://www.youtube.com/watch?v=HKlUvCv9hvA&t=928s
Stack overflow
https://stackoverflow.com/questions/52234241/what-is-blocking-in-async-or-sync
'Web > Infra' 카테고리의 다른 글
[Tech 면접] 시스템을 설계해보라는 질문을 받는다면? (2) | 2020.06.12 |
---|---|
Kubernetes(쿠버네티스)를 소개합니다 (4) | 2020.05.31 |
Docker를 소개합니다 (2) | 2020.05.23 |
브라우저에 URL을 입력했을 때 발생하는 일들 (9) | 2020.04.25 |
로드밸런서의 종류와 동작방식 (14) | 2020.03.23 |
댓글