일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파이썬
- JPA
- 알고리즘
- Data Structure
- MySQL
- Proxy
- Heap
- 컴퓨터구조
- 백준
- 자료구조
- MSA
- c언어
- mongoDB
- 네트워크
- Galera Cluster
- OS
- 디자인 패턴
- JavaScript
- Java
- Algorithm
- 자바
- design pattern
- Kafka
- 운영체제
- redis
- Spring
- spring webflux
- C
- react
- IT
Archives
- Today
- Total
시냅스
Java NIO 의 작동 원리 본문
https://liltdevs.tistory.com/100
위의 글을 참고하시면 도움이 될 수 있습니다.
Java NIO 는 기존 IO 가 갖고 있는 문제점들을 해결하기에 나온 패키지입니다.
기존 IO 에서의 불필요한 과정이나, Thread block 을 해결하기 위함입니다.
아래에서 기존 IO 의 동작 원리를 살펴보며 어떤 것을 해결하였는지 알아보겠습니다.
Java IO 동작 원리
- 파일의 경로와 이름 등의 메타데이터를 포함한 InputStream 및 OutputStream 객체를 생성합니다.
- InputStream 및 OutputStream 객체를 사용하여 read(), write() 등의 메서드를 호출합니다. 이 메서드들은 JVM을 통해 해당 플랫폼의 운영 체제와 상호 작용합니다.
- JVM은 운영 체제의 파일 시스템 API를 사용하여 파일에 대한 실제 읽기 및 쓰기 작업을 수행합니다. 이 때, 운영 체제는 해당 파일을 찾아 디스크에서 읽기 작업을 수행하거나, 쓰기 작업을 수행하여 디스크에 데이터를 저장합니다.
- 운영 체제는 파일로부터 읽은 데이터를 커널의 버퍼에 저장한 뒤 JVM의 사용자 공간 버퍼로 복사하거나, 사용자 공간 버퍼의 데이터를 파일 시스템으로 전달합니다.
- 이 과정이 대체로 Thread 를 block 시킵니다.
- 또한 아래에서 살펴보는 NIO 에서는 이러한 과정이 필요하지 않습니다.
이러한 IO 프로세스는 작업을 요청한 스레드를 Block 시키며 idle time 을 증가시킵니다.
하여 NIO 를 사용하여 문제를 개선할 수 있습니다.
Java NIO (New I/O, Non-blocking I/O)
- Channel 은 파일이나 소켓과 같은 I/O 연상 대상과 연결되어 있는, 데이터가 읽고 쓰이는 통로입니다.
- 실제로 read, write 를 수행하는 주체입니다.
- Buffer 는 데이터를 저장하고 읽고 쓰는데 사용됩니다. NIO 의 모든 데이터는 버퍼를 통해 처리되며 채널과 버퍼 간 데이터 이동이 발생합니다.
- Memory Mapped I/O 로도 구현할 수 있습니다.
- 버퍼는 커널에 의해 관리되는 시스템 메모리에 직접 접근할 수 있습니다.
- 파일시스템의 페이지로 당시에 필요한 부분만 Memory Mapped Space 에 저장되어 있습니다.
- 이렇게 저장된 파일 페이지들을 Virtual Memory 로 논리주소를 사용하여 JVM에서 직접 접근할 수 있게 되고, 읽은 데이터는 버퍼에 저장합니다. 혹은 데이터를 쓸 경우 즉시 디스크에 반영됩니다.
- 이렇게하게 될 경우 커녈영역에서 유저 영역으로 복사하게 되지 않아도 됩니다.
- 다만 일반적인 상황에서는 여전히 커널에서 자바 애플리케이션으로 복사가 이뤄집니다.
- 버퍼에 저장해두어 데이터를 일괄적으로 처리하기 때문에 성능이 향상되며, block 되지 않습니다.
- 따라서 전체적인 IO 처리가 향상됩니다.
- Memory Mapped I/O 로도 구현할 수 있습니다.
- Selector는 대개 네트워크와 관련된 작업을 합니다.
- 여러 채널에서 발생하는 I/O 이벤트를 동시에 처리할 수 있게 하여 단일 스레드로 여러 I/O 연산을 처리할 수 있습니다.
- Reactor 패턴을 사용합니다.
Java NIO 동작 원리
- 파일의 이름 경로 등의 메타데이터를 포함한 Channel 객체를 생성합니다.
- Buffer 객체를 생성하여 데이터를 저장하고 처리할 수 있는 메모리 공간을 할당합니다. 이 버퍼는 NIO의 모든 데이터 처리에 사용되며, 채널과 버퍼 사이에서 데이터 이동이 발생합니다.
- Channel을 사용하여 파일로부터 데이터를 읽거나, 파일에 데이터를 쓸 수 있습니다.
- 버퍼 객체와 함께 진행되며, 읽기 작업의 경우 파일로부터 읽은 데이터가 버퍼에 저장되고, 쓰기 작업의 경우 버퍼의 데이터가 전달됩니다.
- Selector 를 사용하여 여러 채널에서 동시에 I/O 작업을 수행할 수 있습니다. 셀렉터는 여러 채널의 I/O 이벤트를 감지하고, 해당 이벤트를 처리할 수 있는 방법을 제공합니다.
- Selector 는 여러 채널을 동시에 모니터링하며, I/O 작업을 수행할 준비가 된 채널을 알려줍니다. 이를 통해, 하나의 쓰레드가 여러 채널에서 발생하는 I/O 작업을 처리할 수 있게 되어 스레드 사용량을 줄일 수 있습니다.
'Java, Spring' 카테고리의 다른 글
구현하며 이해하는 Spring MVC (0) | 2023.04.16 |
---|---|
Java 소켓으로 HTTP 요청 구현하기 (0) | 2023.04.16 |
코드로 살펴보는 Spring Thread Model 과 blocking/non-blocking I/O (0) | 2023.04.02 |
HikariCP 101 : 코드로 알아보는 HikariCP (0) | 2023.04.01 |
Java 로 구현하는 In-Memory Cache (2) | 2023.03.26 |
Comments