한 페이지의 파일을 디스크에 한 번에 쓰는 방법은 무엇입니까?

한 페이지의 파일을 디스크에 한 번에 쓰는 방법은 무엇입니까?

4096바이트의 데이터를 파일에 저장하고 싶다고 가정해 보겠습니다. 정확히 한 페이지를 차지하고 한 번만 새로 고쳐야 합니다. 그러나 커널에 대한 여러 호출을 사용하여 이 작업을 수행하면(즉, 하나씩 쓰기) 커널이 쓰기를 중단하여 현재 콘텐츠를 디스크에 플러시한 다음 쓰기가 끝나면 다시 새로 고칩니다. 따라서 플러시를 낭비하지 않도록 커널을 한 번만 호출하면 됩니다. 그것은 될 것입니다 write.한 번 사용하면 write페이지가 한 번만 더티로 표시된다는 보장이 있나요?

manPages는 미리 작성된 일부 페이지를 파일에 매핑한 다음 파일에 쓰는 데 MAP_UNINITIALIZED함께 사용할 수 있는 몇 가지 기능을 제공 하지만 임베디드 장치에서만 작동한다고 합니다.MAP_FIXEDmsync

커널 소스 코드는 이것이 일부 레지스터를 채우고 라인을 작성하는 어셈블리 코드가 있는 매크로라는 것을 write보여 줍니다 . 내 질문에 대한 답을 찾기 위해 소스 코드를 더 자세히 파헤치는 방법을 모르겠습니다.sys_writemy_syscall3"syscall\n"

편집: 이제 오해가 생겼습니다. 내가 플러시라고 말할 때, 나는 (잘못) 플러시를 의미하지 않습니다. 커널 캐시를 플러시한다는 의미입니다. 커널이 새로 고칠 페이지를 선택하는 곳입니다. 즉, 페이지를 더티로 한 번만 표시하고 싶습니다. 이것이 바로 내가 원하는 것입니다. 페이지를 더티로 표시한 다음 커널을 업데이트하고 페이지를 더티가 아닌 것으로 설정한 다음 더 많이 쓰고 다시 더티로 표시하고 싶지 않습니다. 원자적 으로 하고 싶습니다 write. write더티 페이지에 대해 원자적입니까?

답변1

동일한 매뉴얼 페이지:

write()의 성공적인 반환은 데이터가 디스크에 커밋되었음을 보장하지 않습니다.

반드시 한 번 플러시할 필요는 없으며 사용자 영역 프로세스로서 스토리지 시스템의 필수 사항(하드 드라이브의 512B 블록, 파일을 지속적으로 쓰지만 디스크의 다른 끝으로의 조각화로 인해 네트워크 파일)을 알 수 없습니다. 시간 초과된 시스템? 256개의 디스크에 걸쳐 복제된 LVM? 기록된 데이터를 스토리지에 커밋하는 데 필요한 스토리지 미디어와의 물리적 상호 작용 횟수를 평가합니다.

보장되는 유일한 것은 파일 시스템이 POSIX를 보장하는 경우(따라서 XFS, NFS 등과 같은 "UNIXy" 파일 시스템) write반환 시 방금 기록된 데이터가 후속 읽기에서 표시되어야 한다는 것입니다.


왜 묻는지 모른 채: 플러시를 피하는 것에 대해 왜 걱정하는지 잘 모르겠습니다. 명시적으로 지시하지 않는 한 파일 시스템은 데이터를 디스크에 플러시하는 대신 항상 캐시하지만 효율적으로 수행합니다. 일괄 새로 고침. 따라서 미디어가 활성화되어 있지만 유휴 상태가 아닌 이상 4KB 이하의 쓰기 작업이 즉시 쓰기 시작되지 않을 가능성이 높습니다.

관련 정보