※ Scatter - 분산 / Gather - 수집 


Java NIO는 분산 / 수집이 내장되어 제공된다. 분산 / 수집은 채널로부터 읽고, 채널에 기록하는데 사용되는 개념이다.


한 채널로부터 읽은 분산은 하나 이상의 버퍼에서 데이터를 읽는 동작이다. 그러므로 채널은 채널로부터 다중 버퍼에 데이터를 "분산"한다.


채널로에 기록 수집은 하나 이상의 버퍼로부터 단일 채널에 데이터를 기록하는 작업이다. 그러므로 채널은 다중 버퍼로부터 하나의 채널에 데이터를 "수집"한다.


분산 / 수집은 각기 전송된 데이터들의 다양한 부분으로 작업이 필요한 상황에 매우 유용할 수 있다. 예를 들어, 메시지가 헤더와 바디로 구성되어 있을 때, 당신은 버퍼에 개별적으로 헤더와 바디를 유지할 수 있다. 이렇게 하면 별도의 헤더와 바디의 작업이 훨씬 더 쉬워질 것이다.

Scattering Reads


"분산 읽기"는 다중 버퍼에 단일 채널로부터 데이터를 읽는다. 다음은 원리를 보여주는 그림이다:

Java NIO: Scattering Read
Java NIO: 분산 읽기

다음 분산 읽기의 수행 방법을 보여주는 예제 코드이다:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

먼저 어떻게 버퍼가 배열에 삽입되고, channel.read() 메소드의 매개변수로 전달되는 배열에 주목하기 바란다. read() 메소드는 배열의 순차적으로 발생한 버퍼의 채널로부터 데이터를 기록한다. 버퍼가 꽉 차게 되면, 채널은 다음 버퍼를 채우기 위해 이동한다.


사실, 분산 읽기는 다음 단계로 이동하기 전에, 메시지 부분의 동적 할당이 적절하지 않다는 것을 의미한다. 바꿔 말하면, 만약 당신이 헤더와 바디를 갖고 있는 상황에 헤더의 크기가 고정되어 있다면(예를 들어 128 bytes), 분산 읽기는 잘 동작한다는 것이다.

Gathering Writes


"수집 기록"은 다중 버퍼로부터 단일 채널에 데이터를 기록한다. 다음은 원리를 보여주는 그림이다:

Java NIO: Gathering Write
Java NIO: 수집 기록

다음 수집 기록의 수행 방법을 보여주는 예제 코드가 있다:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray); 

write() 메소드에 전달된 버퍼 배열은 배열에 발생된 순서대로 버퍼의 내용을 기록한다. 오직 버퍼들의 위치와 제한 사이의 데이터만 기록된다. 그러므로 만약 버퍼의 용량이 128 bytes지만, 58 bytes만 포함하고 있다면, 그 버퍼로부터 채널에 58 bytes만 기록된다. 그러므로 수집 기록은 분산 읽기와는 대조적으로 메시지 부분의 동적 할당이 잘 동작한다.



<원문 출처>


'Programming > Java NIO' 카테고리의 다른 글

Selector  (0) 2015.09.09
Channel to Channel Transfers  (0) 2015.09.09
Buffer  (0) 2015.09.08
Channel  (0) 2015.09.08
Overview  (0) 2015.09.07
Posted by 레미파
,