개발/Java

동기와 비동기, Blocking과 Non Blocking

승리승리 2022. 1. 22. 01:53

생각해보면 직전 회사에 면접을 볼 때 계셨던 과장님께서 같은 질문을 3번인가 반복하셨었다.

 

동기와 비동기에 대해 설명해주세요.

 

3번 다 같은 대답을 하였었는데 최근 면접에서 아래 질문을 받고나서 스스로 깨닳았다.

 

Blocking과 Non Blocking에 대해 설명해주세요.

 

나 이거 제대로 모르구나.

 

면접 자리에서 깨닳고 스스로 엄청 부끄러웠다.

그동안 일하면서 알게 모르게 그 차이를 느껴왔던거 같은데 질문 받는 순간 확 느껴졌다.

 

그동안...

 

동기 == Blocking

이벤트가 발생했을 때 이벤트가 종료될 때 까지 해당 이벤트가 제어권을 가지고 있는다.
이로 인해 뒤에 들어온 모든 이벤트는 락이 걸린다.

 

비동기 == Non Blocking

이벤트가 발생했을 때 이벤트의 종료 여부와 상관없이 다음 이벤트를 수행한다.
수시로 이전에 호출된 이벤트의 종료 여부를 확인하고 종료되었을 경우 결과를 반환한다.

 

처럼 같은 의미로 이해하고 살았다.

얼추 맞지만 완전 다르다.


동기(Synchronous)

1. 함수를 호출 했을 때 작업의 완료 여부를 신경쓴다.
2. 반환될 때 까지 다음 작업(함수 호출)을 수행하지 못한다.
3. 호출한 함수에 문제가 발생하면 그 다음 함수 호출은 무한히 길어질 수 있다.

 

비동기((Asynchronous)

1. 함수를 호출 하고 작업의 완료 여부를 신경쓰지 않는다.
2. 반환받지 않아도 다음 작업(함수 호출)을 수행한다.
3. Casllback함수가 작업의 완료 여부를 신경쓴다.
4. A함수를 호출하고 B함수가 A함수의 Callback함수일 경우 A의 작업 완료 여부는 B함수가 신경쓴다.
5. A의 작업이 완료되면 B함수가 호출된다.

 

Blocking

1. 함수를 호출 했을 때 해당 함수로 부터 반환이 있을 때까지 작업을 정지한다.

 

Non Blocking

1. 함수를 호출 했을 때 바로 반환받아 제어권을 획득한다.
2. 할일을 하면서 호출한 함수의 결과를 계속해서 확인하거나 하지 않는다. (동기/비동기에 따라 나뉨)

 

동기/비동기Callback 여부에 따라 나뉘고

Blocking/Non Blocking제어권의 Return 시점에 따라 나뉜다.

 

즉 두 그룹의 가장 큰 차이는 관심사이다.

동기이면서 Non Blocking일 수 있는 거고 비동기이면서 Blocking일 수 있는거다.

동기 - Blocking

동기이므로 호출자가 함수의 반환을 신경쓴다.
Blocking이므로 제어권을 함수에게 넘겨준다.
일반적인 명령형 프로그래밍으로 Java가 대표적이다.

Application에서 Kernel로 Read I/O를 호출했다.

이때 제어권은 Kernel로 넘어가고 Kernel에서 Read I/O작업이 완료 되고 제어권과 결과 값이 반환될 때 까지 Application어떤 작업도 할 수 없다.

 


 

동기 - Non Blocking

동기이므로 함수의 반환을 호출자가 신경 쓴다.
Non Blocking이므로 제어권은 호출자에게 곧 바로 반환된다.

Application에서 Kernel로 Read I/O를 호출했다.

이때 제어권은 Kernel에서 Application으로 곧 바로 반환되었다.

이후 동기이므로 Application에서 Kernel로 계속해서 반환을 확인한다.

이 사이 Non Blocking이므로 제어권은 Application에게 있고 Application에서는 다른 작업을 수행할 수 있다.

 


 

비동기 - Blocking

비동기이므로 호출자가 반환을 신경쓰지 않는다.
Blocking이므로 제어권은 호출된 함수에게 있다.
비효율적이라 직접적으로 사용하는 모델은 없지만 Node.js와 MySQL을 함께 사용하는 경우 해당 방식으로 동작하게 된다고 한다.

 


 

비동기 - Non Blocking

비동기이므로 호출자가 반환을 신경쓰지 않는다.
Non Blocking이므로 제어권은 호출자에게 곧 바로 반환된다.

Application에서 Kernel로 Read I/O를 호출했다.

이때 제어권은 Kernel에서 Application으로 곧 바로 반환되었다.

이후 비동기이므로 Application에서는 반환을 신경쓰지 않는다.

Kernel에서는 작업이 완료되면 Callback함수를 수행한다.

이 사이 Non Blocking이므로 제어권은 Application에게 있고 Application에서 다른 작업을 수행할 수 있다.


이제 늦었지만 천천히 동기/비동기, Blocking/Non Blocking을 Java로 구현해보고 내용을 정리해서 올리고자 한다.

그럼 과제를 수행할 때 충분히 적용할 수 있을거다.

 

- 참고

https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx

 

Sync VS Async, Blocking VS Non-Blocking

1. Sync VS Async 먼저 Synchronous와 Asynchronous의 어원을 보자. Synchronous의 Syn는 together이란 뜻이고, chrono는 time이다. 따라서 Synchronous는 함께 시간을 맞춘다라는 뜻으로 해석된다. 반면에 A

velog.io

https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking

 

동기 vs 비동기 (feat. blocking vs non-blocking)

동기/비동기, blocking/non-blocking에 대해 알아봤다.

velog.io

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

 

블로킹 Vs. 논블로킹, 동기 Vs. 비동기

와 드디어 이해했다 속이 후련~

velog.io

https://velog.io/@rohkorea86/Promiseis-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%8F%99%EA%B8%B0%EC%97%90%EC%84%9C-Promise%EA%B9%8C%EC%A7%80

 

[Async, 비동기와 동기] Promise에서 Await까지

비동기/동기에 대한 정의와 콜백함수,콜백지옥을 거쳐 Promise가 도입된 이유 그리고 간략히 Async Await까지 순서대로 정리하려고 합니다. 코드 보다는 개론적인 의미에 치중해 작성된 글입니다. Pro

velog.io