Java AIO 와 비동기 non-blocking

Java 2023. 11. 19. 02:49

Java AIO (NIO2) 에 대해 알아보겠다. 참고 라이브러리가 따로 있는건 아니고.. java.nio 를 공유하며.. 대신 사용되는 클래스이름이.. 앞에 "Asynchronous" 가 붙는다. 예시 ) AsynchronousServerSocketChannel 이전 상황 Java NIO, Selector, epoll(커널) 을 쓰게되면... 커널에서 애플리케이션으로 accept, read 등의 준비 완료 이벤트를 전달해주지 않고 애플리케이션에서 커널로 직접 주기적 확인이 필요했다. 즉.. busy-wait 가 발생하고 있는 것이다. (동기 non-blocking) Java AIO 에서는 이를 해결한다. Java AIO 동작 커널의 역할 I/O 작업이 커널에 전달되고, 커널은 이 작업을 비동기적으로 처..

Java NIO 의 Selector 와 epoll

Java 2023. 11. 19. 00:34

이전 포스팅에서 selector 를 알아봤는데... 결국 selector 는... 여러 이벤트를 하나의 스레드로 한꺼번에 확인할 수 있는 객체였다. (IO Multiplexing) 그러면 다시 busy-wait 관점에서 생각하자면.. selector 가 도입 되면서.. busy-wait 가 사라졌을까.. 아니다.. 사용자 코드에서는 사라졌지만, selector 가 사용자를 대신해서 준비 완료되었는지.. 확인하고 있는 것이다. 혹은... selector 로 좀더 편하게 준비 완료되었는지 확인하는 것이다.. 좀더 설명하자면.. selector 사용 전에는 accept, read (IO 호출)를 직접 호출(사용자 코드가 Caller 입장)하였지만.. 이제는 사용자 코드가 Callee 느낌으로.. selecto..

Article Thumbnail
Java NIO 의 Selector

Java 2023. 11. 17. 22:51

이전 포스팅에서 Java NIO 를 사용할 때 Java NIO 가 동기 non-blocking 방식이라 busy-wait 이 발생하였다. busy-wait 에 대해 잠시 복습하고 진행하겠다. busy-wait 은 동기 non-blocking 구조에서 자주 보이는 현상으로.. non-blocking 이라 caller 는 callee 작업으로 부터 자유로운데 동기 방식이라 callee 의 작업이 끝났는지(결과를 받을 수 있는지) 주기적 확인이 필요한 상황이다. 그래서.. 주기를 늘리면 실시간성이 떨어지게 되고.. 주기를 좁히면 그만큼 blocking 과 다를 바가 없고 CPU 자원이 낭비 되는 것이다. 문제는 서버에서는 여러 이벤트를 동시에 다루고 여러 요청을 다룰 수 있어야한다. 위와 같은 방식에서는 ac..

Java NIO 와 동기 non-blocking + CPU 자원

Java 2023. 11. 15. 23:37

Java NIO (new IO) 를 이용한 Server - Client 의 동작을 동기 / 비동기, blocking / non-blocking 관점에서 알아보겠다. 참고로 java.nio 패키지에 존재하는 selector 는 다음 포스팅에서 다루겠다. Java IO 와 다르게 Java NIO 는 non-blocking 하게 동작할 수 있는 옵션이 존재한다. -> ServerSocketChannel::configureBlocking 메서드를 호출해주고 파라미터 값으로 false 를 전달한다. 해당 옵션을 사용하면, accept 와 read 에서 blocking 되지 않고 바로 넘어간다. 각각 null, 0 을 리턴해버린다. accept 의 예시 코드를 보며 계속 하겠다. 즉, non-blocking mod..

Article Thumbnail
Java IO 와 동기 blocking + CPU 자원

Java 2023. 11. 15. 21:14

이번 포스팅에서는 Java IO 를 이용한 Server - Client 의 동작에서 동기 / 비동기, blocking / non-blocking 관점과 CPU 자원 소모를 알아보겠다. server side accept 서버를 구동하면 blocking 되는 첫번째 포인트이다. 클라이언트에서 연결 요청이 올때까지 blocking 된다. read 클라이언트에서 요청 데이터를 보내서 서버 버퍼에 도착할 때까지 blocking 된다. write 서버에서 클라이언트로 보낼 응답 데이터를 서버 OS 네트워크 버퍼에 적재를 완료할 때까지 blocking 된다. -> accept, read 와 다르게 클라이언트의 시그널을 기다리는 것은 아니다. client side connect 클라이언트가 서버에 연결될 때까지 blo..

Article Thumbnail
Java 16 주요 변경점

Java 2023. 5. 20. 01:41

JDK 16 1. Stream 클래스에 메서드 추가 toList() 스트림의 요소들을 순서대로 List 에 담아 반환한다. Java 16 이전에는 collect(Collectors.toList()) 를 사용했지만, 좀더 간결하게 표현 가능해졌다. mapMulti() mapMulti() 를 알아보는 김에.. map(), flatMap(), multiMap() 를 알아보겠다. (map, flatMap 은 Java 8) map() 스트림 내부의 요소 하나하나에 접근해서... 파라미터로 넣어준 함수를 실행한 뒤 최종연산에서 지정한 형식으로 반환해주는 메서드이다. flatMap() 스트림 내부의 각 요소를 한번 더 또다른 스트림으로 변환하고, 이렇게 생성된 모든 스트림을 하나의 스트림으로 결합한다. (중첩된 데이..

Article Thumbnail