'블로킹/논블로킹', '동기/비동기'에 대한 이해

개요

블로킹/논블로킹, 동기/비동기 키워드는 주로 멀티태스킹 작업이 잦은 컴퓨터 시스템에서 주로 사용하는 키워드이다. 한 컴퓨터 시스템에 두가지 이상의 프로그램이 동시에 작동하고 있을 경우, 그 프로그램들이 한정된 하드웨어 리소스를 서로 충돌 없이 이용할 수 있어야 한다. 이 문제는 특히 여러가지 프로그램들이 동시에 입/출력 장치, 기억장치, 네트워크 장치 등을 이용코자 접근할 때, 혹은 여러 작업을 순차적으로 진행할 지, 동시에 진행할지를 두고 고민해야만 할 때 이 문제는 극에 달한다.

Vert.x에서 내세우고 있는 이벤트 루프[Event Loop, ELP] 모델은 이 문제를 해결하기 위해 나온 모델 중 하나이므로 이 키워드에 대해 정확히 알아둘 필요가 있다. 더욱이, 타 언어나 도구/프레임워크 진영에서도 시간이 흐를 수록 프로그램의 성능 개량 이슈와 얽혀 뜨겁게 논의되는 키워드이기 때문에 개발자라면 필수적으로 알아야만 하는 상식이라 할 수 있다.

각 용어별 설명

  • 블로킹(Blocking, 타 작업 수행 차단)

    특정 작업이 실행 요청을 받아 실제로 수행되는 동안, 다른 작업은 작업을 진행하지 못하고 대기해야만 하는 방식을 말한다. 작업이 순차적으로 이루어지기에 작업 흐름을 쉽게 이해할 수 있는 장점은 있지만, 블로킹이 이루어지는 동안은 하드웨어 리소스를 효율적으로 이용하지 못하는 단점이 존재한다. 특히 블로킹이 일어나는 작업이 오래 걸리는 작업일 경우 이 단점은 더욱 두드러진다.

  • 논 블로킹(Non Blocking, 타 작업 수행 허용)

    특정 작업이 이미 수행중이라 할 지라도, 그것과는 상관이 없이 바로 다른 작업을 수행 시키는 것이 가능한 방식을 말한다. 리소스가 낭비되는 시간이 없기에, 하드웨어 리소스를 균일하고 효율적으로 이용할 수 있으나, 업무흐름이 매우 복잡해지는 단점이 존재한다.

  • 동기(Synchronous, 동일 상태 보장 )

    특정 작업을 요청하면, 그 즉시 바로작업의 완료여부와 처리결과를 확인할 수 있는 형태를 말한다. 요청한 작업의 완료여부와 결과를 바로 알 수 있다는 장점이 있다. 그러나, 요청한 작업의 완료여부와 작업결과를 반환받는 데 필요한 시간이 긴 경우 문제가 발생할 수 있다.

    • 해당 작업이 완료되어 결과가 반환될 때 까지 무조건 기다려야만 하기 때문이다. 이 경우 후행 작업의 수행가능 시점도 그에 비례하여 늦어지게 되므로, 짧은 시간에 다량의 작업을 요청해야 할 경우에 주의가 필요하다.
  • 비동기(Asynchronous, 동일 상태 비보장)

    특정 작업을 요청한 즉시 바로 그 작업의 완료여부와 작업 결과를 바로 확인할 수 없는 방식이다. 요청한 작업의 완료여부와 반환값은 콜백(Callback) 이란 것을 통하여 전달받을 수 있다. 이 콜백이 실행되는 시점은 각 작업별로 천차만별이다.

    이 방식의 장점은, 이미 요청한 작업의 결과를 기다리고 있을 필요 없이 바로 다음 작업을 요청할 수 있기에, 작업 처리 효율이 높아질 수 있다.

    다만 특정 작업의 경우, 선행 작업의 결과값을 이어받아 순차적으로 작업을 진행해야 할 수 있다. 이런 작업을 비동기 작업으로 구현할 경우 프로그램이 복잡해질 수 있으므로 주의를 요한다.

같은 방식을 다른 이름으로 부르는 것이 아닌가?

각 용어별 설명을 훓어보면 동기와 블로킹, 논블로킹과 비동기는 비슷하게 동작하는 것으로 보이며, 이것을 왜 다른 용어로 불러야 하는지에 대해 의문이 들 수 있다. 더러는 블로킹과 동기, 논블로킹과 비동기 키워드를 같은 것으로 설명하는 경우도 있다.

결론을 미리 말하자면, 상기한 시각은 매우 잘못된 시각이다. IBM DeveloperWorks에서 공개한 리눅스 관련 기술 문서에 따르면, 동기 - 논블로킹 특성을 동시에 가지는 작업이 있고, 비동기-블로킹 특성을 동시에 가지는 작업이 존재한다고 밝히기 때문이다.12 상기 시각이 올바른 것이라면 이 설명은 논리적으로 성립할 수 없는 것이다. 이상하지 않는가?

진정한 차이 : 데이터 vs 행위

그럼 도대체 다른 것이 무엇인가? 하는 의문이 들 것이다. 사실은 작업 특성 그 자체에 차이점이 있는 것이 아니다. 진정한 차이점은 각 키워드가 바라보는 관심사의 차이라고 할 수 있다.

  • 동기/비동기 : 각 작업이 주고받는 데이터의 상태와 흐름을 어떻게 제어할 것인가. 데이터의 일관성 유지

  • 블로킹/논블로킹 : 각 작업의 수행 형태와 우선순위에 따라 각 작업의 수행가능 시기를 어떻게 제어할 것인가.

    • 주 관심사 : 특정 작업의 행위가 일어나는 시점 관리

즉, 데이터의 흐름 제어와 작업 수행 시기를 제어하는 것은 별개이기 때문에, 논블로킹 작업을 하던 도중에도 공유 데이터의 일관성 유지를 위해 동기식 작업이 간혹 발생할 수 있으며, 비동기 작업을 하는 도중에도 간혹 블로킹이 일어날 수 있는 것이다.

Vert.x로 개발시 명심해야 하는 것 [결론]

이 문서를 끝까지 읽으신 분이라면 동기와 비동기, 블로킹과 논블로킹의 장단점은 명확하며, 각 방법을 이분법으로 갈라 절대 악으로 비판하거나, 혹은 모든것을 해결해 줄 구세주로 무작정 치켜세울 문제는 아니라는 것을 깨닫았을 것이다.

다만 Vert.x가 추구한 모델은 비동기/논블로킹 기반의 이벤트 루프이기 때문에, 이 모델로 작업을 처리할 때, 이 모델에 적합한 방법을 고민해야 할 뿐이다. 선/악 논쟁이 아닌 실용을 추구해야 하는 것이다.

1. IBM developerWorks, "Boost application performance using asynchronous I/O" 참조
2. 1번 자료의 한국어 요약정리본을 보고싶다면 빨간색 코딩님의 블로그 글 "IO모델 (동기vs비동기vs블로킹vs논블로킹)" 참조.

results matching ""

    No results matching ""