Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy plik jest zapisywany na dysku, czasami nie można zapisać pliku w ciągłych klastrach. Klastry nieciągłe spowalniają proces odczytywania i zapisywania pliku. Im dalej na dysku znajdują się klastry nieciągłe, tym gorzej, ze względu na czas potrzebny na przeniesienie głowicy odczytu/zapisu dysku twardego. Plik z klastrami nieciągłymi jest fragmentowany. Aby zoptymalizować pliki pod kątem szybkiego dostępu, można defragmentować wolumin.
defragmentacja to proces przenoszenia części plików na dysku w celu defragmentowania plików, czyli procesu przenoszenia klastrów plików na dysku, aby były ciągłe. Aby uzyskać więcej informacji, zobacz następujące sekcje:
- defragmentowanie pliku
- Minimalizacja interakcji między defragmentacją a kopiami cieniowymi
- Pliki, strumienie i typy strumieni obsługiwane na potrzeby defragmentacji
Defragmentowanie pliku
W prostym jednozadaniowym systemie operacyjnym oprogramowanie defragmentacji jest jedynym zadaniem i nie ma żadnych innych procesów odczytu z dysku ani zapisu na dysku. Jednak w systemie operacyjnym wielozadaniowym niektóre procesy mogą odczytywać i zapisywać na dysku twardym, podczas gdy inny proces defragmentuje ten dysk twardy. Sztuczka polega na unikaniu zapisu w pliku, który jest defragmentowany bez zatrzymywania procesu zapisu przez bardzo długi czas. Rozwiązanie tego problemu nie jest proste, ale jest możliwe.
Aby umożliwić defragmentację bez konieczności szczegółowej wiedzy na temat struktury dysku systemu plików, udostępniany jest zestaw trzech kodów sterujących. Kody kontrolek zapewniają następujące funkcje:
- Umożliwianie aplikacjom lokalizowania pustych klastrów
- Określanie lokalizacji dysku klastrów plików
- Przenoszenie klastrów na dysku
Kody kontrolne również w sposób przezroczysty obsługują problem hamowania i zezwalania innym procesom na odczytywanie i zapisywanie w plikach podczas ruchów.
Te operacje można wykonywać bez hamowania uruchamiania innych procesów. Jednak inne procesy mają wolniejsze czasy odpowiedzi, gdy dysk jest defragmentowany.
Aby defragmentować plik:
- Użyj kodu sterującego FSCTL_GET_VOLUME_BITMAP, aby znaleźć miejsce na woluminie, który jest wystarczająco duży, aby zaakceptować cały plik.
Notatka
W razie potrzeby przenieś inne pliki, aby zrobić miejsce, które jest wystarczająco duże. W idealnym przypadku po pierwszym rozszerzeniu pliku istnieje wystarczająca liczba klastrów nieprzydzielonych, aby można było przenieść kolejne rozszerzenia do przestrzeni za pierwszym rozszerzeniem.
Użyj kodu sterującego FSCTL_GET_RETRIEVAL_POINTERS, aby uzyskać mapę bieżącego układu pliku na dysku.
Przejrzyj strukturę RETRIEVAL_POINTERS_BUFFER zwróconą przez FSCTL_GET_RETRIEVAL_POINTERS.
Użyj kodu sterującego FSCTL_MOVE_FILE do przemieszczania każdego klastra podczas przeglądania struktury.
Notatka
Może być konieczne odnowienie mapy bitowej lub struktury pobierania albo obu tych elementów w różnym czasie, gdy inne procesy zapisują na dysku.
Dwie operacje używane w procesie defragmentacji wymagają uchwytu do woluminu. Tylko administratorzy mogą uzyskać dojście do woluminu, więc tylko administratorzy mogą defragmentować wolumin. Aplikacja powinna sprawdzić prawa użytkownika, który próbuje uruchomić oprogramowanie defragmentacji i nie powinien zezwalać użytkownikowi na defragmentację woluminu, jeśli użytkownik nie ma odpowiednich praw.
W przypadku używania CreateFile do otwierania katalogu podczas defragmentacji woluminu systemu plików FAT lub FAT32 określ wartość maski dostępu GENERIC_READ. Nie należy określać wartości maski dostępu MAXIMUM_ALLOWED. Jeśli to zrobisz, dostęp do katalogu zostanie odmówiony.
Nie należy próbować przenosić przydzielonych klastrów w systemie plików NTFS, które wykraczają poza zaokrąglony rozmiar pliku klastra, ponieważ wynikiem jest błąd.
Ponowne analizowanie punktów, map bitowych i list atrybutów w woluminach systemu plików NTFS można defragmentować, otwierać do odczytu i synchronizacji oraz nazwać przy użyciu pliku: nazwanazwa:typ składni; na przykład dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT i mrp::$ATTRIBUTE_LIST.
Podczas defragmentowania woluminów systemu plików NTFS defragmentacja klastra wirtualnego poza rozmiarem alokacji pliku jest dozwolona.
Minimalizacja interakcji między defragmentacją a kopiami w tle
Jeśli to możliwe, przenieś dane w blokach wyrównanych względem siebie co 16 kilobajtów (KB). Zmniejsza to narzut związany z kopiowaniem przy zapisie, gdy włączone są kopie w tle, ponieważ zwiększa się przestrzeń dla kopii w tle, a wydajność jest obniżona w przypadku wystąpienia następujących warunków:
- Rozmiar bloku żądania przeniesienia jest mniejszy niż 16 KB.
- Delta przenoszenia nie zwiększa się o 16 KB.
Delta przenoszenia to liczba bajtów między rozpoczęciem bloku źródłowego a rozpoczęciem bloku docelowego. Innymi słowy, blok rozpoczynający się od przesunięcia X (na dysku) można przenieść do przesunięcia początkowego Y, jeśli wartość bezwzględna różnicy między X a Y jest parzystą wielokrotnością 16 KB. Zakładając, że klastry mają rozmiar 4 KB, przejście z klastra 3 do klastra 27 będzie zoptymalizowane, ale przejście z klastra 18 do klastra 24 nie. Należy pamiętać, że mod(3,4) = 3 = mod(27,4). Wybrano mod 4, ponieważ cztery klastry o 4 KB są równoważne 16 KB. W związku z tym wolumin sformatowany z rozmiarem klastra 16 KB spowoduje zoptymalizowanie wszystkich plików do przenoszenia.
Aby uzyskać więcej informacji na temat kopii zapasowych w tle, zobacz Usługa tworzenia kopii woluminów w tle.
Pliki, strumienie i typy strumieni obsługiwane na potrzeby defragmentacji
Większość plików można przenosić przy użyciu kodu sterującego FSCTL_MOVE_FILE, ale nie wszystkie można przenosić. Poniżej znajduje się lista plików, strumieni i typów strumieni (nazywanych również kodami typów atrybutów) obsługiwanych przez FSCTL_MOVE_FILE. Inne pliki, strumienie i typy strumieni nie są obsługiwane przez FSCTL_MOVE_FILE.
Typy strumieni obsługiwane dla dowolnego pliku lub katalogu.
- ::$DATA
- ::$ATTRIBUTE_LIST
- ::$REPARSE_POINT
- ::$EA
- ::$LOGGED_UTILITY_STREAM
Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 i Windows XP: ::$EA i ::$LOGGED_UTILITY_STREAM nie są obsługiwane przed windows 8 i Windows Server 2012
Typy strumieni obsługiwane dla dowolnego katalogu.
- ::$BITMAP
- ::$INDEX_ALLOCATION
Poniżej przedstawiono typy plików systemowych, strumienia i strumienia obsługiwane przez FSCTL_MOVE_FILE w "nazwa pliku:nazwa strumienia:$typename" formacie.
- $MFT::$DATA
- $MFT::$ATTRIBUTE_LIST
- $MFT::$BITMAP
- $AttrDef::$DATA
- $AttrDef::$ATTRIBUTE_LIST
- $Secure:$SDS:$DATA
- $Secure::$ATTRIBUTE_LIST
- $Bezpieczne:$SDH:$PRZYDZIAŁ_INDEKSU
- $Secure:$SDH:$BITMAP
- $Secure:$SII:$INDEX_ALLOCATION
- $Secure:$SII:$BITMAP
- $UpCase::$DATA
- $UpCase::$ATTRIBUTE_LIST
- $Extend:$I30:$INDEX_ALLOCATION
- $Extend::$ATTRIBUTE_LIST
- $Extend:$I30:$BITMAP
- $Extend\$UsnJrnl:$J:$DATA
- $Extend\$UsnJrnl::$ATTRIBUTE_LIST
- $Extend\$UsnJrnl:$Max:$DATA
- $Extend\$Quota:$Q:$INDEX_ALLOCATION
- $Extend\$Quota::$ATTRIBUTE_LIST
- $Extend\$Quota:$Q:$BITMAP
- $Extend\$Quota:$O:$INDEX_ALLOCATION
- $Extend\$Quota:$O:$BITMAP
- $Extend\$ObjId:$O:$INDEX_ALLOCATION
- $Extend\$ObjId::$ATTRIBUTE_LIST
- $Extend\$ObjId:$O:$BITMAP
- $Extend\$Reparse:$R:$INDEX_ALLOCATION
- $Extend\$Reparse::$ATTRIBUTE_LIST
- $Extend\$Reparse:$R:$BITMAP
- $Extend\$RmMetadata:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata:$I30:$BITMAP
- $Extend\$RmMetadata::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair::$DATA
- $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair:$Config:$DATA
- $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Txf:$I30:$BITMAP
- $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
- $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog:$I30:$BITMAP
- $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
- $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST