• 티스토리 홈
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 NIO 의 Selector
        2023년 11월 17일
        • starryeye
        • 작성자
        • 2023.11.17.:51
        반응형

        이전 포스팅에서 Java NIO 를 사용할 때

        Java NIO 가 동기 non-blocking 방식이라

        busy-wait 이 발생하였다.

         

        busy-wait 에 대해 잠시 복습하고 진행하겠다.

        busy-wait 은 동기 non-blocking 구조에서 자주 보이는 현상으로..

        non-blocking 이라 caller 는 callee 작업으로 부터 자유로운데

        동기 방식이라 callee 의 작업이 끝났는지(결과를 받을 수 있는지)

        주기적 확인이 필요한 상황이다.

         

        그래서..

        주기를 늘리면 실시간성이 떨어지게 되고..

        주기를 좁히면 그만큼 blocking 과 다를 바가 없고 CPU 자원이 낭비 되는 것이다.

         

        문제는 서버에서는 여러 이벤트를 동시에 다루고 여러 요청을 다룰 수 있어야한다.

        위와 같은 방식에서는 accept, read 등의 이벤트를 여러개의 스레드가 확인 해야한다면

        그만큼 스레드 낭비가 발생한다. 어느 하나의 스레드가 모든 이벤트를 추적(준비 완료 확인)할 수 있으면

        효율적으로 될 수 있을 것 같다.

         

        이를 해결하는 것이 바로 Java NIO 의 Selector 이다.

         

        Selector 의 IO Multiplexing

        Java NIO 를 사용하면서, Selector 를 사용하지 않을 때...

        busy-wait 이 발생하는 메서드는 accept, read 가 있었다.

        이러한 메서드들을 호출 해놓고 Selector 가 주기적으로 확인하면서

        accept, read 등 이 준비 완료(각 connection 완료, read 준비 완료) 되면

        해당 준비 완료 이벤트를 처리하는 EventHandler 를 호출할 수 있다.

        한마디로, 여러 채널으로 전달되는 이벤트를 Selector 가 모아서 처리할 수 있다.

        머리를 좀 굴려보면 EventHandler 의 역할은 Selector 가 없는 상황(busy-wait)에서 사용하지 못한.. callback 동작이다.

         

        참고,

        동기 코드라는 것은 결국 callback 을 사용할 수 없는 상황이라는 뜻

        busy-wait 은 callback 을 사용하지 못해서 생기는 현상인 것..

         

        참고,

        코드는..

        어떤 채널(ServerSocketChannel, SocketChannel) 에

        특정 작업(accept, read) 과 해당 작업이 완료되면 발생되는 이벤트를 받을 selector 를 등록할 수 있도록 작성이 된다.

        -> 채널.register(selector, 작업)

         

        참고,

        이쯤에서 알 수 있는 것이..

        Selector 때문에, Java NIO 는 Java IO 와 다르게

        소켓에 Channel 이라는 이름이 추가되었다고 생각해 볼 수 있다.

         

        반응형

        'Java' 카테고리의 다른 글

        Java AIO 와 비동기 non-blocking  (0) 2023.11.19
        Java NIO 의 Selector 와 epoll  (0) 2023.11.19
        Java NIO 와 동기 non-blocking + CPU 자원  (0) 2023.11.15
        Java IO 와 동기 blocking + CPU 자원  (0) 2023.11.15
        Java 16 주요 변경점  (0) 2023.05.20
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바