Java AIO 와 비동기 non-blocking

Java AIO (NIO2) 에 대해 알아보겠다.

 

참고

라이브러리가 따로 있는건 아니고..

java.nio 를 공유하며..

대신 사용되는 클래스이름이..

앞에 "Asynchronous" 가 붙는다.

예시 ) AsynchronousServerSocketChannel

 

이전 상황

Java NIO, Selector, epoll(커널) 을 쓰게되면...

커널에서 애플리케이션으로 accept, read 등의 준비 완료 이벤트를 전달해주지 않고

애플리케이션에서 커널로 직접 주기적 확인이 필요했다.

즉.. busy-wait 가 발생하고 있는 것이다. (동기 non-blocking)

 

Java AIO 에서는 이를 해결한다.

 

 

Java AIO 동작

커널의 역할

I/O 작업이 커널에 전달되고, 커널은 이 작업을 비동기적으로 처리한다.

작업이 완료되면, 커널은 이를 감지한다.

 

커널에서 애플리케이션으로 알림

커널은 애플리케이션에게  작업 완료(준비 완료 이벤트)를 알릴 수 있다.

일반적으로 커널의 비동기 I/O 구조를 활용한다. (운영 체제에 따라 다를 수 있다.)

 

작업 등록

Java AIO 에서는 I/O 작업을 시작할 때 콜백 함수를 등록하거나 Future 객체를 사용한다.

 

콜백 실행

커널로부터의 알림을 받은 Java AIO 프레임워크는 등록된 callback 함수를 호출하거나

Future 객체의 상태를 업데이트하여 작업 완료를 애플리케이션에 전달한다.

 

 

정리

Java AIO 에서는..

IO 작업 완료(준비 완료 이벤트) 알림은 커널의 내부적인 비동기 I/O 메커니즘을 통해 이루어진다. 

이는 epoll과 같은 기존 I/O 멀티플렉싱 방식과는 다른 접근 방식을 사용하는 것이다.

대신, Java AIO 에서는 운영 체제의 epoll 방식보다 더 저수준의 비동기 I/O 기능을 활용한다.

 

쉽게 정리

Java AIO 에서는..

사용자 공간에서 accept, read 를 직접 호출하면 되는데..

리턴 값으로 Future 을 받거나 메서드 파라미터로 callback(CompletionHandler) 을 등록할 수 있다.

-> 즉, 호출하고 바로 리턴된다. (non-blocking)

AIO 내부와 커널을 보면..

accept, read 의 준비 완료 이벤트를 커널이

애플리케이션(AIO 객체, AsynchronousServerSocketChannel 등)으로 알리고

해당 AIO 객체는 등록된 callback 을 실행하거나 Future 의 상태를 업데이트 하게 된다.

-> 즉, 콜백을 등록하므로 비동기 이다.

 

참고

AIO 이전에서는 IO 작업 완료(준비 완료 이벤트) 를

애플리케이션에서 커널로 직접 확인 해야했지만..

AIO 에서는 커널에서 애플리케이션으로 알려준다.

 

참고

커널에서 애플리케이션으로 IO 작업 완료를 알려주기 때문에..

왠지 커널 스레드가 callback 을 수행해야하는게 아닌가.. 라고 생각할 수 있다.

하지만, 알림은 커널스레드에 의해 AIO 내부 라이브러리에서 받지만

AIO 가 관리하는 스레드 풀로.. 미리 등록 해놓은 callback 을 수행한다.

(AIO 를 사용하는 코드는 템플릿 콜백 패턴을 사용하게 된다.)

즉, 멀티 스레딩을 사용한다.

(AIO 에서 알림을 받고 스레드 풀을 관리하는 클래스는 AsynchrousChannelGroup 이다.)

 

'Java' 카테고리의 다른 글

Java NIO 의 Selector 와 epoll  (0) 2023.11.19
Java NIO 의 Selector  (0) 2023.11.17
Java NIO 와 동기 non-blocking + CPU 자원  (0) 2023.11.15
Java IO 와 동기 blocking + CPU 자원  (0) 2023.11.15
Java 16 주요 변경점  (0) 2023.05.20