Linux에서는 명시적인 동기화 없이 런타임 시 파일에 대한 별도의 IO 액세스 차단이 일관됩니까?

Linux에서는 명시적인 동기화 없이 런타임 시 파일에 대한 별도의 IO 액세스 차단이 일관됩니까?

동시 정전이 실제로 문제가 되지 않을 때 실제로 얼마나 자주 sync 또는 fsync 작업을 실행해야 하는지 파악하려고 합니다. 저는 특정 파일 시스템에서 제공하는 기능이 아닌 Linux 커널이나 Posix 또는 glibc API가 런타임에 제공할 수 있는 보장을 찾고 있습니다.

함수 a()가 파일을 열고 데이터를 쓴 다음 모두 기본 차단 IO를 사용하여 파일을 닫으면 디스크에 명시적으로 동기화하지 않고 파일을 열기 위한 나중에 호출을 위해 해당 데이터가 보장됩니까? 디스크 캐시 또는 VFS 계층은 나중에 읽기 위해 해당 파일 이름을 열기 위해 b() 함수를 호출하는 경우 fsync()가 열리기 전에 sync()가 호출되었을 때와 동일한 데이터가 표시되도록 보장합니까? 아니면 다른 코드 블록에서 읽을 데이터에 대해 항상 동기화를 호출해야 합니까?

답변1

POSIX는 reada 이후에 발생하는 모든 이벤트가 write새로운 데이터를 볼 수 있도록 보장합니다. ~에서기준:

read()파일 데이터의 a가 write()데이터의 a 다음에 발생한다는 것이 (어떤 방법으로든) 입증될 수 있는 경우 write()다른 프로세스에서 호출이 이루어지더라도 이를 반영해야 합니다. 동일한 파일 위치에 대한 여러 쓰기 작업에도 유사한 요구 사항이 적용됩니다.

fsync전화할 필요가 없습니다. Linux 및 Unix의 많은 프로그램에서는 정확성과 일관성을 보장하기 위해 이것이 필요하므로 올바르게 구현하지 못하는 것은 심각한 결함입니다.

관련 정보