염딩코

[JS] 블로킹과 논블로킹 / 동기와 비동기 본문

Front-End/Javascript

[JS] 블로킹과 논블로킹 / 동기와 비동기

johnyeom 2023. 7. 27. 16:59

오늘은 블로킹논블로킹 그리고 동기비동기에 대해서 배워봅시다!

그리고 이들이 서로 어떻게 연관되어 있는지 알아봅시다!

 

 

블로킹과 논블로킹, 동기와 비동기에 대해서 공부하기 전에 먼저 알아야 하는 개념이 있습니다.

  • 제어권
    • 함수의 코드를 실행할 권리. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려줍니다.
  • 리턴값을 기다리는 것
    • A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 리턴값을 기다리느냐의 여부를 의미합니다.
  • 콜백 함수
    • 비동기 작업이 끝난 후에 실행되며, 해당 작업의 결과를 전달받아 필요한 처리를 수행하는 함수입니다.

 

블로킹(Blocking)

블로킹은 특정 작업이 완료될 때까지 다른 작업들이 기다려야 하는 상태를 의미합니다.

 

블로킹 작업은 해당 작업이 끝날 때까지 스레드나 프로세스 등의 리소스가 계속해서 사용되며, 

다른 작업들은 해당 작업이 끝나기를 기다려야 합니다.

 

이는 오래 걸리거나 많은 리소스를 사용한다면, 전체 시스템 성능이 저하될 수 있습니다.

 

 


논블로킹(Non-Blocking)

논블로킹은 특정 작업이 완료될 때까지 다른 작업들이 기다리지 않고, 계속해서 진행되는 상태를 의미합니다.

 

논블로킹 작업은 해당 작업이 완료되기를 기다리지 않고, 다른 작업들과 동시에 진행될 수 있습니다.

 

이는 시스템의 성능을 향상시키고, 여러 작업들을 더 빠르게 할 수 있지만 설계가 복잡해진다는 단점이 있습니다.

 

 

 


동기와 비동기

동기와 비동기에 대한 개념은 이전에 다뤘기 때문에 아래를 참고하시면 됩니다.

2023.03.02 - [etc] - 동기 vs 비동기

 

동기 vs 비동기

동기와 비동기는 프로그래밍에서 중요한 개념 중 하나입니다. 이 둘은 서로 다른 실행 방식을 갖고 있고, 이를 이해하는 것은 프로그래밍에서 매우 중요합니다. 동기적 실행은 각 작업이 순서대

yeomyeom.tistory.com

 


동기와 비동기, 블로킹과 논블로킹을 어떻게 엮을 수 있을까?

동기와 비동기작업의 실행 방식을 의미하며, 블로킹과 논블로킹작업의 결과를 기다리는 방식을 의미합니다.

이들을 조합하면 총 4가지 조합이 나올 수 있습니다.

 

 

1. 동기 블로킹 (Synchronous Blocking)

 

동기 블로킹은 작업을 순차적으로 실행하면서 해당 작업이 완료될 때까지 기다리는 방식입니다. 

한 작업이 완료되기 전까지는 다음 작업이 실행되지 않으며, 다음 작업들은 해당 작업이 끝날 때까지 대기해야 합니다.

이 방식은 코드가 간단하고 직관적이지만, 작업이 오래 걸리는 경우에는 프로그램 전체가 느려지는 단점이 있습니다.

 

동기 블로킹

  • 함수 A는 함수 B의 리턴값을 필요로 합니다. => 동기
  • 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다립니다. => 블로킹

 

 

 

2. 동기 논블로킹 (Synchronous Non-Blocking)

 

동기 논블로킹은 작업을 순차적으로 실행하지만, 해당 작업이 완료될 때까지 다른 작업들이 대기하지 않고 진행되는 방식입니다.

작업이 완료되기를 기다리면서 다른 작업들은 다음으로 진행되지만, 다음 작업들이 해당 작업의 결과를 기다리게 됩니다.

 

동기 논블로킹

A 함수는 B 함수를 호출합니다. 이 때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행합니다. => 논블로킹

하지만, A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행이 완료되었는지 물어봅니다. => 동기

 

 

 

3. 비동기 블로킹 (Asynchronous Blocking)

 

(마주하기 쉽지 않음)

비동기 블로킹은 작업을 동시에 실행하면서 해당 작업이 완료될 때까지 기다리는 방식입니다. 

다른 작업들은 해당 작업이 끝날 때까지 대기하지만,

작업이 동시에 실행되기 때문에 블로킹 작업이 빨리 끝나는 경우에는 다른 작업들이 빨리 진행될 수 있습니다.

 

 

비동기 블로킹

A 함수는 B 함수의 리턴값에 신경쓰지 않고, 콜백함수를 보냅니다. => 비동기

그런데, B 함수의 작업에 관심없음에도 불구하고, A 함수는 B 함수에게 제어권을 넘깁니다. => 블로킹

 

 

 

4. 비동기 논블로킹 (Asynchrnous Non-Blocking)

비동기 논블로킹은 작업을 동시에 실행하면서 해당 작업이 완료되기를 기다리지 않는 방식입니다.

작업이 완료되면 콜백 함수나 프로미스 등을 통해 결과를 처리합니다.

다른 작업들은 해당 작업이 끝나기를 기다리지 않고 동시에 진행됩니다.

 

비동기 논블로킹

A 함수는 B 함수에게 제어권을 주지 않고, 자신이 계속 가지고 있습니다. => 논블로킹

B 함수를 호출한 이후에도 자신의 코드를 계속 실행합니다.

그리고, B 함수를 호출할 때, 콜백 함수를 함께 줍니다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행합니다. => 비동기

 

 

비동기 작업은 작업의 완료를 기다리지 않고 다음 작업으로 진행하기 때문에

결과를 처리하기 위해서는 콜백 함수프로미스 등을 통해서 비동기 작업의 결과를 다뤄야 합니다.