5. NIO(New IO) 란?
• 기존 자바의 IO를 개선
• 포인트 버퍼 도입
• 네이티브 IO서비스를 제공해주는 채널 도입
• 셀렉터 도입
12년 10월 10일 수요일
6. 버퍼 (Buffer)
• 직접 시스템 메모리를 사용
할수 있는 클래스
• 기본 데이터 타입을 저장
할 수 있는 저장소
• 배열과 마찬가지로 제한된
크기에 순서대로 데이터를
저장
• 채널을 통해 읽기, 쓰기를
할 때 사용
12년 10월 10일 수요일
7. Buffer 추상클래스
ByteBuffer
byte데이터를 저장.Direct/NonDirect버퍼가 존재.
ReadableByteChannel과 WritableByteChannel를 통해서 데이터를
입출력
MappedByteBuffer
byte를 저장하는 버퍼로 항상 Direct. 파일의 특정영역을 메모리에
맵핑 시킬때 사용
CharBuffer char를 저장하며 Direct/NonDirect일수 있다. 채널에 쓸수 없다
DoubleBuffer double을 저장하며 Direct/NonDirect일수 있다. 채널에 쓸수 없다
FloatBuffer float을 저장하며 Direct/NonDirect일 수 있다
IntBuffer int 데이터를 저장하며 Direct/NonDirect일 수 있다.
LongBuffer long 데이터를 저장하며 Direct/NonDirect일 수 있다.
ShortBuffer short 데이터를 저장하며 Direct/NonDirect일 수 있다.
NIO API는 한 개의 추상클래스와 8개의 버퍼를 제공
12년 10월 10일 수요일
8. 버퍼의 기본속성
position
버퍼에서 현재 읽거나 쓸 위치값. limit를 초과하지 못함.
초기값은 0
limit
버퍼에서 읽거나 쓸 수 있는 한계값.capacity를 초과하지 못함.
초기값은 capacity값
capacity
버퍼의 크기를 나타냄. 메모리 크기라고 생각하면 됨. 한번 생성하면
크기를 변경할 수 없음.
mark
현재의 position을 표시할 때 사용. reset() 메소드를 호출해서
mark위치로 position을 바꿀 수 있음.
12년 10월 10일 수요일
16. 버퍼 생성
• Buffer의 모든 클래스는 추상클래스이기 때문에
생성자를 통한 객체생성이 안됨
• 팩토리 메소드를 이용하는 방법
• ByteBuffer.allocate();
• ByteBuffer.allocateDirect();
• 존재하는 배열을 이용하는 방법
• ByteBuffer.wrap(new Byte[]);
12년 10월 10일 수요일
17. 다이렉트 버퍼
• ByteBuffer는 시스템 메모리를 직접 사용하는 다이렉트
버퍼를 만들 수 있는 유일한 버퍼
• 운영체제가 이용하는 가장 기본적인 데이터 단위,
시스템메모리 또한 순차적인 바이트집합
• 자바의 바이트 배열은 순차적인 바이트의 집합이
아니라 객체 내에 바이트들을 저장하고 있는 형태
• 이런 한계점을 극복하기 위해 다이렉트버퍼가 도입,
ByteBuffer만이 시스템 메모리를 사용할 수 있는
다이렉트 버퍼로 생성
12년 10월 10일 수요일
18. 채널 (Channel)
• 데이터가 통과하는 쌍방향 통로
• 채널에서 데이터를 주고 받을 때 사용되는 것이 버퍼
• 모든 채널 클래스는 public 생성자를 제공하지 않음
• 채널을 생성하기 위해서는 기존의 스트림, 소켓, 서버
소켓클래스의 getChannel()을 사용
• SocketChannel, ServerSocketChannel의 경우
static메소드인 open() 메소드를 제공
12년 10월 10일 수요일
19. 채널의 종류
• FileChannel - 파일에 대한 입출력 채널
• Pipe.SinkChannel - 파이프에 데이터를 출력하는 채널
• Pipe.SourceChannel - 파이프로 부터 데이터를
입력받는 채널
• ServerSocketChannel - 클라이언트의 연결 요청을
처리하는 서버 소켓 채널
• SocketChannel - 소켓과 연결된 채널
• DatagramChannel - DatagramSocket과 연결된 채널
12년 10월 10일 수요일
20. FileChannel
• 항상 블록킹 모드며 비블록킹 모드로 설정
할 수 없다
• 파일채널 객체는 직접 만들수 없다.
• 대부분의 채널처럼 파일채널도 가능하면
네이티브IO서비스를 사용하기 위해 노력한다
• 쓰레드에 안전하다
12년 10월 10일 수요일
22. SocketChannel
• 비블록킹 모드의 지원
• Selector와 함께 멀티플렉스IO가 가능
• ServerSocketChannel과 SocketChannel을
이용하여 TCP네트워크 프로그램에 이용
12년 10월 10일 수요일
23. 셀렉터 (Selector)
• Reactor패턴의 구현체
• 채널이나 스트림처럼 데이터전송을 위한
클래스가 아님
• 등록된 채널들이 발생시킨 이벤트에 대해
적절한 처리 핸들러로 그 요청을 분기하는
컨트롤러 역할을 하는 클래스
12년 10월 10일 수요일
24. Reactor 패턴
• 이벤트 중심의 어플리케이션이
• 하나 이상의 클라이언트로부터
• 하나의 어플리케이션으로 ‘동시에’ 전달되는
요청들을 나눠
• 각 요청이 원하는 목적지로 보내주는 역할을
수행하는 것
12년 10월 10일 수요일
25. Reactor 패턴
• 클라이언트의 모든요청을 우선 큐에 저장하고
• 큐를 모니터링하는 스레드에 신호를 보낸다
• 신호를 받은 큐 모니터링 스레드는 큐에
저장된 요청의 목적지를 분석해서 해당
목적지로 보내준다
12년 10월 10일 수요일
26. 기존의 네트워크 프로그래밍 모델
• 많은 스레드 생성에 따른 스레드 컨텍스트 스위칭 부하
• 스레드 자체가 CPU와 고유스택을 갖는데 따른 컴퓨터
리소스 부하
• 클라이언트의 빈번한 접속과 종료에 따른 많은 가비지가
생성되는 문제점
• 클라이언트가 접속할 때마다 매번 스레드를 새로 생성하는
부담
• 서버의 메모리가 부족해서 OOM이 발생 할 수 있는
가능성
12년 10월 10일 수요일
27. 비블록킹 모델
• 채널을 Selector에 등록하면 이 등록에 관련된 채널과
Selector사이의 관계를 캡슐화한 SelectionKey가
Selector에 저장
• 어떤 채널이 자신이 등록한 모드에 대해 동작할
준비가 되면 SelectionKey는 그 준비상태를
내부적으로 저장
• Selector가 select()메소드를 호출해서 자신에게
등록된 모든 SelectionKey들을 검사하는데 바로
동작할 준비가 되어 있는지 아닌지를 검사
12년 10월 10일 수요일
30. NIO2
• JDK에 두번째로 추가되는 새로운 I/O API
• 크게 파일시스템 API와 비동기채널로 나눔
12년 10월 10일 수요일
31. Path
• File 클래스를 직접 대체하는 java.nio.file.Path
• 파일보다는 경로 자체에 초점을 맞춘 클래스
12년 10월 10일 수요일
32. FileSystem
• 파일시스템은 플랫폼에 따라 다른 모습을 가지고
있음
• 경로를 가리키는 문자열, 즉 Path를 생성하는 경로
표기법도 제각각임.
• 플랫폼마다 적절하게 경로를 해석하는 방법을
제공
• FileSystem 추상클래스가 제공하는 getPath() 팩토
리 메소드를 이용하여 Path를 생성
12년 10월 10일 수요일
33. Files
• Path에는 파일 관련 메소드는 없고, 오직 경로
와 관련된 메소드만 제공
• NIO.2에는 파일을 다루는 메소드는 모두
java.nio.file.Files에서 제공됨
• Files에서 제공하는 메소드 종류
(파일연산,I/O,파일속성, 디렉터리탐색,기타)
12년 10월 10일 수요일
34. 비동기 I/O
• AsynchronousFileChannel
• AsynchronousServerSocketChannel
• AsynchronousSocketChannel
• 비동기채널은 두가지 패턴으로 사용
(Future사용, CompletionHandler사용)
12년 10월 10일 수요일