자바 I/O & NIO 네트워크 정리 12 : NIO 개요

0

1. 🚗 자바 IO는 느리다?

C 나 C++ 처럼 포인터로 직접 메모리를 관리하고 시스템 콜을 사용하는 저수준 언어보다 느린것은
당연하다. 하지만 특히 꼬집자면 스윙IO 탓일것이다.
기존의 IO가 왜 느린지 파악하도록 하자.

2. 🛺 블록킹 자바 IO


느린 점은 두가지이다.

일단 IO는 반드시 커널영역을 직간접적으로 거쳐야 한다.
자바에서 파읽 읽기라는 명령을 실행해보자

커널은 시스템 콜을 이용하여 파일디스크를 커널안의 버퍼로 저장한다.
커널안의 버퍼로 복사되면 JVM 안으로 버퍼 복사가 시작한다.

자바는 커널에서 JVM으로 옮기기 때문에 시스템콜을 이용하는 저수준 언어보다 느리다.
만약 커널영역의 버퍼에 저장된 데이터를 직접사용한다면 시간 단축과 가비지 컬렉션 두마리를 잡을수 있다.

두번째는 커널영역에서 버퍼로 데이터를 복사하는 동안 프로세스 영역이 블로킹 된다.
정확하게 말하자면 파일 데이터를 커널 영역안의 버퍼로 복사할때까진 자바프로세스(파일 읽기를 요청한 자바 스레드)는 블록킹이 된다.

3. ⛵ IO향상을 위한 운영체제 수준의 기술

대다수의 운영체제들은 IO 향상을 위해 많은 기능을 제공한다.

1. 버퍼

유저영역과 커널영역에서 버퍼를 사용한것을 볼수 있듯, 버퍼를 간단하게 설명하면 효율적으로
데이터를 전달하기 위한 객체다.

데이터를 한개씩 여러번 전달하는것보단 한번에 전달하는것이 효율적이기에 버퍼를 사용하는게 좋다.

2. Scatter/Gather

버퍼가 3개가 있을 경우, 3개의 버퍼는 시스템콜을 해서 데이터를 가져온다.
시스템콜은 가벼운작업이 아니므로, 비효율이다.
하지만 Scatter/Gather를 이용해, 시스템콜을 한번만 사용하여 순차적으로 데이터를 읽거나 쓸수 있다.

3. 가상메모리

가상 메모리는 프로그램이 사용할 수 있는 주소 공간을 늘이기 위해 운영체제에서 지원하는 기술이다.
운영 체제는 가상 메모리를 페이지라는 고정된 크기로 나누고 메모리가 아닌 디스크에 저장한다.
그리고 실제프로그램이 실행되는데 필요한 페이지의 가상주소를 물리적 메모리 주소로 바꾸어 메인 메모리에 올려놓는다.

생기는 장점 두가지
1.실제 물리적 메모리 크기보다 큰 가상 메모리 공간을 사용할 수 있다.
2. 여러개의 가상주소가 하나의 물리적 메모리 주소를 참조함으로써 메모리를 효율적으로 사용할수 있다.

4. 메모리 맵 파일

간단한 워드 프로그램을 만들었다고 해보자. 워드패드 프로그램 특성 상 파일을 읽고 쓰는 작업이 빈번하다.
그때마다 매번 값비싼 시스템 콜과 더불어 커널 영역과 유저 영역 버퍼 간의 복사가 이뤄지고 많은 가비지들이 생길 것이다. 그리거 가비지 컬렉터로 가비지를 수거하는 것은 상당히 느린 작업이다.
이런 문제점을 해결하기위해 운영체제에서 지원하는 것이 Memory-mapped-IO다.

생기는 장점
프로세스가 파일 데이터를 메모리로 바라보기 때문에 시스템 콜을 할필요가 없다.
매우 큰 파일을 복사하기 위해 많은 양의 메모리를 소비하지 않아도 된다.

5. 파일 락

파일 락은 앞서 우리가 스레드에서 공부했던 동기화가 비슷한 개념이다.
한프로세스가 어떤 파일의 락을 획득했을때, 잠글 부분을 바이트 단위로 계산하여 일부분만 잠근다.
그래서 다른위치의 여러 프로세스들이 동시에 다른작업을 할수 있게 하는것이다.

파일락은 공유 락과 베타 락 두가지로 나누는데, 공유락은 읽기작업베타 락은 쓰기작업에 사용된다.

4. 🚅 자바의 새로운 변화

NIO는 어떤변화가 있는지 알아보자

1. 자바의 포인트 버퍼 도입(따로 추가)

NIO에서는 커널에 의해 관리되는 시스템

2. 네이티브 IO 서비스를 제공해주는 채널 도입

기존의 스트림을 단뱡이라 한가지의 경우만 가능했는데, 채널을 이용하여 읽고 쓰거나 양방향 또한 가능핟.
또한 앞서 봤던 Scatter/Gather을 이용하여 효율적으로 IO를 처리할 수 있다.

3. 셀렉터 도입

셀렉터는 네트워크 프로그래밍의 효율을 높이기 위해서 도입되었다.
보통 클라이언트 하나당 스레드 하나를 생성하였는데, 버퍼 채널과 함께 사용되는 셀렉터를 이용하여 단 한개의 스레드 만으로 수만의 동시 사용자를 처리 할수 있는 서버를 만들 수 있게 되었다.

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글