Linux에서 단일 파일에 대해 더티 페이지가 디스크에 다시 기록되는 순서는 무엇입니까? 처음부터 끝까지인가요, 아니면 엉망인가요?
시나리오 1: 적용 범위 없음
(디스크에) 파일을 생성하고 대량의 데이터를 빠르게(순차적으로) 씁니다. 이제 나는 이것이 여러 페이지 캐시에 있을 것이라고 가정합니다. 더티 페이지를 다시 쓸 때 페이지가 순서대로 다시 쓰여지나요?
예를 들어 파일 쓰기가 완료되기 전에 서버가 종료된다고 가정해 보겠습니다.
이제 재부팅 후 디스크 파일을 다음 상태로 둘 수 있습니다.
|--올바른 데이터--|---데이터가 설정되지 않음/쓰레기---|--올바른 데이터--|
즉, 파일의 마지막 바이트 세트가 불완전할 수 있지만 그 사이의 데이터도 불완전할 수 있음을 이해합니다.
시나리오 2: 덮어쓰기(루프/링 버퍼와 같은 것을 사용해 보세요)
- 파일이 생성되고, 데이터가 기록되고, 최대 크기에 도달한 후 "fsync"(즉, 데이터 + 메타데이터 동기화)가 호출됩니다.
- 이제 파일 포인터가 파일의 시작 부분으로 이동하고 데이터가 순차적으로 기록됩니다. (fsync가 완료되지 않음)
이제 서버가 다운됐으니 다시 시작하면 디스크 파일을 다음과 같은 상태로 만들 수 있을까요?
|--Newly written data--|--Old data--|--New data--|...
즉, 새 데이터의 경우 일부 페이지가 순서 없이 디스크에 기록됩니다.
또는
나는 항상 그럴 것이라고 추측할 수 있다
|--새로 작성된 데이터---|----새로 작성된 데이터---|--기존 데이터--|
즉, 이전 데이터와 새 데이터가 혼동되지 않습니다(이전 데이터는 파일이 있는 경우 파일 끝에만 표시됩니다).