Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

장미정원

[CS] sync, async, blocking, non-blocking 본문

CS

[CS] sync, async, blocking, non-blocking

신희성 2024. 10. 15. 21:16

 

들어가며

동기, 비동기, 블로킹, 논블로킹이라는 용어는 한 번쯤 들어봤거나 개념에 대해 조금은 알고 있을 것이라 생각됩니다. 순서대로 처리하는 것이 동기.. 그 반대가 비동기.. 작업 흐름이 끊기는 것이 블로킹.. 제어권.. 이렇게 머리속에 키워드만 생각나고 정확한 정의가 헷갈리며 개발을 할때 자주 등장하는 개념과 용어이기 때문에 정확히 정리해보는 시간을 가지려 합니다.

 

동기와 비동기 Synchronous, Asynchronous

동기의 영단어의 어원은 Synchronous의 Syn은 '함께', chrono는 '시간'이라는 뜻입니다. 즉 함께 시간을 맞춰서 실행한다. 정도로 해석할 수 있습니다. 함께 시간을 맞춰서 실행한다는 말은 요청한 작업이 끝나야 남은 작업을 이어나간다라고 생각할 수 있습니다. 즉 작업들이 순차적으로 실행된다는 말입니다.

 

비동기의 Asynchronous는 동기의 영단어 앞에 A라는 부정 접두사가 붙는 형태로 동기와 반대로 요청한 작업의 끝남 여부와 관계 없이 실행하는 것입니다. 비동기라면 요청한 작업을 기다리지 않고 여러 작업들을 병렬적으로 실행할 수 있습니다.

 

동기

요청한 작업이 끝날 때 까지 기다리고 남은 작업을 실행하는 것을 동기적인 실행이라고 부릅니다. 함수를 실행한다고 가정했을 때 동기적으로 동작한다면 해당 함수의 결과값 반환이 될 때 까지 기다렸다가 값을 받고 남은 작업을 순차적으로 실행합니다.

 

 

동기적인 실행은 요청한 작업이 끝날 때까지 기다리기 때문에 요청이 많아지거나 응답시간이 오래 걸린다면 성능이 아주 나빠집니다. 하지만 요청한 작업의 값과 값이 다음 작업을 진행할 때 꼭 필요한 상황이라던가 작업들의 실행 순서가 보장 되어야 할 때는 동기적으로 작업이 실행되어야 합니다.

 

예를 들어 A 작업 후 반환 값을 받아 B 작업 실행, 그 후 C 작업을 실행 해야한다면 A,B,C 작업들에 대한 실행 순서 보장이 필요합니다. 이러한 상황에는 동기적인 실행이 중요한 역할을 합니다.

 

하지만 동기적인 실행은 요청한 작업이 끝나기를 기다리기 때문에 응답이 오래 걸리는 작업이 많아진다면 병목 현상을 일으켜 서비스의 성능을 악화시킬 수도 있습니다.

 

비동기

비동기 실행은 요청한 작업의 끝남 여부와 관계 없이 남은 작업을 실행하는 것을 비동기적인 실행이라고 합니다. 비동기 실행은 요청한 작업의 끝남 여부를 신경쓰지 않기 때문에 여러 작업들을 병렬적으로 실행하여 성능을 향상 시킬 수 있습니다. 특히 비동기 방식을 사용하면서 응답시간이 오래 걸리는 작업들을 기다리지 않고 여러 작업들을 병렬적으로 실행할 수 있기 때문에 애플리케이션의 성능을 향상시킬 수 있습니다.

 

 

비동기 방식은 각 작업들에 대해 의존도가 많이 낮을 때 사용하면 좋은 방법입니다. 예를 들어 A 작업 중에 B,C,D 작업을 요청하였는데 요청한 작업들의 완료 여부를 A가 알 필요가 없다면, 즉 작업들의 순서 보장이 필요 없다면 비동기 방식을 사용해서 병렬적으로 실행하여 성능을 향상시킬 수 있습니다.

 

블로킹과 논블로킹 Blocking, non-Blocking

블로킹과 논블로킹 방식의 차이점은 다른 함수를 호출 했을 때 호출한 현재 코드를 block할건지 계속 진행할건지에 대한 차이입니다. 동기,비동기가 순차적인 작업의 흐름이라면 블로킹,논브로킹은 작업의 흐름을 막냐 안막냐에 대한 차이입니다.

 

블로킹과 논블로킹의 개념을 이해할 때 제어권이라는 용어가 등장합니다. 말 그대로 실행에 대한 주도권입니다. 블로킹과 논블로킹은 호출된 함수(callee)가 호출한 함수(caller)에게 제어권을 바로 넘겨주냐 안넘겨주냐로 구분할 수 있습니다.

 

블로킹 Blocking

블로킹 방식은 callee가 caller에게 제어권을 함수가 종료된 후 넘겨주게 됩니다.

 

 

A가 B함수를 호출할때 제어권을 넘겨 B함수를 실행합니다. B함수가 실행될 동안 A는 제어권이 없기 때문에 멈춰 있습니다. (block) 그 후 B함수 실행이 끝났다면 호출한 쪽인 A에게 다시 제어권을 넘깁니다. 제어권을 받은 A는 실행을 이어나갑니다.

 

논블로킹 non-Blocking

논블로킹 방식은 callee가 caller에게 함수 종료 여부와 관계 없이 제어권을 바로 넘겨주는 것입니다.

 

A가 B함수를 호출할때 제어권을 넘겨 B함수를 실행합니다. B함수는 받은 제어권을 바로 호출한 쪽인 A에게 넘겨주고 B함수를 실행합니다. A는 제어권이 있기 때문에 A작업을 이어갑니다.

 

sync, async, blocking, non-blocking 조합

동기, 비동기, 블로킹, 논블로킹의 조합으로 프로그래밍이 가능합니다. 4가지의 조합과 활용 예시에 대해 알아보겠습니다. 

 

sync + blocking

동기 + 블로킹 조합입니다. 메서드를 호출하면 호출된 메서드에 제어권을 넘겨 메서드를 실행합니다. 메서드가 끝나면 해당 메서드를 호출한 쪽에 제거권을 넘겨줍니다. 꽤 흔하게 볼 수 있는 활용입니다.

 

일반적으로 자바에서 Scanner로 입력을 받는 상황을 예로 들 수 있습니다. 입력이 종료될 때 까지 작동이 멈추며 입력이 완료된 후 남은 작업을 이어갑니다.

 

 

sync + non-blocking

동기 + 논블로킹 조합입니다. 메서드를 호출하면 제어권을 바로 호출한 쪽으로 넘겨 호출쪽의 작업이 블로킹 되지 않습니다. 하지만 호출한 함수가 끝날 때 까지(결과값을 return할 때 까지) 주기적으로 확인하고 메서드가 끝났다면 결과값을 가지고 다음 작업을 이어갑니다.

 

게임 로딩 화면을 예시 상황으로 생각해볼 수 있습니다. 게임 로딩이 끝난 후 게임을 시작할 수 있지만 로딩 진행도를 화면에 표시해줘야 하기 때문에 작업이 블로킹 되면 안됩니다. 그렇기 때문에 동기 + 논블로킹 조합을 응용할 수 있습니다.

 

 

async + blocking

비동기 + 블로킹 조합입니다. 메서드를 호출 했을 때 호출한 메서드의 끝남 여부를 신경쓰지 않지만 해당 메서드가 끝날 때 까지 기존 작업을 블로킹합니다(제어권을 넘겨버립니다).

 

보통 해당 조합은 의도하는 경우가 없으며 비동기 + 논블로킹 조합에서 실수로 블로킹 작업이 들어가 성능이 저하되는 케이스 중 하나입니다. (ex. web flux에서 JPA를 사용하는 경우)

 

async + non-blocking

비동기 + 논블로킹 조합입니다. 메서드를 호출 했을때 바로 제어권을 넘겨받아 작업을 이어나갑니다. 호출한 메서드의 끝남 여부를 신경쓰지 않고 기존 작업이 블로킹되지 않아 기존 작업을 진행하다가 메서드의 결과값이 도착했을때 결과값을 가지고 작업을 진행 할 수도 있습니다.

 

일반적으로 스프링 MVC는 블로킹 방식이며 사용하는 톰캣 WAS는 request per thread로 요청당 하나의 스레드를 스레드 풀에서 할당하는 방식입니다. 자바 NIO에서 비동기적 요청을 지원하더라도 스프링 디스패처 서블릿에서 Im/OutStream의 Blocking한 동작과 Filter에 대한 동작이 MVC에서는 Blocking하게 동작합니다.

 

그래서 async + non-blocking 동작을 하는 서버를 구축하기 위해 스프링 웹플럭스가 등장하여 네티 WAS, 이벤트루프 등의 기술로 리액티브한 서버 애플리케이션 개발이 가능해졌습니다. 웹 플럭스는 적은 수의 스레드(약 core * 2)로 다수의 요청을 받을 수 있기 때문에 스레드간 컨텍스트 스위칭 비용도 적게 들어 CPU 자원을 효율적으로 사용할 수 있게 도와줍니다.

 

비동기와 논블로킹 조합을 잘 사용한다면 성능을 크게 향상시킬 수 있습니다.

'CS' 카테고리의 다른 글

[OS] 프로세스와 스레드  (5) 2024.08.07
[OS] 동기화을 위한 뮤텍스와 세마포어  (0) 2024.07.10