Windows에서 F5를 두 번 누르면 결과가 크게 다른 이유는 무엇입니까?


6

일정 시간 동안 파일에 쓰는 프로세스가 실행 중이라고 가정하십시오. 탐색기 프로세스에서 해당 파일을 강조 표시하면 "현재 크기"가 표시됩니다. 이후 F5 키를 누르면 해당 파일의 현재 크기가 업데이트되지만 놀랍게도 가장 정확한 크기를 보려면 두 번의 키 누름이 필요합니다. F5 키를 한 번 누르면 더 높은 값만 얻을 수 있습니다.

이것은 몇 년 동안 (약하게) 나를 귀찮게 해 왔으며 그 이유를 알고 싶습니다!

(적어도) Windows 7에서는 큰 파일을 다운로드하여 재생할 수 있습니다.


F5를 처음으로 눌렀을 때 파일에 프로세스가 완료되었는지 어떻게 알 수 있습니까? 응용 프로그램에 GUI가있는 경우 표시는 스레드 또는 다른 프로세스가 실제로 파일에 쓰는 스레드와 상관 관계가 없을 수 있습니다.
LawrenceC

이것은 쓰기 프로세스가 진행되는 동안에 만 발생하며 완료된 후에는 발생하지 않습니다. 응용 프로그램 (또는 OS)이 바이트를 주기적으로 (및 선형으로) 파일로 플러시한다고 가정합니다. 나를 귀찮게하는 두 가지 키 누르기 간의 불일치입니다.
Henning Klevjer

@HenningKlevjer 죄송합니다. 완전히하셨습니다. 나는 그것을 테스트하기 위해 일부 프로그램을 작성하고 SysInternals ProcMon으로 디버깅하고 그 이유를 봤습니다. 좋은 질문 감사합니다!
Werner Henze

디스크 캐싱이 제 추측 일 것입니다.
Ƭᴇcʜιᴇ007

답변:


8

Windows가 설명 할 때 Windows가 작동하는 이유를 설명 하는 MSDN 블로그가 있습니다.

먼저 당신이 보는 것은 NTFS에만 있다고하자.

당신이 말한 것을 테스트하기 위해 5 초마다 파일에 40 kB를 쓰는 작은 프로그램을 작성했습니다. 파일은 모든 쓰기 사이에 열려 있습니다. 두 번째 프로그램은 FindFirstFileEx현재 파일 크기를 얻는 데 사용 됩니다. 세 번째 dir로 cmd.exe에서 사용 합니다. 이 설정을 사용하면 설명 내용을 정확하게 볼 수 있습니다.

이 문제의 원인은 NTFS에서 결정한 디자인 결정입니다. NTFS (유닉스 파일 시스템에서와 같이)에서 동일한 파일은 두 개의 디렉토리에있을 수 있습니다. 이것을 하드 링크라고합니다. 즉, 각각 파일에 대한 항목이있는 두 개의 디렉토리가 있고 파일 자체에 특성이있는 디렉토리가 있습니다. 파일 크기는 파일에 속하는 속성이므로 저장됩니다. 그러나 누군가 파일 크기와 같은 속성을 가진 디렉토리의 파일 목록을 원한다면 디렉토리 자체를 읽을뿐만 아니라 모든 파일의 정보를 읽는 경우 성능이 매우 저하됩니다. 한 디렉토리의 데이터는 순차적으로 저장 될 수 있지만 다른 파일의 데이터는 디스크 전체에 분산 될 수 있습니다. 따라서 NTFS는 파일 크기의 복사본을 디렉터리 항목 / 항목에 저장합니다.

당신은 그것을 추측했을 수도 있습니다, 이것은 또한 성능 적중이 있습니다. 같은 파일에 대한 약 10 개의 하드 링크를 생각하십시오. 파일에 쓸 때마다 NTFS가 10 개의 디렉토리 항목을 업데이트하도록 하시겠습니까? 따라서 Vista 이후 두 번째 디자인 결정이 내려졌습니다. 디렉토리 항목의 데이터는 파일을 닫을 때만 업데이트됩니다.

파일에 기록하고 파일을 열린 상태로 유지하는 프로그램을 실행하면 쉽게 확인할 수 있습니다. 실행 dir하면 업데이트 된 크기가 표시되지 않습니다. 또는 메모장으로 파일을 작성하면 (끝 부분에 파일이 닫힘) 즉시 새 파일 크기가 dir탐색기 또는 탐색기에 표시됩니다 .

F5파일 크기를 새로 고치는 데 어떻게 도움이됩니까? 탐색기 는 파일을 내부적으로 열고 닫는 GetNamedSecurityInfo 를 호출 합니다 ( SysInternals Process Monitor 에서 확인할 수 있음 ). 내가 전화하면 GetNamedSecurityInfo내 자신의 프로그램에 다음 전화를 FindFirstFileEx나는 즉시 새 파일 크기를 참조하십시오. 따라서 관찰 된 행동은 이론에서 예상 한대로입니다.

그러나 탐색기에서 새 파일 크기가 즉시 보이지 않는 이유는 무엇입니까? 익스플로러가 먼저 전화 FindFirstFileEx를 한 것 같습니다 GetNamedSecurityInfo. 따라서 탐색기가 이전 크기를 얻은 다음 디렉토리 항목 업데이트를 트리거합니다. dircmd.exe에서 실행 하면 디렉토리 항목에 새 파일 크기가 있음을 알 수 있습니다. 익스플로러가 아직 모르는 것입니다. 탐색기는 F5최신 크기를 얻은 다음 업데이트를 다시 트리거하는 데 1 초가 걸립니다 .

응용 프로그램 개발자의 관점에서 나는 이것이 탐색기 버그라고 생각하지 않을 것입니다-이것은 지원되는 파일 시스템 중 하나의 특별한 경우이며 응용 프로그램은 파일 시스템과 추상화되어야합니다. 그러나 탐색기가 Windows의 일부이므로 Microsoft는 더 나은 사용자 경험을 얻기 위해 더 나은 작업을 수행하고 함수 호출 순서를 변경할 수 있다고 생각하는 경향이 있습니다.

BTW, 매우 흥미로운 질문에 감사드립니다! 나는 그런 NTFS interna를 배운 것을 좋아합니다.


이것은 내가보고있는 것이 아닙니다. 쓰기 과정에서 파일이 열려있는 동안 Explorer에는 두 번의 키 누르기 가 필요합니다 . 구체적인 예로 : 몇 분에 걸쳐 1GB 파일을 다운로드하고 있습니다. 1 분 안에 파일 크기는 100MB입니다. 1 분 더 기다렸다가 F5를 한 번 누르면 파일 크기가 102MB가 될 수 있지만 F5 키를 두 번째로 다시 누르면 200MB가 될 수 있습니다. 방금 발표되었습니다).
Henning Klevjer

@HenningKlevjer 완벽합니다. 첫 번째 키 누름은 크기를 업데이트합니다 (닫기시). 두 번째 키 누르기는 업데이트 된 크기를 읽습니다.
David Schwartz

설명 감사합니다. 이것은 몇 년 동안 나를 괴롭 혔습니다.
Dawn Benton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.