Chillog 차가운 블로그

Blocking/None-Blocking

Blocking/None-Blocking OS

 이전 ‘마이크로서비스 아키텍처 구축’ 책읽기 포스트의 후속스터디 포스트다. ReactiveX 관련 내용에 블로킹/논블로킹에 대한내용이 있었는데, 문장을 읽고 이해가 잘 가지않았는 내용이 있어 생각의 흐름을 포스트로 정리하게됐다 😇


Blocking / None-Blocking / Synchronous / Asynchronous

 우선 Blocking/None-Blocking, Sync/Async에 대한 내용을 짚고 넘어가자. 아마 CS전공이면 운영체제 수업에서 쓴 맛을 봤을법한 내용이다. 이해하기 어려운 축에 속하는 개념인데, 병렬프로그래밍에서 자주나오는 용어이니 숙지하도록하자. Blocking/None-Blocking과 Sync/Async는 제법 비슷하지만 별개의 개념임을 유의해야한다. Sync/Async는 콜의 작업완료여부, Blocking/None-Blocking은 콜의 제어권 반환시기를 중심으로 생각하며 구분지으면 이해하기 편하다.

[Blocking/None-Blocking]

  • Blocking: 콜 이후에 대기 큐에서 대기하면서 대상의 콜 작업이 끝난뒤 대상으로부터 제어권을 받아옴.
  • None-Blocking: 콜 직후에 응답수행여부와 관계없이 대상으로부터 데이터를 받아옴.

[Synchronous/Asynchronous]

  • Synchronous: 콜과 함께 콜의 작업을 수행하고 데이터를 받아옴.
  • Asychronous: 콜의 작업완료여부를 신경쓰지않고(데이터를 받아오지 않고) 제어권을 리턴받음.

정의를 곱씹다보면 아래 두 관계의 차이점에 대해 의문이 드는데, 특히 Blocking과 Synchronous 관계에 대해 이상함을 느낀다.

  • None-Blocking: 콜과 동시에 제어권을 리턴하되 대상으로부터 데이터를 받아옴.
  • Asychronous: 콜과 동시에 제어권을 리턴하되 대상으로부터 데이터를 받아오지않음.

  • Blocking: 콜과 동시에 대상으로부터 데이터를 받아올때까지 대기 큐에서 대기함.
  • Synchronous: 콜과 동시에 대상으로부터 데이터를 받아옴.

Blocking과 Synchronous의 내용은 스택오버플로우에 따르면 아래와 같다.

When we talk about method calls, then a synchronous call can also be said to be blocking, because the thread calling the method cannot proceed forward until the method returns.

 메소드 호출에 한해서는 Blocking과 Synchronous는 같다고 말할 수 있다. 메소드를 콜한 스레드가 해당 메소드가 끝날때까지 진행을 못하기 때문이다.

위 내용은 링크된 장표에 사전적으로 잘 설명 해주신 것을 참조하여 작성하였다. 도표까지 잘 정리해주셨다.
Sync async-blocking-nonblocking-io, Cheoloh Bae (NHN NEXT), 2015


I/O Model

아래는 IBM 아티클내용을 참조했다.

  • 동기-블로킹 I/O : 커널에서 응답이 올때까지 앱의 작업 중단함. 가장 간단한 형태.
  • 동기-논블로킹 I/O : 호출한뒤 앱의 작업을 중단시키지않으나, 다른 작업이 진행 중 일땐 중지함. 때문에 동기-블로킹과 비슷한 효율.
  • 비동기-블로킹 I/O : SELECT를 활용하는 I/O 방식
    SELECT는 이벤트별로 감시할 대상을 등록하고, 등록된 대상에 이벤트가 발생했을 경우 그걸 계속 확인하는 방식으로 동작함. (polling)
    자체적인 event loop를 통해 매번 상태가 변했는지 확인 한뒤 그에 따른 처리를 함.
  • 비동기-논블로킹 I/O (AIO) : 호출하고 작업을 중단시키지않으며, 다른 작업이 진행되어도 중지하지않음.

후속포스트로 Rx관련 포스팅을 진행할 예정이다.


참조


2022 ⓒ ChillyMind