동시 정전이 실제로 문제가 되지 않을 때 실제로 얼마나 자주 sync 또는 fsync 작업을 실행해야 하는지 파악하려고 합니다. 저는 특정 파일 시스템에서 제공하는 기능이 아닌 Linux 커널이나 Posix 또는 glibc API가 런타임에 제공할 수 있는 보장을 찾고 있습니다.
함수 a()가 파일을 열고 데이터를 쓴 다음 모두 기본 차단 IO를 사용하여 파일을 닫으면 디스크에 명시적으로 동기화하지 않고 파일을 열기 위한 나중에 호출을 위해 해당 데이터가 보장됩니까? 디스크 캐시 또는 VFS 계층은 나중에 읽기 위해 해당 파일 이름을 열기 위해 b() 함수를 호출하는 경우 fsync()가 열리기 전에 sync()가 호출되었을 때와 동일한 데이터가 표시되도록 보장합니까? 아니면 다른 코드 블록에서 읽을 데이터에 대해 항상 동기화를 호출해야 합니까?
답변1
POSIX는 read
a 이후에 발생하는 모든 이벤트가 write
새로운 데이터를 볼 수 있도록 보장합니다. ~에서기준:
read()
파일 데이터의 a가write()
데이터의 a 다음에 발생한다는 것이 (어떤 방법으로든) 입증될 수 있는 경우write()
다른 프로세스에서 호출이 이루어지더라도 이를 반영해야 합니다. 동일한 파일 위치에 대한 여러 쓰기 작업에도 유사한 요구 사항이 적용됩니다.
fsync
전화할 필요가 없습니다. Linux 및 Unix의 많은 프로그램에서는 정확성과 일관성을 보장하기 위해 이것이 필요하므로 올바르게 구현하지 못하는 것은 심각한 결함입니다.