sync 및 fsync 호출 사용

O_SYNC 또는 O_DSYNC를 사용하여 파일을 열 경우, 쓰기가 리턴되기 전에 각 쓰기에 필요한 데이터가 삭제되어 디스크로 이동합니다. 쓰기로 인해 새 디스크가 할당되면(기존 페이지를 겹쳐쓰는 대신 파일이 확장됨) 쓰기에 해당하는 JFS 로그 쓰기가 발생합니다.

실제 메모리 및 디스크 내용의 강제 동기화는 다음과 같은 여러 방법으로 발생합니다.

  • 애플리케이션 프로그램이 지정된 파일에 대해 fsync() 호출을 작성합니다. 그러면 해당 파일의 수정된 데이터가 들어 있는 모든 파일이 디스크에 기록됩니다. fsync() 호출이 프로그램에 리턴되면 쓰기가 완료됩니다.
  • 애플리케이션 프로그램이 sync() 호출을 작성합니다. 그러면 수정된 데이터가 들어 있는 메모리의 모든 파일 페이지가 디스크에 쓸 수 있도록 스케줄링됩니다. sync() 호출이 프로그램에 리턴될 때 쓰기가 반드시 완료되는 것은 아닙니다.
  • 사용자가 sync 명령을 입력하고 sync() 호출을 발행합니다. 이 경우에도 사용자에게 입력 프롬프트가 표시될 때(또는 쉘 스크립트의 다음 명령이 처리될 때) 일부 쓰기가 완료되지 못할 수 있습니다.
  • usr/sbin/syncd 디먼이 일정한 간격(보통 60초)으로 sync() 호출을 발행합니다. 그러면 시스템이 대량의 데이터를 누적하지 않으므로 소멸성 RAM에만 데이터가 존재합니다.

동기화 조작은 CPU를 적게 사용하는 것 외에도 여러 가지 효과를 제공합니다.

  • 쓰기를 분산시키기 보다는 한 곳으로 응집시킵니다.
  • 이전의 sync 조작 이후로 입출력 활동이 없더라도 28KB의 시스템 데이터를 기록합니다.
  • 디스크에 데이터를 기록하는 속도가 빨라지므로 후행 쓰기 알고리즘이 무시됩니다. 이 영향은 모든 쓰기 다음에 fsync() 호출을 발행하는 프로그램에서 특히 중요합니다.
  • sync() 또는 fsync() 호출이 발생하면 수정된 데이터가 디스크에 확정되었음을 나타내기 위해 로그 레코드가 JFS 로그 장치에 기록됩니다.