W systemie Windows 7, przy użyciu Menedżera urządzeń, przywołując właściwości dysku i przechodząc do karty Zasady, dostępne są 2 elementy przełączania. Pamięć podręczna zapisu, o której nie chodzi w tym pytaniu.
i
[X] Wyłącz opróżnianie bufora pamięci podręcznej zapisu systemu Windows na urządzeniu <--- tylko to!
Microsoft umieszcza zastrzeżenie na karcie dla tego elementu. „Aby zapobiec utracie danych, nie zaznaczaj tego pola wyboru, chyba że urządzenie ma osobne źródło zasilania, które pozwala mu opróżnić bufor w przypadku utraty zasilania.”
Mówiąc najprościej, co to zmienia w przypadku zapisywania, zapisywania i kopiowania plików?
1. Zmiana akcji zapisu dla programów paranoicznych: (fakt czy fikcja)
Czy zmienia to sposób, w jaki operacje czyszczenia pamięci działają w przypadku programu, który wymusza wykonanie operacji czyszczenia pamięci podręcznej? Niektóre programy są bardzo skupione na zakończeniu zapisu, bez spekulacji, czy te programy są w stanie kontynuować swój zapis ochronny, czy też zmienia się to również w przypadku tych programów?
2. Rodzaje realizowanych programów:
Jakie są rodzaje działań / programów, które zostałyby lub nie zostałyby wprowadzone przez zmianę? Pisz, niektóre programy przesyłają strumieniowo, niektóre wykonują szybkie zapisywanie, niektóre są ciągłe, niektóre mają charakter ochronny (lub każdy inny rodzaj, który można zdefiniować w prosty sposób).
3. Czy widziałeś cokolwiek, a nawet punkt odniesienia:
Jeśli ustawienie jest włączone, jakie są obserwowalne zmiany w piśmie? Wszelkie luźne przykłady zaobserwowanej zmiany zachowania. lub nie zauważyłeś żadnych zmian w zachowaniu?
4. Co to jest zatrzymanie lub opóźnienie:
Wiemy, że większość tych działań jest bardzo szybka na większości komputerów, Dane zostaną ostatecznie zapisane. Czy w stosunku do prędkości napędu ilość czasu jest znacząca?
Na potrzeby mojego pytania istniejące ryzyko nie jest jednym z pytań, jeśli chciałbyś je ująć, nie przeszkadzałoby.
Co oznacza „Opróżnianie bufora pamięci podręcznej zapisu”, jest prawie duplikatem tego, ale link dotyczy innego systemu operacyjnego. Chociaż A ma pewne informacje, nawet termin użyty w łączu nie jest taki sam. Nie odpowiada również na najważniejsze rzeczy, które użytkownik chciałby wiedzieć, o których starałem się tutaj nakreślić.
źródło
Odpowiedzi:
Twoje twierdzenie w pierwszym pytaniu to fikcja. Windows API wywołuje takie jak będzie nadal zapewniają, że dane pobiera się całą drogę do mediów fizycznych, nawet przy zapisie buforowym spłukiwania wyłączone. Programy, które są „bezpieczne” i wiedzą, co robią, będą w porządku. Połączenia takie jak .NET itp. Ostatecznie wywołują ten interfejs API.
FlushFileBuffers()
FileStream.Flush()
Programy, które wykonują wiele operacji we / wy dysku bez
FlushFileBuffers()
bezpośredniego wywoływania lub dowolnego interfejsu API pomocnika, który ostatecznie je wywołuje, odnotują najbardziej zauważalny wzrost wydajności. Na przykład, jeśli korzystasz z nieistotnych operacji we / wy, w przypadku gdy dane są zgubione, np. BOINC (jeśli się zgubi, wystarczy pobrać plik lub spróbować ponownie obliczyć obliczenia), możesz uniknąć dzwonieniaFlushFileBuffers()
i po prostu wywołaj interfejs API typuWriteFile()
- dane zostaną zbuforowane do zapisania, ale tak naprawdę nie zostaną zapisane przez potencjalnie długi czas, na przykład gdy deskryptor pliku zostanie zamknięty lub gdy program zakończy działanie. Niestety możliwe jest również, że w przypadku awarii systemu (np. BSOD) wszystkie dane zostaną utracone, więc jest to naprawdę ważneże jeśli masz do czynienia z jakimikolwiek cennymi / niewymiennymi danymi, które wywołujeszFlushFileBuffers()
, niezależnie od tego, czy opróżnianie bufora jest włączone, czy nie! W przeciwnym razie prosty błąd sterownika (na przykład w sterowniku karty graficznej) może spowodować utratę dużej ilości danych.Nie można znaleźć żadnych testów porównawczych, ale zauważysz to bardziej w programach pasujących do opisu w drugim punkcie powyżej.
Synchronizowanie danych na dysku nie jest tak szybkie, szczególnie jeśli odbywa się to często w ciasnej pętli. Domyślnie, jeśli dobrze pamiętam z lektury książek Windows Wewnętrznych, NTFS domyślnie synchronizuje wszystkie brudne bufory systemu plików na dysk co 5 sekund . Jest to najwyraźniej przyzwoity kompromis między stabilnością a wydajnością. Problem z częstą synchronizacją danych polega na tym, że powoduje, że dysk twardy wykonuje wiele prób i zapisów.
Rozważ następujący pseudokod:
Dzięki automatycznemu 5 drugi bufor płukania na :
Z automatyczną 5 drugi bufor płukania off (efekt wyboru w swoim pytaniu):
Biorąc pod uwagę, że zajęty system może wykonywać od setek do dziesiątek tysięcy zapisów do plików na sekundę, jest to świetny sposób na wydajność, szczególnie na tradycyjnych wirujących dyskach twardych (mniej imponujący na dyskach SSD). Pamięć RAM jest ogólnie 20 razy szybsza niż dyski twarde, chociaż ta różnica jest mniejsza w przypadku dysków SSD.
Powodem, dla którego mówią, że powinieneś użyć kopii zapasowej baterii jest to, że nie chcesz mieć 35 minut zapisanych danych buforowanych w pamięci RAM, które nie są zapisywane na dysku tylko dlatego, że twój programista był leniwy i nie zadzwonił
FlushFileBuffers()
, a następnie miał awaria zasilania. Oczywiście zapasowa bateria nie chroni przed błędami sterownika, które powodują BSOD ....źródło
Na poparcie odpowiedzi ChatBota Johna Cavila napisałem mały program testowy:
I uruchom go na dysku Samsung 950pro NVMe z włączoną opcją „Wyłącz opróżnianie bufora pamięci podręcznej zapisu Windows na urządzeniu”.
Wynik to:
Możesz więc zobaczyć, że
FlushFileBuffers
żądanie nie zostało pominięte przez system (system Windows nie ignorujeFlushFileBuffers
połączenia, nawet jeśli opcje są włączone).źródło
swTest
(i dlaczego nie zostało zadeklarowane)? (2) Czy mówisz, że zrobiłeś dwie kopie swojego programu, jedną obejmującąsfTest.Flush()
połączenie, a drugą nie (tj. Z komentarzem) i porównałeś je? Proszę wytłumacz. (3) Znam angielski, ale nie rozumiem twojego ostatniego zdania.FlushFileBuffers
połączenia, nawet jeśli opcje są włączone (widziałem, że inne źródła są smutne, że połączenie zostanie zignorowane, gdy ta opcja zostanie włączona ). Dodam jeszcze kilka komentarzy w odpowiedzi, dzięki :-)