본문 바로가기

Language/Java

JAVA NIO(non-blocking I/O)

NIO


기존의 자바IO가 blocking IO였기 때문에 C,C++에 비해 상당히 느렸다. 또한 File Locking 같은 기능도 지원되지 못했다.





두가지 비 효율적인 부분

1. 커널 영역 버퍼에서 프로세스 영역 안의 버퍼로 데이터를 복사

[디스크]에서 [커널 영역 버퍼]로 데이터를 저장하는 것은 디스크 컨트롤러가 DMA 기술을 사용하기 때문에 CPU를 사용 하지 않는다. 하지만 [커널 영역]에서 [프로세스 영역 버퍼]으로 데이터를 전달하는 것은 CPU를 사용한다. 만약 커널 영역의 버퍼에 저장된 데이터를 직접 사용한다면 복사하는 시간을 단축 할 수 있고, 복사 대상인 데이터의 가비지 컬렉션도 필요 없다. 그리고 CPU자원도 최소화 할 수 있다.


2. 디스크 컨트롤러에서 커널 영역의 버퍼로 데이터를 복사하는 동안 프로세스 영역의 블록킹

운영체제는 효율을 높이기 위해 최대한 많은 양의 데이터를 커널 영역의 버퍼에 저장한 후 프로세스 영역의 버퍼로 전달한다. 따라서 디스크의 파일 데이터를 커널 영역 안의 버퍼로 모두 복사할 때 까지 자바 프로세스가 블록킹 된다. 좀 더 정확하게는 파일 읽기를 요청한 자바 스레드가 블록킹 된다.



NIO에서 도입된 3가지 기술


버퍼(Buffer)

NIO에서 Buffer클래스를 도입했다. 1.4이전 버전에서 모든 메모리는 JVM 힙 영역을 통해서 관리했다. 결국, IO 과정에서 항상 비효율적인 보사 과장을 거치고, 블록킹이 된다. 하지만 1.4 부터는 시스템 메모리를 직접 사용할 수 있는 Buffer 클래스가 도입 되었다(물론, DirectByteBuffer에 한정된 것이지만). 


채널(Channel)

NIO에서는 스트림의 향상된 버전인 Channel을 도입했다. 채널은 스트림처럼 읽거나 쓰는 단방향에서부터, 읽고 쓰는 양방향 통신이 가능한 세가지 형식이 존재한다. ㄸㅎ한 운영체제에서 제공해주는 다양한 네이티브IO 서비스들을 이용할 수 있게 해준다.


셀럭터(Selector)

셀럭터는 네트워크 프로그래밍의 효율을 높이기 위한 것이다. 클라이언트 하나당 스레드 하나를 생성해서 처리해야 했는데, 사용자가 늘어나면 스레드가 많이 생성됨으로 인해 급격한 성능 저하를 가져왔다. 따라서 셀렉터는 하나의 스레드에서 다수의 동시 사용자를 처리할 수 있는 기술이다.




사용법은 추후 업데이트 합니다. 이런게 있다 정도 개념만 알면 되지 않을까요?ㅎㅎ






'Language > Java' 카테고리의 다른 글

Swing으로 만든 JAR파일을 EXE로 변환  (0) 2014.02.27
Java arraycopy [Java 배열 복사]  (0) 2014.02.27
Java String interm  (0) 2014.02.27
OXM(Object XML Mapping) [XML 바인딩 기술들...]  (0) 2014.02.27
Java Doc  (0) 2014.02.27