4096바이트의 데이터를 파일에 저장하고 싶다고 가정해 보겠습니다. 정확히 한 페이지를 차지하고 한 번만 새로 고쳐야 합니다. 그러나 커널에 대한 여러 호출을 사용하여 이 작업을 수행하면(즉, 하나씩 쓰기) 커널이 쓰기를 중단하여 현재 콘텐츠를 디스크에 플러시한 다음 쓰기가 끝나면 다시 새로 고칩니다. 따라서 플러시를 낭비하지 않도록 커널을 한 번만 호출하면 됩니다. 그것은 될 것입니다 write
.한 번 사용하면 write
페이지가 한 번만 더티로 표시된다는 보장이 있나요?
man
Pages는 미리 작성된 일부 페이지를 파일에 매핑한 다음 파일에 쓰는 데 MAP_UNINITIALIZED
함께 사용할 수 있는 몇 가지 기능을 제공 하지만 임베디드 장치에서만 작동한다고 합니다.MAP_FIXED
msync
커널 소스 코드는 이것이 일부 레지스터를 채우고 라인을 작성하는 어셈블리 코드가 있는 매크로라는 것을 write
보여 줍니다 . 내 질문에 대한 답을 찾기 위해 소스 코드를 더 자세히 파헤치는 방법을 모르겠습니다.sys_write
my_syscall3
"syscall\n"
편집: 이제 오해가 생겼습니다. 내가 플러시라고 말할 때, 나는 (잘못) 플러시를 의미하지 않습니다. 커널 캐시를 플러시한다는 의미입니다. 커널이 새로 고칠 페이지를 선택하는 곳입니다. 즉, 페이지를 더티로 한 번만 표시하고 싶습니다. 이것이 바로 내가 원하는 것입니다. 페이지를 더티로 표시한 다음 커널을 업데이트하고 페이지를 더티가 아닌 것으로 설정한 다음 더 많이 쓰고 다시 더티로 표시하고 싶지 않습니다. 원자적 으로 하고 싶습니다 write
. write
더티 페이지에 대해 원자적입니까?
답변1
동일한 매뉴얼 페이지:
write()의 성공적인 반환은 데이터가 디스크에 커밋되었음을 보장하지 않습니다.
반드시 한 번 플러시할 필요는 없으며 사용자 영역 프로세스로서 스토리지 시스템의 필수 사항(하드 드라이브의 512B 블록, 파일을 지속적으로 쓰지만 디스크의 다른 끝으로의 조각화로 인해 네트워크 파일)을 알 수 없습니다. 시간 초과된 시스템? 256개의 디스크에 걸쳐 복제된 LVM? 기록된 데이터를 스토리지에 커밋하는 데 필요한 스토리지 미디어와의 물리적 상호 작용 횟수를 평가합니다.
보장되는 유일한 것은 파일 시스템이 POSIX를 보장하는 경우(따라서 XFS, NFS 등과 같은 "UNIXy" 파일 시스템) write
반환 시 방금 기록된 데이터가 후속 읽기에서 표시되어야 한다는 것입니다.
왜 묻는지 모른 채: 플러시를 피하는 것에 대해 왜 걱정하는지 잘 모르겠습니다. 명시적으로 지시하지 않는 한 파일 시스템은 데이터를 디스크에 플러시하는 대신 항상 캐시하지만 효율적으로 수행합니다. 일괄 새로 고침. 따라서 미디어가 활성화되어 있지만 유휴 상태가 아닌 이상 4KB 이하의 쓰기 작업이 즉시 쓰기 시작되지 않을 가능성이 높습니다.