동일한 파일에 매핑된 두 개의 메모리 매핑 버퍼가 있는 경우 삽입 순서는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/25020917

문제

내 질문은 OS가 삽입 순서를 존중하는지 여부입니다(예:마지막으로 기록되고 디스크에 마지막으로 기록됨) 그렇지 않으면 순서를 예측할 수 없습니다.예를 들어:

    byte[] s1 = "Testing1!".getBytes();
    byte[] s2 = "Testing2!".getBytes();
    byte[] s3 = "Testing3!".getBytes();

    RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
    FileChannel fc = raf.getChannel();
    MappedByteBuffer mbb1 = fc.map(MapMode.READ_WRITE, 0, 1024 * 1024);
    mbb1.put(s1);

    MappedByteBuffer mbb2 = fc.map(MapMode.READ_WRITE, mbb1.position(), 1024 * 1024);
    mbb2.put(s2);

    MappedByteBuffer mbb3 = fc.map(MapMode.READ_WRITE, mbb1.position() + mbb2.position(), 1024 * 1024);
    mbb3.put(s3);

    mbb1.put(s1); // overwrite mbb2
    mbb1.put(s1); // overwrite mbb3

    mbb1.force(); // go to file
    mbb3.force(); // can this ever overwrite mbb1 in the file?
    mbb2.force(); // can this ever overwrite mbb1 in the file?

항상 마지막에 쓰여졌나요, 마지막에 쓰여졌나요, 아니면 여기서 뭔가 빠졌나요?

도움이 되었습니까?

해결책

이건 테스트해보지 않아서 잘 모르겠네요.

하지만 솔직히 말해서 이 주문에 대한 보장은 없습니다.

당신은 mbb.force() 방법이지만 이것이 장치에 쓰는 유일한 방법은 아니며 단지 장치가 기록되었는지 확인하는 것뿐입니다.

VM은 적합하다고 판단되는 일정을 사용하여 원할 때마다 페이지를 장치로 다시 플러시할 수 있습니다. 이는 당연히 플랫폼에 따라 매우 다릅니다(Linux의 동작은 Windows의 동작과 다를 수 있으며 Windows의 동작과 다를 수도 있습니다). Linux에서 Linux로 또는 Windows에서 Windows로).

파일의 특정 영역에 하나의 읽기/쓰기 버퍼만 매핑되도록 내부적으로 조정하고 운영 체제에 의존하기보다는 그런 방식으로 충돌과 겹침을 관리해야 하는 것 같습니다.

편집하다:"여러 메모리 매핑된 버퍼에 의해 수행된 변경 사항은 일관성이 보장됩니다."

간단히 말해 이는 물리적 페이지가 프로세스에 매핑되면 기본 VM이 수행되는 모든 다양한 매핑에서 해당 매핑이 공유된다는 것을 의미합니다.스레드 문제는 단순히 CPU 메모리 캐싱 및 기타 문제로 인해 발생합니다.

따라서 이는 모든 매핑이 겹치는 버퍼 내에서 동일한 데이터를 볼 수 있음을 보장합니다.그러나 버퍼가 실제로 장치에 기록되는 시기는 다루지 않습니다.그 점들은 여전히 ​​밀접하게 연관되어 있습니다.

전반적으로 멀티스레딩 측면을 올바르게 처리하고 기본 버퍼에 표시되는 내용이 "발 밑에서 변경"될 수 있다는 점에 유의하면 문제가 없을 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top