개발/개발노트

Blocking, Non-blocking & Synchronous, Asynchronous 차이점

Gamii 2023. 4. 5. 22:35
728x90

1. Blocking, Non-blocking

    - Blocking과 Non-blocking는 요청을 받은 쪽에서 처리가 끝나기 전에 제어권을 넘기는지, 안넘기는지에 중점을 둔다.

    - Blocking(블로킹)은 단어 뜻 그대로 막히거나, 제한된, 대기하는 상태를 얘기한다.

    - A 함수가 B 함수를 호출을 했을 때, B 함수가 자신의 할 일이 끝나기 전까지 A 함수에게 제어권을 주지 않으면 Block.

    - A 함수가 B 함수를 호출 할 때, B 함수가 자신의 할 일이 끝나지 않았어도, 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 진행할 수 있도록 해주면 Non-block.

 

 

 

 

 

2. Synchronous, Asynchronous

    - Synchronous과 Asynchronous는 동시에 발생한 (두 개 이상) 이벤트에서 요청한 순서가 지켜지는지, 안지켜지는지에 중점을 둔다.

    -  A 함수가 B 함수 호출시, B 함수의 결과를 A 함수가 처리하면 Synchronous(동기).

      (수행한 작업을 A함수와 B함수 둘 다 신경써야하는 경우 -> 동기)

    -  A 함수가 B 함수 호출시, B 함수의 결과를 B 함수가 처리하면 Asynchronous(비동기).

      (수행한 작업을 B 함수(호출된 함수)만 신경쓰고 처리하는 경우 -> 비동기)

 

 

 

 

 

3. Blocking, Non-blocking & Synchronous, Asynchronous 조합 (4 가지)

 

참고) 파란색 화살표 - A 함수, 초록색 화살표 - B 함수

 

 

출처:http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

 

1) Sync + Blocking

    - A 함수가 B 함수를 호출 후 A 함수는 다른 작업을 하지 못하면서(Blocking), 그 결과를 반환 받아서 다음 작업을 진행한다(Sync).

    - 일반적인 동기 함수의 동작 방식이다.

    - 예시) Java의 scanner, 파일 등의 I/O 작업, 동기 함수에서 다른 동기 함수 호출

 

 

2) Async + Non-Blocking

    - A 함수가 B 함수를 호출 후 A 함수는 B 함수에게 callback 함수를 전달한 후 다른 작업을 진행하고(Non-Blocking), B 함수의 작업 결과에 상관 없이 A 함수는 다음 작업을 진행한다(Async). 그리고 B 함수는 작업을 완료되면 전달 받은 callback 함수를 실행한다.

    - 일반적인 비동기 함수의 동작 방식이다.

    - 성능과 자원의 효율적 사용 관점에서 가장 유리한 모델이다.

    - 예시) 자바스크립트 API 요청(ajax, fetch), async 방식의 파일 I/O

 

 

 

출처:http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

3) Sync + Non-blocking

    - A 함수가 B 함수를 호출 후 B 함수는 바로 제어권을 돌려줘서(Non-blocking), A 함수는 다른 작업을 진행할 수 있다. 

    - 그러나, B 함수의 종료 처리를 A 함수에서 해야 해서, B 함수가 언제 끝나는지 계속 확인해야 한다.(Sync)

    - 예시) 폴링(polling), 정보를 가지고 올 때까지 프로그래스바 표출

 

 

출처:http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

 

 

4) Async + Blocking

    - A 함수가 B 함수를 호출 후 A 함수는 다른 작업을 못하고 대기하지만(Blocking), B 함수에서 처리해 A 함수와는 관련이 없다(Async). 

    - 예시) Node.js + MySQL(쿼리 자체는 비동기로 동작하지만 DB에 접근할 때 드라이버를 호출하는 과정은 동기 방식으로 동작)

 

 

 

    ** 이 개념은 비효율적으로 보이지만, 다음과 같은 이유에서 등장했다.

       1. Sync+Blocking I/O의 경우 직관적이나, 여러 개의 I/O를 동시에 처리할 수 없다.

 

       2. Non-Blocking I/O는 프로세스들의 작업을 컨트롤하는 것이 까다롭다.

 

       3. 그렇다고 Sync+Blocking I/O와 멀티 프로세싱이나 쓰레딩을 결합해서 사용하자니, 자원 문제도 있고 프로세스 및 스레드 간 통신이나 동기화가 힘들다.

 

      ---> 따라서 직관적인 코드의 흐름을 유지하면서 작업을 병렬적으로 처리하기 위해 Linux/UnixS OS의 I/O 다중화 모델 등에서 사용된다.

   

 

 

 

 

 

 

 

Reference)

http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

Blocking-NonBlocking-Synchronous-Asynchronous

꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면

homoefficio.github.io

https://cotak.tistory.com/136

 

[운영체제] 동기와 비동기, 블로킹과 논블로킹

동기(Synchronous)와 비동기(Asynchronous) 동기/비동기는 주로 어플리케이션에서 자주 다뤄지는 개념이며, 다음 작업이 요청되는 시간과 관련되어 있다. 동기(Synchronous) 현재 작업의 응답이 끝남과 동

cotak.tistory.com