시냅스

Java NIO 의 작동 원리 본문

Java, Spring

Java NIO 의 작동 원리

ted k 2023. 4. 4. 01:27

https://liltdevs.tistory.com/100

 

입출력 시스템, I/O System

입출력 시스템, I/O System Web, File 수정, Youtube 시청, game 등 컴퓨터는 입출력 작업을 주로 한다. PCI 버스로 모든 Device 와 연결한다. 메모리 맵드 입출력 Memory-mapped I/O 모든 컨트롤러는 레지스터(제어

liltdevs.tistory.com

위의 글을 참고하시면 도움이 될 수 있습니다.

 

Java NIO 는 기존 IO 가 갖고 있는 문제점들을 해결하기에 나온 패키지입니다.

기존 IO 에서의 불필요한 과정이나, Thread block 을 해결하기 위함입니다.

아래에서 기존 IO 의 동작 원리를 살펴보며 어떤 것을 해결하였는지 알아보겠습니다.

 

 

Java IO 동작 원리

  1. 파일의 경로와 이름 등의 메타데이터를 포함한 InputStream 및 OutputStream 객체를 생성합니다.
  2. InputStream 및 OutputStream 객체를 사용하여 read(), write() 등의 메서드를 호출합니다. 이 메서드들은 JVM을 통해 해당 플랫폼의 운영 체제와 상호 작용합니다.
  3. JVM은 운영 체제의 파일 시스템 API를 사용하여 파일에 대한 실제 읽기 및 쓰기 작업을 수행합니다. 이 때, 운영 체제는 해당 파일을 찾아 디스크에서 읽기 작업을 수행하거나, 쓰기 작업을 수행하여 디스크에 데이터를 저장합니다.
  4. 운영 체제는 파일로부터 읽은 데이터를 커널의 버퍼에 저장한 뒤 JVM의 사용자 공간 버퍼로 복사하거나, 사용자 공간 버퍼의 데이터를 파일 시스템으로 전달합니다.
    • 이 과정이 대체로 Thread 를 block 시킵니다.
    • 또한 아래에서 살펴보는 NIO 에서는 이러한 과정이 필요하지 않습니다.

 

이러한 IO 프로세스는 작업을 요청한 스레드를 Block 시키며 idle time 을 증가시킵니다.

하여 NIO 를 사용하여 문제를 개선할 수 있습니다.

 

Java NIO (New I/O, Non-blocking I/O)

  1. Channel 은 파일이나 소켓과 같은 I/O 연상 대상과 연결되어 있는, 데이터가 읽고 쓰이는 통로입니다.
    • 실제로 read, write 를 수행하는 주체입니다.
  2. Buffer 는 데이터를 저장하고 읽고 쓰는데 사용됩니다. NIO 의 모든 데이터는 버퍼를 통해 처리되며 채널과 버퍼 간 데이터 이동이 발생합니다.
    • Memory Mapped I/O 로도 구현할 수 있습니다.
      • 버퍼는 커널에 의해 관리되는 시스템 메모리에 직접 접근할 수 있습니다.
      • 파일시스템의 페이지로 당시에 필요한 부분만 Memory Mapped Space 에 저장되어 있습니다.
      • 이렇게 저장된 파일 페이지들을 Virtual Memory 로 논리주소를 사용하여 JVM에서 직접 접근할 수 있게 되고, 읽은 데이터는 버퍼에 저장합니다. 혹은 데이터를 쓸 경우 즉시 디스크에 반영됩니다.
      • 이렇게하게 될 경우 커녈영역에서 유저 영역으로 복사하게 되지 않아도 됩니다.
      • 다만 일반적인 상황에서는 여전히 커널에서 자바 애플리케이션으로 복사가 이뤄집니다.
    • 버퍼에 저장해두어 데이터를 일괄적으로 처리하기 때문에 성능이 향상되며, block 되지 않습니다.
    • 따라서 전체적인 IO 처리가 향상됩니다.
  3. Selector는 대개 네트워크와 관련된 작업을 합니다.
    • 여러 채널에서 발생하는 I/O 이벤트를 동시에 처리할 수 있게 하여 단일 스레드로 여러 I/O 연산을 처리할 수 있습니다.
    • Reactor 패턴을 사용합니다.

 

Java NIO 동작 원리

  1. 파일의 이름 경로 등의 메타데이터를 포함한 Channel 객체를 생성합니다.
  2. Buffer 객체를 생성하여 데이터를 저장하고 처리할 수 있는 메모리 공간을 할당합니다. 이 버퍼는 NIO의 모든 데이터 처리에 사용되며, 채널과 버퍼 사이에서 데이터 이동이 발생합니다.
  3. Channel을 사용하여 파일로부터 데이터를 읽거나, 파일에 데이터를 쓸 수 있습니다.
    • 버퍼 객체와 함께 진행되며, 읽기 작업의 경우 파일로부터 읽은 데이터가 버퍼에 저장되고, 쓰기 작업의 경우 버퍼의 데이터가 전달됩니다.
  4. Selector 를 사용하여 여러 채널에서 동시에 I/O 작업을 수행할 수 있습니다. 셀렉터는 여러 채널의 I/O 이벤트를 감지하고, 해당 이벤트를 처리할 수 있는 방법을 제공합니다.
    • Selector 는 여러 채널을 동시에 모니터링하며, I/O 작업을 수행할 준비가 된 채널을 알려줍니다. 이를 통해, 하나의 쓰레드가 여러 채널에서 발생하는 I/O 작업을 처리할 수 있게 되어 스레드 사용량을 줄일 수 있습니다.
Comments