면접준비[프론트,백,데이터,CS]/InterView 준비 [ 백엔드 ]

[ 백엔드 면접 준비 ] 블로킹 vs 논블로킹 // 동기 vs 비동기

안다미로 : Web3 & D.S 2024. 12. 9. 22:06

 

 

 

 

[ 백엔드 면접 준비 ] 블로킹 vs 논블로킹  //  동기 vs 비동기

 


 

∇ 백엔드 면접 준비 : 블로킹vs논블로킹 // 동기 vs 비동기

목  차

1. Blocking(블로킹) & Non-blocking(논블로킹)
2. Synchronous(동기) & Asynchronous(비동기)
3. 비교.

 

 


0. Intro.

       - Block & non-block , sync-async 개념을 이해하기 위해서는 다음 두가지 용어를 먼저 짚어야 한다고 합니다.

                 

             ◆ 제어권.

                    ○ 제어권은 자신(함수)의 코드를 실행할 권리 같은 것.

                           - 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려줍니다.

 

             ◆ 결과값을 기다린다는 것.

                    ○ A함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미합니다.

 

 


 

Ⅰ. Blocking(블로킹) & Non-blocking(논블로킹)


 

     ※ 블로킹과 논블로킹은 'A함수'가 'B함수'를 호출했을 때,

            제어권을 어떻게 처리하느냐에 따라 달라집니다.

 

 

 


 

         1) 블로킹 (Blocking )

 

               :: '블로킹'은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨줍니다

 

 

                                 1. 'A 함수' 가 'B 함수' 를 호출하면, B에게 제어권을 넘겨줍니다.

 

                                 2. 제어권을 넘겨받은 B는 열심히 함수를 실행합니다. 

                                       A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춥니다.

 

                                 3. B 함수는 실행이 끝나면, 자신을 호출한 A에게 제어권을 돌려줍니다.

 

 

 

 

         2) 논-블로킹 (Non-Blocking )

               :: '논-블로킹'은 A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있습니다.

 

 

 

               1. A 함수가 B 함수를 호출하면,  B 함수는 실행되지만,  제어권은 A 함수가 그대로 가지고 있습니다.

 

               2. A 함수는 계속 제어권을 가지고 있기 때문에

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

 

 

 


 

Ⅱ. Synchronous(동기) & Asynchronous(비동기)


 

     ※ 동기와 비동기의 차이는 

호출되는 함수의 작업 완료 여부를 신경쓰는지의 여부의 차이입니다.

 

 

         1) 동기(Synchronous)

               - 함수 A가 함수 B를 호출한 뒤,  함수 B의 리턴값을 계속 확인하면서 신경쓰는 것이 '동기' 입니다.

 

         2) 비동기(Asynchronous)

               - 함수 A가 함수 B를 호출한 때 콜백 함수를 함께 전달해서,

                      함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행합니다.

 

               - 함수 A는 함수 B를 호출한 후로,

                      함수 B의 작업 완료 여부에는 신경쓰지 않고 본인의 코드를 진행합니다.

 

 

 


 

Ⅲ. 블로킹/논블로킹 - 동기/비동기 비교.


 

 

      1) Sync - Blocking.

                :: '동기'를 '블로킹'처럼 실행하는 것.

 

           √ 함수 A는 함수 B의 리턴값을 필요로 합니다. ("동기")

           √ 제어권을 함수 B에게 넘겨주고,

              함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄때까지 기다립니다(블로킹)

 

* 블로킹인 동시에 동기

 

      2) Sync - NonBlocking.

                :: '동기'를  '논블로킹'처럼 작동시킬 수 있습니다.

 

 

       

           √ 함수 A는 함수 B를 호출합니다.

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

           √ A함수는 B함수의 리턴값이 필요하기 때문에,

                중간중간 B함수가 함수 실행을 완료했는지 체크합니다 (동기)

 

               * 논블로킹인 동시에 동기

 

 

 

      3) Async - NonBlocking.

           √ 함수 A는 함수 B를 호출합니다.

 

           √ 이 때 제어권을 B 함수에 주지 않고, A함수 자신이 계속 가지고 있습니다 (논블로킹)

 

           √ 그렇기에, B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행합니다.

 

           √ 또한 B 함수를 호출할 때 '콜백함수'를 함께 넘겨줍니다.

                B함수는 자신의 작업이 끝나면,  A 함수가 준 콜백 함수를 실행합니다. (비동기

 

 

      4) Async - Blocking.

           √ 흔하지 않은 케이스.

 

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

 

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

 

           √ 따라서, A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때까지 기다려야 합니다.