[1.13]Blocking, Sync

Always·2025년 1월 13일
1

매일메일

목록 보기
17/69

https://www.maeil-mail.kr/question/77
요약: 일반적으로 우리가 사용하는 웹 에플리케이션은 여려가지 task를 처리 한다. 이 task를 동시에 수행하거나, 아니면 하나의 task가 다른 task에 종속적이면, task가 순차적으로 진행되어야할 것이다. 이 때 사용되는 개념으로 Blocking,
Non-Blocking, Sync, Ansync 가 있다.

Blocking?

BlockingNon-Blocking제어권과 관련된 개념이다.

다음과 같이 A의 일을 처리하다가 B의 일을 처리해야해서, A의 일을 멈추어서, 어플리케이션의 제어권이 B로 넘어가게 된다.
여기서 A의 일이 멈추게 되는데,즉 A가 하는 일이 Block되었다는 의미이다. 이것이 바로 Blocking이다.


반면 Non-Blocking은 A의 일을 처리하다가 B의 일을 처리한다고 해서, 어플리케이션의 제어권이 B로 넘어가지 않는 것을 의미한다.
이 때는 어플리케이션은 A,B모두에게 제어권을 부여하며, 동시에 일을 수행할 수 있다.

Sync?

SyncAnSync은 시간과 관련된 개념이다.

Synchronous는 동기화로써, 순서에 맞게 일함을 의미한다.
즉 위의 예시에서 A의 일이 B의 일이 끝나야 수행 될 수 있는 것처럼 하나의 일이 그전의 일이 종료되어야지, 그 일이 수행될 수 있는 것이다.

반면 Asynchronous는 비동기화로써, 순서에 맞지 않게 일함을 의미한다. 즉 하나의 일이 다른 일이 끝나야 수행되는 것이 아닌, B의 일이 끝남과 A의 일은 전혀 관련이 없는 일인 것이다.

그러면 Blocking과 Synchronous의 개념은 연관이 있는 건가?

이 두가지의 개념은 위에서도 말했다 싶이 각자의 관점에 따라서 다르게 볼 수 있을것이다.
어플리케이션이 가지는 제어권과 관련이 있다면, Blocking인지 Non-Blocking에 대해서, 각 task의 순서성과 관련이 있다면, Synchronous인지 Asynchonous를 통해서 구현이 가능할 것이다.

Sync-Block

일의 제어권은 하나씩 가지며, 순서가 무조건 보장해야한다는 것을 의미한다.

System.out.println("입력해주세요");
int a=sc.nextInt();
System.out.println(a);

이 경우 a라는 숫자를 출력하는 일을 하기 위해서,숫자가 입력되기를 계속 기다리게 된다.
즉 순서가 무조건 보장 되어야하며, 입력을 받아야하므로, 제어권이 io로 넘어가게 된다.

이 경우는 순서가 보장되어 있으면 제어권을 하나씩 가져야한다는 우리의 직관과 크게 다르지 않게 흘러간다.

Sync-NonBlock

어플리케이션이 제어권을 여러개 가져도 순서대로 되기를 보장하는 경우를 의미한다.

Sync-Block의 경우에서는 제어권이 io로 넘어가서 어플리케이션이 가지고 있던 제어권이 io로 넘어가서, 기존의 어플리케이션에서 다른 작업을 수행할 수가 없게된다.
그러나 이 경우는 제어권이 완전히 io로 넘어가는 것이 아니다.

즉, 어플리케이션은 다른 일을 하면서 io작업이 끝났는지를 계속 물어보면서, 끝나면 해당 작업을 수행할 수 있는 것을 의미한다.
이 경우는 io작업이 있어야 다음 작업이 수행되어야하는, 순서성도 보장해야하지만, 그렇다고, 제어권이 완전히 넘어가는 것은 아니다.

ASync-Block

이 경우는 제어권을 하나만 가져야 하며, 순서는 보장되지 않아도 된다는 의미이다.
뭔가 언뜻 들어도 이게 뭔소리인가 싶다.


a의 일이 b의 일을 호출 하고 기다리는데, b->a의 순서가 보장되지 않기 때문에, a는 필요할 때 가져온다.
즉 io를 요청해놓고, io작업이 끝났는데, 기존 어플리케이션의 일을 수행하지 않고, 필요할 때 가져오는 것이다.

io가 필요해서 요청했는데, 이를 계속 기다리게 하고,a의 일 또한 수행이 안되는 것이다.
즉 매우 비효율적이며, 개발자들에게 Anti-pattern으로 여겨진다

Async-NonBlock

이 경우는 순서를 보장하지 않고, 여러 제어권을 가지면서 동시에 여러 작업을 수행하는 것을 의미한다.
이는 멀티쓰레드를 통해서 수행되며, 더 빠르게 작업이 수행이 가능하다.

스프링에서 동기, 비동기처리, 그리고 멀티쓰레드를 어떻게 사용하는지는 다른 글을 통해서 공부해볼까 한다.

출처:https://www.youtube.com/watch?v=cmBFGSrHKnM

profile
🐶개발 블로그

0개의 댓글