본문 바로가기

프로그래밍/Java

Non-Blocking,Blocking VS Async,Sync

반응형

NonBlocking Blocking VS Async Sync

날짜: 2021년 6월 18일

학습목표

지난주 멘토링시간때 Nonblocking, Blocking은 I/O와 관련된 것이고, Sync, Async는 쓰레드와 관려된 것으로 피드백 받았다. 솔직히 모르겠다... 그저 제어권과 결과에대한 처리를 누가? 하는가에 대해서만 알고있었는데, 왜 I/O와 관련있고, 쓰레드와 관련있는지 알아보자.

NonBlockingI/O, Blocking I/O

NonBlocking,Blocking에 대해 알아보기 이전에, 먼저 이를 처리는 언제하는지 생가해보자.

컴퓨터는 아무 이유없이 I/O를 수행하지 않는다. 즉, 이런 I/O 작업에 대한 '요청'이 들어와야 수행한다. 즉 웹서비스에서는 클라이언트가 서버로 날리는 요청이 있을수 있고, UserApplication이 OS의 Kernel로 날리는 System Call등이 이런 요청이라 할수 있겠다.

이런 요청들은 CPU work와 I/O work로 나뉠수있다. IBM Developer 사이트에서는 다음과 같이 설명하고 있다.

I/O-bound versus CPU-bound processes
A process that is I/O bound is one that performs more I/O than processing.
A CPU-bound process does more processing than I/O.

즉 I/O를 더 많이 수행하는지, 프로세싱(CPU연산)을 더 많이 수행하는지에 따라 프로세스를 나눈다.

잘 생각해보자. 앞서 공부했던 Buffer때도 그렇지만, I/O작업이 일어나면 통상적으로 CPU는 기다려야한다. 아.무.것.도 안.하.면.서( → Busy Waiting현상) 말이다.

이렇게 I/O가 모든 작업을 마칠때까지 CPU가 기다리는 방식이 전통적인 Blocking I/O방식이다.

CPU가 제어권을 빼앗기는것이다. 이에 반해 Non-Blocking I/O는 I/O 작업이 끝날때까지 기다리지 않고, 다른 연산을 수행하는 방식이다. 즉 Busy-Waiting으로 인한 CPU자원의 낭비를 개선한 것이다.

추가적으로 Non-Blocking I/O는 해당 I/O작업에 대한 결과를 바로 받을수 있다. (에러가 났는지 실행중인지에 대한 현황을)

그럼 Sync, Async는??

그럼 Sync Async는 무엇일까?? Sync도 Blocking 처럼 특정 연산이 수행될때까지 기다려야 하고,

Async 마찬가지로 Non-Blocking 처럼 특정 연산의 결과를 기다리지 않고 작업을 수행한다.

뭐가 다른걸까?? 위에서 말했다 싶이, I/O작업과 CPU연산은 별개이다. I/O도 CPU처럼 컴퓨터의 자원인것이다. I/O 연산을 CPU가 처리해주는것으로 알고 바라보면 두 개념이 굉장히 햇갈릴 것이다. CPU와 I/O는 별개임을 기억하자.

Sync 와 Async는 CPU 연산을 어떻게 진행할지에 대한 방식이다. 즉 여기서 I/O는 없다.

순수하게 CPU연산을 한번에 하나의 프로세스(쓰레드)만 수행할것인지, ContextSwitching을 통해 여러개의 프로세스(쓰레드)를 동시에 처리하는 것 처럼 보이게 할것인지 에 대한 결정이다.

자바를 생각해보면, 별도의 쓰레드를 생성하지 않는이상, 메인쓰레드 하나만 수행된다. 즉, CPU연산을 메인쓰레드가 계속 점유하고있다. 이것이 Sync이다. 그래서 소스코드도 위부터 아래로 순차적으로 수행되는 것이다. 반면, 메인쓰레드 외에 쓰레드하나를 생성했다고 하자. 이때부터 CPU연산이 메인쓰레드와 신규생성된 쓰레드를 번갈아가면서(Context Switching) 할당된다. 그렇기 때문에, 연산에 대한 순서가 기존처럼 위에서 아래로 순차적이지 않고, 실행할때마다 달라지게 된다.

이때, 자바에선 이런 쓰레드들이 '힙'영역을 공유한다. 따라서 비동기적으로 작업이 수행될때, 이 쓰레드들이 힙 영역의 공통된 객체에 접근하게되면, 하나의 쓰레드가 연산을 수행 도중 Context Switching으로 다른 쓰레드가 연산을 수행할수 있고, 이렇게 되면 연산의 결과가 이상하게 나올수있다. 이런 문제를 동시성 문제라 하며, 공통된 자원에 한해서 Synchronized 블록 등을 선언해 해당 자원에 접근시, 해당 자원을 연산할때는 동기적으로 수행될수 있도록 하는 것이다.

추가적으로, Asynchronous는 Non-Blocking과 달리, 연산에 대한 결과가 오류가 나도 따로 알려주지 않는다.

예제와 그림들

위에서 말했던 개념들을 생각하며, IBM Developer에서 제공하는 그림들을 이해해보자.

  • Synchronous Blocking I/O

    https://developer.ibm.com/articles/l-async/

    Kernel과 Application은 I/O의 결과가 올때까지 Block 되어있다. 또한, 이 I/O의 결과를 받아야만 UserApplication이 이후의 작업을 수행할수 있다.(Sync)

  • Synchronous Non-Blocking I/O

    https://developer.ibm.com/articles/l-async/

    Non-Blocking I/O이기 때문에, 데이터가 완전히 읽히지 않았음에도, Application이 CPU연산을 행할수 있는 모습이 보인다. 단, Synchronous이기 때문에, 그저 작업이 다 완료되었는지 를 확인하는 연산만 수행할수 있는것이 보인다. 그리고 Non-Blocking 이기 때문에 작업완료에 대한 요청에 EAGAIN(오류나, 현재상태) 등의 결과를 바로 리턴하는 것을 볼 수있다. 이후, I/O의 작업이 완료된 이후에서야, 해당 결과를 받고 이후의 연산을 수행하는 것을 볼수있다.

  • Asynchronous Blocking I/O

    https://developer.ibm.com/articles/l-async/

    Blocking I/O 이기 때문에, Application이 I/O작업이 끝나기 전까지는 아무것도 하지 않고 기다리는 모습이 보인다(Block). 즉, Asynchronous 여도 I/O작업이 수행중이 동안은, 다른연산을 수행 할 수없다. I/O작업이 완료된 후, Kernel이 Application에 알려줘 Block 상태가 풀리게 되며, I/O 결과를 받기 이전까지 잠깐의 다른 연산을 수행하는 것을 볼수있다(Async). 이후 I/O 결과를 받고, 이에 대한 연산을 수행한다.

  • Asynchronous Non-Blocking I/O

    https://developer.ibm.com/articles/l-async/

    Non-Blocking I/O 이기 때문에 Application이 I/O 작업이 완료되지 않았음에도, 다른 연산을 수행(작업이 완료됬는지에 대한 확인 외)하는 것을 볼수있다. 즉 Asynchronouse 하게, I/O 작업의 결과와 무관하게 다른 연산을 수행한것이다. 이후, I/O작업이 완료된 후에 해당 작업 결과에 대한 연산도 처리해준다.

FeedBack

오늘 멘티분과 처음으로 스터디를 진행했다. 같은주제로 1시간 각자 공부한 후 대략 30분? 정도 서로가 이해한것과 이해가 가지않았던 것에 대해서 질문하고 고민해보는 시간을 가졌다. 결과는 굉장히 좋았다. 매일 공부하다가 딴짓을 엄청많이 했었는데, 구글 밋으로 만나서하고, 1시간 이후 공부결과를 발표하는 제약이 생기다 보니 집중력이 엄청 높아졌다. 또 서로가 이해한것을 말하면서 몰랐던 부분도 캐치하고, 또 머리로 이해한것을 입으로 말하면서 다시 정리가 되었다.

  • NonBlocking, Blocking
    • CPU연산과 I/O 연산이 함께 일어날때 CPU를 기다리게 할것인지, 다른 일을 시킬것인지
  • Sync, Async
    • CPU연산을 하나의 프로세스(쓰레드)가 점유할 것인지, Context Switching에 따라 여러 프로세스(쓰레드)가 CPU를 점유할 수있는지
  • 요청 은 CPU work, I/O work로 나눌수있다. I/O또한 CPU와 마찬가지로 컴퓨터의 자원이며, I/O작업은 CPU가 관여하지 않는다.

References

Boost application performance using asynchronous I/O

Asynchronous Vs Synchronous Programming

Non-blocking I/O and how Node uses it, in friendly terms

반응형

'프로그래밍 > Java' 카테고리의 다른 글

서블릿  (1) 2021.07.12
Spring VS Spring Boot 의 배포차이  (0) 2021.07.03
네트워크 통신(2)  (0) 2021.06.15
네트워크 통신(1)  (0) 2021.06.15
Buffer  (0) 2021.06.14