파일 캐싱
기본적으로 Windows는 디스크에서 읽고 디스크에 기록되는 파일 데이터를 캐시합니다. 이는 읽기 작업이 실제 디스크가 아닌 시스템 파일 캐시라고 하는 시스템 메모리의 영역에서 파일 데이터를 읽는 것을 의미합니다. 이에 따라 쓰기 작업은 디스크가 아닌 시스템 파일 캐시에 파일 데이터를 쓰고, 이 유형의 캐시를 쓰기 저장 캐시라고 합니다. 캐싱은 파일 개체별로 관리됩니다.
캐싱은 windows가 실행되는 동안 지속적으로 작동하는 캐시 관리자지시에 따라 발생합니다. 시스템 파일 캐시의 파일 데이터는 운영 체제에 의해 결정되는 간격으로 디스크에 기록되며, 이전에 해당 파일 데이터에 사용된 메모리가 해제됩니다. 이를 캐시에 플러시라고 합니다. 캐시가 플러시될 때까지 파일에 대한 데이터 쓰기를 지연하고 캐시에 보관하는 정책을 지연 쓰기라고 하며 캐시 관리자는 결정적 시간 간격으로 트리거합니다. 파일 데이터 블록이 플러시되는 시간은 부분적으로 캐시에 저장된 시간과 읽기 작업에서 데이터에 마지막으로 액세스한 이후의 시간을 기반으로 합니다. 이렇게 하면 자주 읽는 파일 데이터가 시스템 파일 캐시에서 최대 시간 동안 계속 액세스할 수 있습니다.
이 파일 데이터 캐싱 프로세스는 다음 그림에 나와 있습니다.
파일 데이터 캐싱 프로세스
이전 그림의 단색 화살표로 표시된 것처럼, 파일 읽기 작업 중 캐시 관리자가 처음 요청할 때 256KB의 데이터 영역이 시스템 주소 공간의 256KB 캐시 "슬롯"으로 읽혀집니다. 그런 다음 사용자 모드 프로세스는 이 슬롯의 데이터를 자체 주소 공간에 복사합니다. 프로세스가 데이터 액세스를 완료하면 프로세스 주소 공간과 시스템 캐시 사이의 점선 화살표에 표시된 것처럼 변경된 데이터를 시스템 캐시의 동일한 슬롯에 다시 씁니다. 캐시 관리자가 특정 시간 동안 데이터가 더 이상 필요하지 않음을 확인하면 시스템 캐시와 디스크 사이의 점선 화살표에 표시된 것처럼 변경된 데이터를 디스크의 파일에 다시 씁니다.
파일 데이터 캐싱에서 제공하는 I/O 성능 향상의 양은 읽거나 쓰는 파일 데이터 블록의 크기에 따라 달라집니다. 파일 데이터의 큰 블록을 읽고 쓸 때 I/O 작업을 완료하려면 디스크 읽기 및 쓰기가 필요할 가능성이 높습니다. 이러한 종류의 I/O 작업이 증가함에 따라 I/O 성능이 점점 더 손상될 것입니다.
이러한 상황에서는 캐싱을 해제할 수 있습니다. 이 작업은 FILE_FLAG_NO_BUFFERINGCreateFiledwFlagsAndAttributes 매개 변수의 값으로 전달하여 파일을 열 때 수행됩니다. 캐싱을 사용하지 않도록 설정하면 모든 읽기 및 쓰기 작업이 실제 디스크에 직접 액세스합니다. 그러나 파일 메타데이터는 여전히 캐시될 수 있습니다. 메타데이터를 디스크에 플러시하려면 FlushFileBuffers 함수를 사용합니다.
플러시가 발생하는 빈도는 시스템 성능과 시스템 안정성의 균형을 맞추는 중요한 고려 사항입니다. 시스템이 캐시를 너무 자주 플러시하면, 이로 인해 대규모 쓰기 작업의 횟수가 증가하여 시스템 성능이 크게 저하됩니다. 시스템이 충분히 자주 플러시되지 않으면 시스템 메모리가 캐시에 의해 고갈되거나 플러시 전에 갑작스런 시스템 오류(예: 컴퓨터 전원 손실)가 발생할 가능성이 더 큽니다. 후자의 경우 캐시된 데이터가 손실됩니다.
적절한 양의 플러시가 발생하는지 확인하기 위해 캐시 관리자는 1초마다 지연 기록기라는 프로세스를 생성합니다. 지연 기록기 프로세스는 디스크에 기록하기 위해 최근에 플러시되지 않은 페이지의 1/8을 큐에 대기합니다. 최적의 시스템 성능을 위해 플러시되는 데이터의 양을 지속적으로 다시 평가하고, 더 많은 데이터를 작성해야 하는 경우 더 많은 데이터를 큐에 추가합니다. 게으른 작성자들은 임시 파일을 플러시하지 않습니다. 왜냐하면 애플리케이션이나 시스템에 의해 삭제될 것이라고 가정하기 때문입니다.
바이러스 검사 소프트웨어와 같은 일부 애플리케이션에서는 쓰기 작업을 즉시 디스크로 플러시해야 합니다. Windows는 쓰기 캐싱을 통해 이 기능을 제공합니다. 프로세스는 FILE_FLAG_WRITE_THROUGH 플래그를 CreateFile호출에 전달하여 특정 I/O 작업에 대한 쓰기 처리 캐싱을 사용하도록 설정합니다. 쓰기 통과 캐싱을 사용하면 데이터는 캐시에 기록되지만, 캐시 관리자는 지연 기록기를 사용하지 않고 데이터를 즉시 디스크에 씁니다. 프로세스는 FlushFileBuffers 함수를 호출하여 연 파일의 플러시를 강제로 적용할 수도 있습니다.
파일 시스템 메타데이터는 항상 캐시됩니다. 따라서 메타데이터 변경 내용을 디스크에 저장하려면 파일을 플러시하거나 FILE_FLAG_WRITE_THROUGH사용하여 열어야 합니다.