MappedByteBuffer 정의

11387 단어 NIO
Java NIO ByteBuffer 상세 설명: [url]http://donald-draper.iteye.com/blog/2357084[/url]
[size = medium] [b] 머리말: [/ b] [/ size]
지난 글 에서 우 리 는 HeapByteBuffer 를 보 았 고 오늘 은 또 다른 DirectByteBuffer 를 보 았 다.DirectByteBuffer 를 보기 전에 DirectByteBuffer 의 부류 인 MappedByteBuffer 를 살 펴 보 자.
//DirectByteBuffer
package java.nio;
import java.io.FileDescriptor;
import sun.misc.Cleaner;
import sun.misc.Unsafe;
import sun.misc.VM;
import sun.nio.ch.DirectBuffer;
class DirectByteBuffer
extends MappedByteBuffer
implements DirectBuffer
{

다음은 MappedByteBuffer 입 니 다.
package java.nio;
import java.io.FileDescriptor;
import sun.misc.Unsafe;

/**
* A direct byte buffer whose content is a memory-mapped region of a file.
*MappedByteBuffer region。
* Mapped byte buffers are created via the {@link
* java.nio.channels.FileChannel#map FileChannel.map} method. This class
* extends the {@link ByteBuffer} class with operations that are specific to
* memory-mapped file regions.
*MappedByteBuffer java.nio.channels.FileChannel#map 。MappedByteBuffer
ByteBuffer, regions 。
*

A mapped byte buffer and the file mapping that it represents remain
* valid until the buffer itself is garbage-collected.
* , ,MappedByteBuffer 。
*

The content of a mapped byte buffer can change at any time, for example
* if the content of the corresponding region of the mapped file is changed by
* this program or another. Whether or not such changes occur, and when they
* occur, is operating-system dependent and therefore unspecified.
*MappedByteBuffer , region
。 , , 。
*

All or part of a mapped byte buffer may become * inaccessible at any time, for example if the mapped file is truncated. An * attempt to access an inaccessible region of a mapped byte buffer will not * change the buffer's content and will cause an unspecified exception to be * thrown either at the time of the access or at some later time. It is * therefore strongly recommended that appropriate precautions be taken to *avoid the manipulation of a mapped file by this program, or by a * concurrently running program, except to read or write the file 's content. * 맵 파일 이 삭제 되면 MappedByteBuffer 의 모든 파 트 는 접근 할 수 없습니다.방문 을 시도 하면 buffer 의 내용 을 바 꾸 지 않 습 니 다. 방문 시간 이 든 방문 후 든 불확실 한 이상 을 일 으 킬 수 있 습 니 다.따라서 응용 프로그램 이나 동시 다발 프로그램 을 통 해 맵 파일 을 직접 조작 하지 않 는 것 을 강력 히 권장 합 니 다. 파일 내용 을 읽 고 쓰 는 것 을 제외 하고 *

Mapped byte buffers otherwise behave no differently than ordinary direct * byte buffers. * 상기 읽 을 수 있 는 파일 내용 을 제외 하고 파일 맵 을 직접 조작 할 수 없습니다.author Mark Reinhold * @author JSR-51 Expert Group * @since 1.4 */public abstract class MappedByteBuffer extends ByteBuffer{/ / 이것 은 조금 뒤 입 니 다: 권리 에 의 해 MappedByteBuffer 는 DirectByteBuffer 의 / / subclass 가 되 어야 하지만, spec 를 명확 하고 간단하게 유지 하기 위해 서 는 / / 최적화 목적 을 위해 서 는 다른 방법 으로 쉽게 할 수 있 습 니 다. / / DirectByteBuffer 는 패키지 - 프 라이 빗 클래스 이기 때문에 작 동 합 니 다. / / MappedByteBuffer 를 사용 하려 면 MappedByteBuffer 를 사용 해 야 합 니 다.이것 은 DirectByteBuffer 의 하위 클래스 입 니 다. 깨끗 하고 간단 하 며 / / 최 적 화 된 목적 을 위해 DirectByteBuffer 를 계승 하 는 하위 클래스 를 쉽게 실현 할 수 있 을 것 입 니 다. 왜 DirectByteBuffer 의 하위 클래스 일 까요? 이것 은 DirectByteBuffer 가 개인 적 인 클래스 이기 때 문 입 니 다. / / For mapped buffers, a FileDescriptor that may be used for mapping / / operationsif valid; null if the buffer is not mapped. / / 매 핑 캐 시 에서 파일 설명자 가 유효 하 다 면 파일 설명 은 매 핑 작업 에 사용 할 수 있 습 니 다. null 이면 / / 캐 시 는 private final FileDescriptor fd 를 매 핑 할 수 없습니다. / / This should only be invoked by the DirectByteBuffer constructors / / 이 방법 은 DirectByteBuffer 의 구조 방법 으로 Map 을 호출 합 니 다.pedByteBuffer(int mark, int pos, int lim, int cap, // package-private FileDescriptor fd) { super(mark, pos, lim, cap); this.fd = fd; } MappedByteBuffer(int mark, int pos, int lim, int cap) { // package-private super(mark, pos, lim, cap); this.fd = null; }/ / 파일 설명자 가 null private void checkMapped () {if (fd = = null) / / Can only happen if a luser explicitly casts a direct byte buffer throw new Unsupported Operation Exception ();} / / Returns the distance (in bytes)매 핑 의 페이지 정렬 된 주소 / / 의 버퍼 입 니 다. 모든 직접 버퍼 에 저장 되 지 않도록 매번 계 산 됩 니 다. / / 시작 주 소 를 가 져 오 는 개인 긴 매 핑 오프셋 () {int ps = Bits. pageSize (); long offset = address% ps; return (offset > = 0)? offset: (ps + offset);}/ / 실제 시작 주 소 를 가 져 옵 니 다 private long mappingAddress (long mappingOffset) {return address - mappingOffset;} / / 맵 주소 길이 private long mappingLength (long mappingOffset) {return (long) capacity () + mappingOffset;} / / not used, but a potential target for a store, see load ()자세 한 내용 은 이 버퍼 의 내용 을 물리 적 메모리 에 로드 합 니 다. * * 이 방법 은 반환 시 * 이 버퍼 의 내용 이 물리 적 메모리 에 상주 하도록 최선 을 다 합 니 다. 이 * 방법 을 사용 하지 않 으 면 페이지 오류 및 I / O 작업 이 발생 할 수 있 습 니 다.to * occur. * * @ return This buffer * / public final MappedByteBuffer load () {checkMapped (); / 파일 설명 이 null if (address = 0) | | (capacity () = = 0) 인지 확인 합 니 다. / 주소 나 용량 이 0 이면 true return this; long offset = mappingOffset () 를 되 돌려 줍 니 다.; / / 시작 주소 long length = mappingLength (offset); / / 필요 한 주소 길 이 를 계산 하여 메모리 load 0 (mappingAddress (offset), length) 을 분배 합 니 다.메모리 로 가 져 오기 위해 각 페이지 에서 바 이 트 를 읽 습 니 다. checksum / / 는 컴 파 일 러 가 그렇지 않 으 면 / / 루프 를 데 드 코드 로 고려 하 는 것 을 방지 하기 위해 함께 가 는 것 처럼 계 산 됩 니 다. Unsafe unsafe = Unsafe. getUnsafe (); int ps = Bits. pageSize (); / / 페이지 크기 int count = Bits. pageCount (길이); / / 페이지 수 long a = mappingAddress (offset); byte x = 0 가 져 오기; //물리 적 메모리 주소 와 MappedByteBuffer 를 맵 for (int i = 0; i x ^ = unsafe. getByte (a); a + = ps;} if (unused! = 0) unused = x; return this;} private native void load 0 (long address, long length); / * * * Tells whether or not this buffer 's content is resident in physical * memory. * 캐 시 내용 이 실제 물리 적 메모리 에 존재 하 는 지 판단 * A return value of true implies that it is highly likely * that that all of the data in this buffer is resident in physical memory and * may be accessed without incurring any virtual - memory page * faults or I / O operations. A return value of false does not * necessary imply that the buffer 's content is not resident in physical * memory.메모리 중 *

The returned value is a hint, rather than a guarante, because the * underlying operating system may have paged out some of the buffer 's data * by the time that an invocation of this method returns.기본 운영 체 제 는 캐 시 에 있 는 데 이 터 를 페이지 별로 꺼 낼 수 있 습 니 다. * @return true if it is likely that this buffer 's content * is resident in physical memory * / public final boolean isLoaded () {/ 파일 설명 이 null checkMapped () 인지 확인 합 니 다. //주소 나 용량 이 0 이면 true if (address = = 0) | (capacity () = = 0) return true 를 되 돌려 줍 니 다. //시작 주소 long offset = mappingOffset (); //길이 길이 = mappingLength (offset); return isLoaded 0 (mappingAddress (offset), length, Bits. pageCount (length);} private native boolean isLoaded 0 (long address, long length, int pageCount); / * * * * *Forces any changes made to this buffer 's content to be written to the * storage device containing the mapped file. * 버퍼 의 데이터 변경 과 매 핑 파일 을 저장 장치 에 강제로 기록 합 니 다. *If the file mapped into this buffer resides on a local storage * device then when this method returns it is guaranteed that all changes * made to the buffer since it was created, or since this method was last * invoked, will have been written to that device. * 캐 시 된 파일 맵 이 로 컬 장치 에 저장 되 어 있다 면,이 방법 을 사용 하면 MappedByteBuffer 에서 현재 시간 까지 캐 시 된 모든 데이터 변 화 를 장치 에 기록 할 수 있 습 니 다. *

파일 이 로 컬 장치 에 상주 하지 않 으 면 이러한 보증 * 이 이 루어 지지 않 습 니 다. * 파일 이 로 컬 장치 에 존재 하지 않 는 다 면 방법 은 보장 할 수 없습니다 *

이 버퍼 가 읽 기 / 쓰기 모드 ({@ link * java. nio. channels. FileChannel. MapMode \ # READ WRITE}) 에서 매 핑 되 지 않 은 경우 이 * method 를 호출 하 는 것 은 효과 가 없습니다. * 캐 시가 java. nio. channels. FileChannel. MapMode \ # READ 로 매 핑 되 지 않 았 다 면WRITE 모드 는 호출 방법 이 잘못 되 었 습 니 다 * @ return 이 버퍼 * / public final MappedByteBuffer force () {checkMapped (); if (address! = 0) & & (capacity ()! = 0) {long offset = mappingOffset (); force 0 (fd, mappingAddress (offset), mappingLength (offset);} return this;} private native void force0(FileDescriptor fd, long address, long length);}


이 방법 중의 주소 address 가 어디에서 왔 는 지 보 세 요.
/ / 실제 시작 주소 가 져 오기
 private long mappingAddress(long mappingOffset) {
return address - mappingOffset;
}

//Buffer
 public abstract class Buffer {

// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

// Used only by direct buffers
// NOTE: hoisted here for speed in JNI GetDirectBufferAddress
//Direct buffer
long address;
}

MappedByteBuffer 와 물리 메모리 파일 맵 방법 load 의 Bits. pageCount, Bits. pageSize () 를 만 듭 니 다.
public final MappedByteBuffer load() {
checkMapped(); // null
if ((address == 0) || (capacity() == 0))// 0, true
return this;
long offset = mappingOffset();//
long length = mappingLength(offset);// ,
load0(mappingAddress(offset), length);

// Read a byte from each page to bring it into memory. A checksum
// is computed as we go along to prevent the compiler from otherwise
// considering the loop as dead code.
Unsafe unsafe = Unsafe.getUnsafe();
int ps = Bits.pageSize();//
int count = Bits.pageCount(length);//
long a = mappingAddress(offset);
byte x = 0;
// MappedByteBuffer
for (int i=0; i x ^= unsafe.getByte(a);
a += ps;
}
if (unused != 0)
unused = x;

return this;
}

//Bits
  private static final Unsafe unsafe = Unsafe.getUnsafe();
static int pageCount(long size) {
return (int)(size + (long)pageSize() - 1L) / pageSize();
}
private static int pageSize = -1;
static int pageSize() {
if (pageSize == -1)
pageSize = unsafe().pageSize();
return pageSize;
}
static Unsafe unsafe() {
return unsafe;
}

//Unsafe
public native int pageSize();

[size=medium][b]
결론: [/ b] [/ size]
[color = blue] MappedbyteBuffer 는 캐 시 영역 데 이 터 를 실제 물리 적 메모리 에 페이지 별로 저장 하고 맵 을 만 듭 니 다.우 리 는 일반적으로 MappedByteBuffer 를 직접 사용 하지 않 고 MappedByteBuffer 의 하위 클래스 DirectByteBuffer 를 사용한다.뒤에 있 는 java. nio. channels. FileChannel 관련 글 에서 우 리 는 다시 한 번 MappedByteBuffer 를 언급 했다.
[/color]

좋은 웹페이지 즐겨찾기