본문 바로가기
나의 공부

동기와 비동기, Blocking과 Non-Blocking의 차이

by 이숴 2023. 5. 4.
반응형

서론

우선 알아야 할 것이, 두 개념은 서로 다른 개념이란 것을 알고 있어야합니다.

 

동기 / 비동기는 어떤 요청을 보내고 그 요청에 대한 결과가 돌아오기 전까지 대기하는방식을 의미합니다.

Blocking / Non-Blocking는 입출력 작업을 수행할 때, 데이터가 읽거나 쓰여질 때까지 대기하거나 대기하지 않는 방식을 말합니다.

 

또한, 동기 / 동기, Blocking과 NonBlocking을 설명할때는 제어권이라는 말이 많이 나옵니다. 여기서 말하는 제어권이란 프로그램의 실행 과정에서 어떤 코드가 다음에 실행될지를 결정하는 권한을 말합니다.

 

간단한 요약

동기

동기란 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미합니다.

 

동기 예시

동기는 호출된 함수의 처리가 완료될 때까지 제어권이 호출한 함수에게 남아있는 방식입니다.

호출한 함수는 호출된 함수가 작업을 완료하고 반환한 값을 받아서 다음 로직을 처리합니다.

이때 호출된 함수가 오래 걸릴 경우 호출한 함수도 지연됩니다.


간단히 두 작업의 시작과 끝이 동시에 수행된다는 것입니다. 그림 예시의 스레드 1이 어떠한 요청을 스레드 2로 보냈을 때, 요청의 대한 결과를 기다리거나, 다른 작업을 하고 있어도 됩니다. 그러나 스레드 2의  결과가 완료되었다면 다른 작업을 정지하고, 요청의 대한 결과를 받아와 바로 처리 수행하게 되는 것이죠. 

 

비동기

비동기는 시작, 종료시간이 일치하지 않고, 끝나는 동시에 시작을 하지 않는다는 의미입니다.

비동기 예시

비동기는 호출된 함수의 작업이 완료될 때까지 대기하지 않고, 바로 제어권을 호출한 함수에게 반환합니다. 

이후 호출한 함수는 반환된 값을 바탕으로 다른 로직을 처리합니다. 

이때 호출된 함수의 작업이 완료되면 콜백 함수를 호출하거나 이벤트를 발생시켜 호출한 함수에게 결과를 전달합니다.


비동기 또한 두 작업이 실행되는 상황은 동일 합니다. 스레드 1이 어떠한 요청을 스레드 2로 보내서 결과를 반환하는 것은 같지만, 스레드 2가 요청의 대한  결과가 완료되었다면, 동기일 경우에는 바로 해당 결과의 대한 작업을 받아와 처리했지만, 비동기는 바로 처리하지 않아도, 처리해도 상관이 없습니다.

 

Blocking

자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것을 의미합니다.

 

Blocking 예시

blocking이란, 어떤 작업이 시작되면 완료될 때까지 다른 작업이나 처리를 하지 않는 것을 의미합니다. 

즉, 해당 작업이 끝날 때까지 프로그램의 실행 흐름이 멈춰있게 됩니다. 

이는 대개 입출력 작업에서 주로 발생합니다. 

예를 들어, 파일을 읽고 쓰거나, 소켓을 통해 데이터를 주고받는 등의 작업은 I/O 작업으로 분류되며, 이 작업이 끝날 때까지 대기하게 됩니다.


두 스레드가 있을 때, 스레드 1이 어떠한 작업을 요청을 하면 스레드 2가 해당 작업을 끝낼 때까지 기다리고 이외의 다른 작업을 처리하지 않는 다는 것인데요. 따라서 스레드2가 끝냈을 때 다시 제어권을 받아와서 작업을 지속하는 것을 말합니다.

 

 

 

Non-Blocking

다른 주체의 작업과 관련없이 자신의 작업을 하는 것을 의미합니다.

Non-Blocking 예시

non-blocking은, 작업이 시작되었어도 완료되기 전에 다른 작업이나 처리를 수행할 수 있도록 하는 것을 의미합니다. 

이를 통해 프로그램이 여러 작업을 동시에 처리할 수 있게 됩니다. 

non-blocking 작업은 일반적으로 비동기식 처리 모델에서 사용됩니다.


작업을 요청한 상황은 blocking과 크게 다르지 않습니다. 스레드 1이 스레드2에 작업을 요청할때, 스레드 1은 스레드 2의 작업이 마무리되기를 대기하는 것이 아닌, 요청을 하고 이외의 다른 작업을 수행하는 것을 의미합니다.

 

동기/비동기, blocking/non-blocking 조합

일반적으로 이 두개념들은 조합되어서 설명이 많이 되는데요. 표를 한번 확인해보겠습니다.

Blocking/Sync

호출된 함수의 작업이 완료될 때까지 대기하며, 이후 다음 코드를 실행합니다.
호출된 함수가 완료될 때까지 현재 스레드가 블로킹(blocking)됩니다.


스레드1이 스레드2에 어떠한 작업을 요청했을 때, 스레드2의 작업의 대한 결과를 받기 전까지 아무 작업을 하지않고 대기합니다. 이후 스레드2의 작업이 끝나 결과가 완료되었다면, 결과를 바로 받아서 스레드1이 작업을 처리하게 되는 것이죠,

 

예시) 자바환경에서 입력요청을 할때, blocking sync를 사용

 

NonBlocking/Sync

호출된 함수의 작업이 완료될 때까지 대기하지만, 다른 작업을 처리할 수 있습니다.
호출된 함수가 완료될 때까지는 현재 스레드가 블로킹(blocking)됩니다.


스레드1이 스레드2에 어떠한 작업을 요청했을 때, 스레드2의 작업의 대한 결과를 받기 전까지 다른 작업을 하면서 수시로 스레드2에게 결과가 완료되었는지 확인을 하게 됩니다. 이후 스레드2의 작업이 끝나 결과가 나왔다면, 결과를 바로 받아서 스레드1이 작업을 처리하게 되는 것이죠,

 

Blocking/Async

호출된 함수의 작업을 백그라운드 스레드에서 처리합니다.
호출된 함수가 완료되기 전에 다음 코드를 실행합니다.
호출된 함수가 완료될 때까지 다른 스레드를 블로킹(blocking)하지 않습니다.
콜백(callback) 함수를 사용해 작업이 완료될 때까지 기다립니다.


스레드1이 스레드2에 어떠한 작업을 요청했을 때, 스레드2의 작업의 대한 결과를 받기 전까지 스레드1은 대기를 하게 됩니다. 이후 스레드2의 작업이 끝나 결과가 나왔지만, Async인 경우이기 때문에 결과가 끝났어도 바로 처리하지 않아도 됩니다. 이후에 아무때나 결과를 받아서 스레드1이 작업을 처리하게 되는 것이죠,

 

Non-Blocking/Async

호출된 함수의 작업을 백그라운드 스레드에서 처리합니다.
호출된 함수가 완료되기 전에 다음 코드를 실행합니다.
호출된 함수가 완료될 때까지 다른 스레드를 블로킹(blocking)하지 않습니다.
콜백(callback) 함수를 사용해 작업이 완료될 때까지 기다리지 않습니다.


스레드1이 스레드2에 어떠한 작업을 요청했을 때, 스레드2의 작업의 대한 결과를 받기 전까지 다른 작업을 하고 있게 됩니다. 이후 스레드2의 작업이 끝나 결과가 나왔지만, Async인 경우이기 때문에 결과가 끝났어도 바로 처리하지 않아도 됩니다. 이후에 결과를 받았지만, 현재 자신의 작업을 끝낸 후에 처리를 하게 됩니다.

 

 동기/비동기, Bocking/Non-Blocking을 확인하자면 다음과 같습니다.

 

예시)자바스크립트에서 API요청을하고 다른 작업을 하다가 콜백을 통해 추가적인 작업을 하는 것이 대표적인 예시가 되겠습니다.

 

스프링에서는?

스프링에서의 예시로는 스프링 MVC의 동기와 비동기 처리가 있습니다. 스프링 MVC에서는 동기적인 방식으로 처리되는 Blocking I/O 방식과 비동기적인 방식으로 처리되는 Non-blocking I/O 방식이 존재합니다. Blocking I/O 방식은 I/O 작업이 완료될 때까지 대기하는 방식으로, 요청 처리가 완료될 때까지 다른 요청을 처리하지 못합니다. 하지만 Non-blocking I/O 방식은 I/O 작업이 완료될 때까지 기다리지 않고 다른 요청을 처리할 수 있으므로 처리 효율이 향상됩니다.

스프링에서는 비동기적인 방식으로 처리하기 위해 @Async 어노테이션을 제공하고 있으며, Spring Webflux 프레임워크를 통해 Non-blocking I/O 방식을 지원합니다.

 

반응형

'나의 공부' 카테고리의 다른 글

제네릭이란 뭘까..  (0) 2023.05.18
프록시 패턴이란 무엇일까  (0) 2023.05.11
객체지향 설계 원칙 SOLID  (0) 2023.04.27
JPA? 왜사용할까.  (0) 2023.04.21
스프링, 스프링부트? 왜사용할까.  (1) 2023.04.20

댓글