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.
W tym temacie opisano różne zagadnienia dotyczące kontroli buforowania plików przez aplikację, znanego również jako niebuforowane operacje We/Wy plików. Buforowanie plików jest zwykle obsługiwane przez system w tle i jest uznawane za część buforowania plików w systemie operacyjnym Windows, chyba że określono inaczej. Mimo że terminy keszowania i buforowania są czasami używane zamiennie, w tym temacie używa się terminu buforowania w szczególności w kontekście wyjaśniania sposobu interakcji z danymi, które nie są buforowane przez system (tj. nie są keszowane), gdzie w przeciwnym razie są one w dużej mierze poza bezpośrednią kontrolą aplikacji działających w trybie użytkownika.
Przegląd
Podczas otwierania lub tworzenia pliku za pomocą funkcji CreateFile można określić flagę FILE_FLAG_NO_BUFFERING , aby wyłączyć buforowanie danych odczytywanych lub zapisywanych w pliku. Mimo że zapewnia to pełną i bezpośrednią kontrolę nad buforowaniem we/wy danych, w przypadku plików i podobnych urządzeń istnieją wymagania dotyczące wyrównania danych, które należy rozważyć.
Uwaga / Notatka
Te informacje dotyczące wyrównania dotyczą operacji we/wy na urządzeniach, takich jak pliki, które obsługują wyszukiwanie, oraz koncepcję wskaźników położenia pliku (lub przesunięć). W przypadku urządzeń, które nie wykonują operacji wyszukiwania, takich jak nazwane potoki lub urządzenia komunikacyjne, wyłączenie buforowania może nie wymagać żadnego konkretnego wyrównania. Wszelkie ograniczenia lub efektywność, które mogą zostać uzyskane przez dostosowanie w tym przypadku, są zależne od podstawowej technologii.
W prostym przykładzie aplikacja otworzy plik na potrzeby dostępu do zapisu z flagą FILE_FLAG_NO_BUFFERING , a następnie wykona wywołanie funkcji WriteFile przy użyciu buforu danych zdefiniowanego w aplikacji. Ten bufor lokalny jest w tych okolicznościach jedynym buforem plików, który istnieje dla tej operacji. Ze względu na układ dysku fizycznego, układ magazynowania systemu plików i śledzenie pozycji wskaźnika plików na poziomie systemu, ta operacja zapisu zakończy się niepowodzeniem, chyba że lokalnie zdefiniowane bufory danych spełniają określone kryteria wyrównania, omówione w poniższej sekcji.
Uwaga / Notatka
Dyskusja na temat buforowania nie uwzględnia buforowania sprzętowego na samym dysku fizycznym, co nie jest gwarantowane w ramach bezpośredniej kontroli systemu w każdym przypadku. Nie ma to wpływu na wymagania określone w tym temacie.
Aby uzyskać więcej informacji na temat interakcji FILE_FLAG_NO_BUFFERING z innymi flagami powiązanymi z pamięcią podręczną, zobacz CreateFile.
Wymagania dotyczące wyrównania i dostępu do plików
Jak wspomniano wcześniej, aplikacja musi spełniać pewne wymagania podczas pracy z plikami otwartymi za pomocą FILE_FLAG_NO_BUFFERING. Mają zastosowanie następujące szczegółowe informacje:
- Rozmiary dostępu do plików, w tym opcjonalne przesunięcie pliku w strukturze OVERLAPPED, jeśli to określono, muszą być liczbą bajtów, która stanowi całkowitą wielokrotność rozmiaru sektora woluminu. Na przykład jeśli rozmiar sektora wynosi 512 bajtów, aplikacja może zażądać odczytów i zapisów 512, 1024, 1536 lub 2048 bajtów, ale nie 335, 981 lub 7171 bajtów.
- Adresy bufora dostępu do plików dla operacji odczytu i zapisu powinny być wyrównane względem sektora fizycznego, co oznacza wyrównanie do adresów w pamięci będących całkowitymi wielokrotnościami rozmiaru fizycznego sektora woluminu. W zależności od dysku to wymaganie może nie być wymuszane.
Deweloperzy aplikacji powinni zwrócić uwagę na nowe typy urządzeń pamięci masowej wprowadzanych na rynek z rozmiarem sektora nośników fizycznych 4096 bajtów. Nazwa branżowa tych urządzeń to "Format zaawansowany". Ponieważ mogą wystąpić problemy ze zgodnością z bezpośrednim wprowadzeniem 4096 bajtów jako jednostki adresowania dla nośnika, tymczasowe rozwiązanie zgodności polega na wprowadzeniu urządzeń, które emulują zwykłe urządzenie magazynu sektora 512-bajtowego, ale udostępniają informacje o prawdziwym rozmiarze sektora za pomocą standardowych poleceń ATA i SCSI.
W wyniku tej emulacji istnieją zasadniczo dwa rozmiary sektorów, które deweloperzy będą musieli zrozumieć:
- Sektor logiczny: jednostka używana do adresacji bloków logicznych nośnika. Możemy również traktować ją jako najmniejszą jednostkę zapisu, którą magazyn może zaakceptować. Jest to "emulacja".
- Sektor fizyczny: jednostka, dla której operacje odczytu i zapisu na urządzeniu są wykonywane w ramach jednej operacji. Jest to jednostka atomowego zapisu, do której muszą być dostosowane niebuforowane operacje we/wy, aby uzyskać optymalną charakterystykę wydajności i niezawodności.
Większość bieżących interfejsów API systemu Windows, takich jak IOCTL_DISK_GET_DRIVE_GEOMETRY i GetDiskFreeSpace, zwróci rozmiar sektora logicznego, ale rozmiar sektora fizycznego można pobrać za pomocą kodu sterującego IOCTL_STORAGE_QUERY_PROPERTY z odpowiednimi informacjami zawartymi w członie BytesPerPhysicalSector w strukturze STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Przykładowy kod można znaleźć na stronie STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Microsoft zdecydowanie zaleca, aby deweloperzy dostosowali niebuforowane operacje we/wy do rozmiaru sektora fizycznego zgłaszanego przez kod kontrolny IOCTL_STORAGE_QUERY_PROPERTY, aby zapewnić, że ich aplikacje są przygotowane na zmianę tego rozmiaru sektora.
Windows Server 2003 i Windows XP: Struktura STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR nie jest dostępna. Wprowadzono go w systemach Windows Vista i Windows Server 2008.
Ponieważ adresy buforów dla operacji odczytu i zapisu muszą być wyrównane do granic sektorów, aplikacja musi mieć bezpośrednią kontrolę nad sposobem przydzielania tych buforów. Jednym ze sposobów wyrównania buforów do sektora jest użycie funkcji VirtualAlloc do ich przydzielenia. Rozważ następujące kwestie:
- Funkcja VirtualAlloc przydziela pamięć, która jest wyrównana na adresach będących wielokrotnościami rozmiaru strony systemu. Rozmiar strony to 4096 bajtów w systemach opartych na architekturze x64 i x86 lub 8 192 bajtów dla systemów opartych na Itanium. Aby uzyskać dodatkowe informacje, zobacz funkcję GetSystemInfo .
- Rozmiar sektora wynosi zazwyczaj od 512 do 4096 bajtów dla urządzeń magazynujących z bezpośrednim dostępem (dysków twardych) i 2048 bajtów dla dysków CD-ROM.
- Rozmiary stron i sektorów są potęgami liczby 2.
W związku z tym w większości sytuacji pamięć wyrównana do strony będzie również wyrównana do sektora, ponieważ sytuacja, w której wielkość sektora jest większa niż rozmiar strony, jest rzadka.
Innym sposobem uzyskania ręcznie wyrównanych buforów pamięci jest użycie funkcji _aligned_malloc z biblioteki C Run-Time. Aby zapoznać się z przykładem ręcznego sterowania wyrównaniem buforu, zobacz przykładowy kod języka C++ w sekcji Przykładowy kod w pliku WriteFile.