동기 vs 비동기
동기/비동기는 작업 순서 처리 차이에 관점을 둡니다.
동기 작업은 요청한 작업에 대해 순서가 지켜지는 것을 말하고, 비동기 작업은 순서가 지켜지지 않을 수 있다는 것을 말합니다.
동기(Synchronous)
동기(Synchronous)는 작업이 순차적으로 진행되며, 한 작업이 시작되면 해당 작업이 완료될 때 까지 다음 작업이 대기합니다.
요청한 작업에 대해 완료 여부를 따져 순차적으로 처리합니다.
비동기(Asynchronous)
비동기(Asynchronous)는 작업의 완료를 기다리지 않고 다음 작업을 바로 실행할 수 있습니다.
요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 그대로 수행합니다.
I/O 작업 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업을 처리하며 동시에 처리하여 멀티 작업을 진행할 수 있기 때문에, 전반적인 시스템 성능 향상에 도움을 줄 수 있습니다.
즉, 동시 처리가 발생하는데, 동시 처리는 두 개 이상의 작업이 동시에 실행되는 것을 의미합니다.
Blocking vs Non-Blocking
블로킹/논블로킹은 현재 작업이 block 되느냐 관점을 둡니다.
동기/비동기가 전체적인 작업에 대한 순차적인 흐름 유무라면, 블로킹/논블로킹은 전체적인 작업의 흐름 자체를 막냐 안막냐 입니다. 둘의 차이는 관점을 어디에 두냐 입니다.
즉, 호출된 함수가 호출한 함수에게 제어권을 바로 주냐 안주냐로 구분된다. 제어권이 넘어가면, 해당 스레드는 블로킹이 됩니다.
만약 제어권을 주지 않으면, 해당 스레드는 그대로 작업을 진행하고, 호출한 함수도 작업을 진행합니다.
블로킹(Blocking)
블로킹은 제어권을 호출한 함수에 넘겨준다.
제어권을 넘겼기 때문에 다른 작업이 완료될 때 까지 다음 작업을 수행하지 않습니다.
논블로킹(Non-Blocking)
논블로킹은 제어권을 호출한 함수에 넘겨주지 않는다. 즉 실행만 시킨다.
제어권을 넘겨주지 않기 때문에, 다른 작업이 완료될 때 까지 다음 작업을 수행합니다.
동기/비동기 + 블로킹/논블로킹
- Synchronous + Blocking : 다른 작업이 진행되는 동안 자신의 작업을 처리하지않고(Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리(Synchronous) 하는 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주는 경우 활용 가능하다. ex) C, Java 커맨드 실행
- Asynchronous + Blocking : 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고(Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는(Asynchronous) 방식이다.
- Synchronous + Non-Blocking : 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고(Non-Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차적으로 수행하는 (Synchronous) 방식이다. 작업이 끝났는지 주기적으로 확인한다.
- Asynchronous + Non-Blocking : 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고(Non-Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는(Asynchronous) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않은 경우에 활용할 수 있다. ex)웹 브라우저 다운로드
자바는 어떤 방식으로 동작하는가?
자바는 동기/비동기와 블로킹/논블로킹을 모두 지원합니다.
- 싱글스레드로 메서드를 호출해 순차적으로 작업을 처리 = 동기
- 멀티스레드로 작업을 처리 = 비동기
- IO 작업 = 블로킹 방식
- NIO API를 사용해 작업 = 논블로킹 방식
왜 JS는 Non-Blocking + Async 일까?
웹 브라우저 환경
JS는 웹 페이지의 동적인 요소와 상호작용하는 스크립팅 언어이다.
사용자의 입력이나, 서버로부터 응답을 비동기적으로 처리해야 한다.
사용자 경험 개선
웹 애플리케이션은 사용자의 경험을 중요시 하기 때문에, 응답성과 부드러운 UI 업데이트가 필요하다.
만약 JS가 블로킹으로 동작한다면, 하나의 작업이 끝날 때 까지 다른 작업이 불가하므로, 사용자 경험이 나빠질 수 있어, 비동기적인 처리를 통해 여러 작업을 병렬로 처리하면서 애플리케이션의 반응성을 유지할 수있다.
네트워크 통신
웹 애플리케이션은 서버와의 데이터 통신이 필요한 경우가 많은데, 이 때 브라우저는 네트워크 요청을 비동기적으로 보내고, 응답을 비동기적으로 받아서 처리함으로써 브라우저의 블로킹을 최소화하고 사용자 경험을 향상시킨다.
이벤트 기반 프로그래밍
JS는 이벤트 기반 프로그래밍 모델을 채택하여 웹 페에지 내에서 발생하는 다양한 이벤트에 응답할 수 있다.
비동기적인 처리를 통해 이벤트 핸들러를 효율적으로 관리하며, 사용자와의 상호작용을 원할하게 처리할 수 있다.
'Back-end' 카테고리의 다른 글
volatile (0) | 2023.08.23 |
---|---|
Thread(Java/OS) (0) | 2023.08.23 |
2023.08.22 TIL (0) | 2023.08.22 |
SOLID 원칙, 객체지향 프로그래밍 (0) | 2023.08.22 |
2023.08.21 TIL (0) | 2023.08.21 |