티스토리 뷰

반응형

정확히 말하자면 자바는 Synchronous / blocking 방식을 지원하는 언어다. 그렇다면 Synchronous / blocking이란 무엇일까? 그리고 반대 되는 Asynchronous / non-blocking에 대해서도 알아보자

 

Synchronous / Blocking 

먼저 각자의 뜻을 알아보면 Synchronize는 간단하게 두 개의 주체가 서로 동시에 수행하거나, 동시에 끝나거나 끝나는 동시에 시작하는 것을 말한다.  이를 쉽게 예로 들자면 이런 것이다.

한명의 직원이 있고 상사가 있다고 가정해보자 동기적으로 동기적인 직원은 상사에게 서류를 제출하고 상사가 일을 처리할 때 까지 계속 물어볼 것이다. 그리고 상사가 일처리를 끝내고 결과를 줘야만 직원은 다시 가서 하던 일을 할 수 있다.

 

blocking은 제어권이 호출된 함수에게 넘어가고 함수 내에 작업이 모두 끝난 후 호출한 함수에게 다시 제어권이 넘어오는 식으로 동작한다. 즉, 작업이 완료된 후 새로운 작업을 수행할 수 있는 것이다. 이도 마찬가지로 예를들어보자

한명이라는 직원과 상사가 있다면 이번엔 직원이 아닌 상사에 주목해보자 ! 상사는 직원에게 서류를 전달 받고 이제 상사가 결과가 나올 때 까지 직원을 기다리게 하는 것이다. 마찬가지로 일이 끝난 후에야 직원은 다음 일을 처리할 수 있다.

 

이제 이 둘을 합친다면 프로그램은 동작을 하다가 특정 함수가 호출되는 시점에 동작을 멈추고 그 함수가 제어권을 갖고 계속 결과 여부를 물으며 기다리다 결과를 받게 되면 다시 원래 하던 동작을 하게 될 것이다. 

Asynchronous / non-blocking

반대 되는 개념이라고 생각하면 된다. 비동기는 결과와 상관없이 작업을 이어나가다가 중간에 결과가 끝난다면 받아와서 나머지 작업을 처리한다. 즉, 다른 주체가 작업하더라도 작업 시작, 종료시간과는 관계가 없는 것이다. 

상사가 일을 처리하는 동안 자기 할일을 하다가 상사가 작업을 마치고 결과를 주면 다시 그 결과를 갖고 작업하는 사원과 같다고 생각하면 된다.

 

논블라킹도 블라킹과 반대되는 것이라고 생각하면 된다. 함수가 호출 되더라도 그대로 호출한 함추가 제어권을 갖고 작업을 수행합니다. 그리고 작업이 끝나면 결과를 반환한다. 

상사가 일을 처리하는 동안 잡지 않고 작업이 끝나면 그 때 불러 결과를 주는 식으로 일 처리가 진행되는 것과 같다고 생각하면 된다.

 

그럼 이 둘의 차이점은 무엇일까?

 

Synchronous / Blocking vs Asynchronous / non-blocking

이미 여러분들은 여기까지 읽었다면 답을 알 수 있을 것이다. 다음과 같이 정리할 수 있을 것이다.

  • 비동기 / 논블라킹은 비교적 성능과 자원의 효율면에서 우수하다.
  • 동기 / 블라킹은 멀티 스레드에서도 안전하게 순차적으로 프로그램이 실행될 수 있다.

이 차이는 특성에서 알 수 있다. 먼저 비동기 / 논블라킹은 하던 일을 계속 진행하면서 원하는 결과를 받아오게 될 경우 클라이언트에게 해당 결과를 보여줌으로 결과를 기다리는 동안 다른 일처리도 가능하다. 그렇기 때문에 성능이 빠를 수 밖에없다. 

하지만 동기 / 블로킹은 결과가 나올 때  까지 다른 업무를 할 수 없기 때문에 기다려야 하고 클라이언트 또한 결과가 나오기 까지 기다려야 한다. 그렇기 때문에 느릴 수 밖에 없다.

 

하지만 멀티 스레드환경에서는 다를 수 있다. 여러 스레드가 자원을 공유할 수 있기 때문에 만약 비동기 / 논 블라킹이라면 RaceCondition이 발생 데이터 일관성이 흐트러질 수 있다. 그렇기 때문에 동기 / 블로킹이 멀티 스레드 환경에선 안전하게 데이터를 다룰 수 있다. 

 

결론 : 자바는 그래서 Synchronous / blocking?

먼저 결론을 말씀드리면 그건 아니다. Completable Future를 통해 비동기 처리를 할 수 있으며 Spring webflux 또한 비동기 / 논블라킹으로 동작해 이벤트 루프 기반 매우 빠른 일 처리를 보여준다. 다만 자바는 멀티 스레드 지원을 하기 때문에 비동기 처리에 대해서는 매우 신중해야 할 것이다.

 

반면에 대표적인 비동기 / 논블라킹 언어인 자바스크립트는 이벤트 루프 기반으로 싱글 스레드 처럼 동작하여 비동기 / 논블라킹 환경에서 동작한다. 그렇기 때문에 매우 빠른 동작을 보여준다. 그렇다고 해서 마냥 자바스크립트가 좋은언어라곤 할 수 없지만 확실히 빠른 동작을 보여주기 때문에 이를 우리는 Reactive(반응형) Programming이라고도 부른다. 

 

두 언어나 프레임워크에 대해서는 알아보지 않겠다. 각자의 장점은 이러한 요소의 차이보다 다른 요소에 의한 차이가 더 많이 차지 할 수 있기 때문이다. 

 

Reference.

https://deveric.tistory.com/99

 

동기/비동기와 블로킹/논블로킹

동기, 비동기 그리고 블로킹, 논블로킹은 프로그램을 개발할 때 중요한 개념 중 하나입니다. 기초 프로그래밍을 배우고 응용 파트인 병렬 프로그래밍을 익힐 때 나오는 개념이고 익히기 쉽지 않

deveric.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함