2012-11-27 3 views
1

IRP_MJ_QUERY_INFORMATION에 대한 호출은 Win32의 GetFileInformationByHandle 또는 커널 모드 ZwQueryInformationFile과 같은 함수에 의해 생성됩니다.IRP_MJ_QUERY_INFORMATION으로 인해 얼마나 많은 디스크 활동이 발생합니까?

누군가이 통화로 실제로 어떤 일이 일어 났는지 설명 할 수 있습니까? 내가 전통적인 7200RPM 자기 스토리지 HDD를 가지고 있다고 가정합니다.

자기 회전 드라이브에서 읽을 때 지연이 많이 발생한다는 것은 알고 있지만 IRP_MJ_QUERY_INFORMATION 호출은 응용 프로그램에서 매우 빠르게 보입니다. 프리 페치 캐시의 내용을 검사했는데 거기에서 쿼리하는 파일을 볼 수 없었습니다. 나는 전화가 수없이 많아서 메모리가 어딘가에 캐싱되고 있다고 생각하지만 매우 빨리 해결하고 많은 HDD 활동을 보지 못한다. 이러한 상황에서 실제로 어떤 일이 발생합니까? 파일이 Windows에서 다른 위치에 캐시되고 있습니까? 그렇다면 어떻게 볼 수 있습니까?

내가 아는 거기 HDD의 캐시가 너무하지만 내 이해가 더 읽기 위주 (read-aheads) 등의 버퍼와 같은 역할을한다

편집 : 나는 MSDN에 this 기사를 읽고 있었다 그것은 파일 시스템 메타 데이터는 "제안 항상 캐시 된. ", 나는 파일을 열고 수정할 때"최종 수정 날짜 "와 같은 메타 데이터가 파일 버퍼를 플러시 할 때까지 디스크에 커밋되지 않는다고 가정합니다. 필자의 경우에는 파일을 쿼리하므로 메타 데이터를 변경할 필요가 없습니다. 프로그램에서 만든 정보에 대한 첫 번째 쿼리 후 Windows에서 메타 데이터를 캐시합니까?

+0

일부 프로그램에서는 말 그대로 IRP_MJ_QUERY_INFORMATION 호출을 수천 번 수행하므로 매우 유용합니다. (다른 말로하면 : 예) – Damon

+0

예, 몇 가지 프로그램이 초당 이러한 수천 건의 호출을 수행하므로 어딘가에 캐시되어야합니다. 실제로 무대 뒤에서 실제로 일어나는 일에 대해 더 많은 정보를 알고 싶습니다. – Nathan

답변

1

모든 파일 시스템과 검색되는 정보의 종류에 따라 다릅니다. NTFS에 대해 이야기 해 봅시다. :)

파일을 열면 디렉토리 항목과 파일의 파일 레코드에 포함 된 대부분의 정보가 핸들과 연결된 데이터 구조 (FCB라고 함)에 캐시됩니다.

IRP_MJ_QUERY_INFORMATION이 호출되면이 정보가 FCB에서 사용자 버퍼로 복사됩니다. 그러나 재분석 태그를 검색하는 것과 같은 일은 원래 파일 레코드로 돌아가서 그 정보를 읽어야합니다. 대부분의 경우 해당 레코드는 캐시에 상주합니다 (파일 자체가 열릴 때 액세스되기 때문에).

+0

감사 MJZ. 나는 약간의 독서를했고 나는 당신이 파일 핸들에 대해 이야기하고 있다고 가정하고있다. FCB는 도스 시대 인 것처럼 보인다. 그래서 메타 데이터는 파일 핸들에서 처음 읽은 후에 캐시됩니까? 이 캐시의 내용을 볼 수있는 방법이 있습니까? – Nathan

+0

SysInternals에서 RAMMap이라는 유틸리티를 발견했습니다. 유용한 유틸리티로 가득차 있습니다. 커널 메모리 맵을 시각적으로 잘 보여 주었고 이제 개념을 훨씬 잘 이해하게되었습니다. – Nathan

+0

핸들은 사용자 공간의 것입니다. 프로세스 별 커널 테이블을 통해 커널의 FILE_OBJECT에 매핑됩니다. 개별 파일 시스템은 일반적으로 FCB라고하는 자체 데이터를 압정합니다. 예, 일부 <(대부분의) 메타 데이터가 NTFS에 의해 캐시됩니다. 개인적으로 저장되며 커널 디버거를 사용하는 것 외에 NtQueryInformationFile API를 사용하는 것 이상의 직접 검사 할 방법이 없습니다. – MJZ

관련 문제