Jaka jest filozofia takiego podejścia?
Wydajność (lepsze wykorzystanie charakterystyki dysku) i wydajność (pozwala aplikacji kontynuować działanie natychmiast po zapisie).
Dlaczego dane nie są zapisywane od razu?
Główną zaletą jest to, że system operacyjny może dowolnie zmieniać kolejność i łączyć ciągłe operacje zapisu, aby poprawić wykorzystanie przepustowości (mniej operacji i mniej prób). Dyski twarde działają lepiej, gdy żądana jest niewielka liczba dużych operacji, podczas gdy aplikacje zwykle wymagają dużej liczby małych operacji. Inną wyraźną optymalizacją jest to, że system operacyjny może również usuwać wszystkie zapisy oprócz ostatniego, gdy ten sam blok jest zapisywany wiele razy w krótkim czasie, a nawet usuwać niektóre zapisy razem, jeśli plik, którego dotyczy problem, został w międzyczasie usunięty.
Te asynchroniczne zapisy są zrobione powrite
powrócił wywołanie systemowe. To druga i najbardziej widoczna zaleta dla użytkownika. Zapisy asynchroniczne przyspieszają aplikacje, ponieważ mogą swobodnie kontynuować pracę bez czekania, aż dane faktycznie znajdą się na dysku. Ten sam rodzaj buforowania / buforowania jest również implementowany w operacjach odczytu, w których bloki ostatnio lub często odczytywane są zachowywane w pamięci zamiast ponownego odczytu z dysku.
Czy nie ma niebezpieczeństwa, że zapis nie powiedzie się z powodu błędu IO?
Niekoniecznie. Zależy to od używanego systemu plików i wprowadzonej nadmiarowości. Błąd we / wy może być nieszkodliwy, jeśli dane można zapisać w innym miejscu. Nowoczesne systemy plików, takie jak ZFS, samoleczą uszkodzone bloki dysków. Należy również pamiętać, że błędy we / wy nie powodują awarii nowoczesnych systemów operacyjnych. Jeśli zdarzają się one podczas dostępu do danych, są po prostu zgłaszane do aplikacji, której dotyczy problem. Jeśli zdarzają się one podczas strukturalnego dostępu do metadanych i narażają system plików na ryzyko, może on zostać ponownie zamontowany w trybie tylko do odczytu lub stać się niedostępny.
Istnieje również niewielkie ryzyko utraty danych w przypadku awarii systemu operacyjnego, przerwy w dostawie prądu lub awarii sprzętu. Z tego powodu aplikacje, które muszą mieć 100% pewności, że dane znajdują się na dysku (np. Bazy danych / aplikacje finansowe), wykonują mniej wydajne, ale bezpieczniejsze zapisy synchroniczne. Aby złagodzić wpływ na wydajność, wiele aplikacji nadal używa zapisów asynchronicznych, ale ostatecznie synchronizuje je, gdy użytkownik jawnie zapisuje plik (np. Vim, edytory tekstu).
Z drugiej strony ogromna większość użytkowników i aplikacji nie potrzebuje ani nie dba o bezpieczeństwo zapewniane przez zapisy synchroniczne. W przypadku awarii lub awarii zasilania jedynym ryzykiem jest często utrata w najgorszym przypadku ostatnich 30 sekund danych. O ile nie dojdzie do transakcji finansowej lub czegoś podobnego, co oznaczałoby koszt znacznie dłuższy niż 30 sekund ich czasu, ogromny wzrost wydajności (co nie jest złudzeniem, ale bardzo realne) zapisów asynchronicznych pozwala znacznie przewyższyć ryzyko.
Wreszcie, synchroniczne zapisy nie wystarczą do ochrony zapisanych danych. Jeśli Twoja aplikacja naprawdę musi upewnić się, że jej dane nie zostaną utracone, cokolwiek się stanie, należy zastosować replikację danych na wielu dyskach i w wielu lokalizacjach geograficznych, aby były odporne na katastrofy takie jak pożar, powódź itp.