• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Java AIO 와 비동기 non-blocking
        2023년 11월 19일
        • starryeye
        • 작성자
        • 2023.11.19.:49
        반응형

        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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바