Przeglądałem artykuł wyjaśniający procedurę hibernacji w systemie Microsoft Windows. Główne punkty, które z tego wyciągam, to:
- Windows zrzuca całą pamięć RAM (może po przetworzeniu) do
hiberfil.sys
pliku. - Podczas rozruchu plik hibernacji jest odczytywany, a zawartość jest ładowana do pamięci RAM.
Moje pytanie brzmi: kiedy zwykle kopiuję plik o rozmiarze, powiedzmy 1 GB, jego ukończenie zajmuje około 2 minut .
Jednak gdy system Windows zapisuje plik hibernacji (podczas procedury hibernacji), cały proces może potrwać 10–15 sekund. Dlaczego jest taka różnica w szybkości pisania?
Mój rozmiar RAM to 4 GB. (Nie mówię o technologii szybkiego rozruchu.)
Benchmarki:
- Kopiowanie pliku 1 GB z dysku 1 na dysk 2 (zewnętrzny): 2,3 minuty.
- Hibernacja systemu: 15 sekund.
fsutil
.Odpowiedzi:
To prawdopodobnie trzykrotna odpowiedź.
Jedną z rzeczy, które mogą tu być odtwarzane, jest nowy system Hybrid Shutdown w systemie Windows, który skutecznie zamyka aplikacje, wylogowuje, a następnie przechodzi w stan hibernacji rdzenia systemu operacyjnego. Już zapisanie tych danych oznaczałoby, że nie trzeba „ponownie hibernować” ich potencjalnie.
Drugą rzeczą byłoby to, że hibernacja nie musiałaby zapisywać stron pamięci, które albo są stronicowane do pliku wymiany, albo nie są w użyciu (byłby to jeden z powodów agresywnego wypełnienia pliku wymiany i przechowywania danych również w pamięci) .
Trzecim byłoby skompresowanie danych pliku hibernacji . Połącz to z moim drugim punktem, a jeśli masz tylko mały zestaw danych do wyeksportowania, który zawiera wysoce kompresowalne dane (pliki wykonywalne są ogólnie dobrze skompresowane), wówczas ilość danych, które mają zostać przesłane do pliku hibernacji, może być znacznie mniejsza niż zestaw roboczy danych. Należy zauważyć, że, jak stwierdzono w komentarzach, pamięci podręczne plików i inne niepotrzebne dane bufora można łatwo usunąć bez negatywnego wpływu, aby zmniejszyć ilość danych, które należy zrzucić do pliku hibernacji.
Ponadto obecne dyski twarde są dość szybkie. Z dyskiem, który ma ciągły zapis rzędu 100 MB / s, będziesz mógł wypisać (nieskompresowane) 4 GB pamięci RAM w mniej niż minutę. Ponieważ hibernację można wykonać jako ostatnią rzecz po zawieszeniu wszystkich procesów użytkownika i przed zawieszeniem procesora, system operacyjny będzie na ogół miał pełną prędkość zapisu na dysku. Jest to jedna rzecz, której nie będzie miał Twój prosty test porównawczy, a kopiowanie z dysku na dysk będzie potencjalnie wolniejsze niż zwykłe zapisywanie pamięci RAM na dysku.
Połącz te rzeczy, a ilość danych, które zostaną zapisane w pliku hibernacji, może być dość mała, potencjalnie rzędu 1 GB i prawdopodobnie zostanie zapisana w jednym dużym ciągłym bloku w niecałe 10 sekund.
źródło
Po pierwsze, ilość pamięci RAM, którą należy zapisać, jest zaskakująco mała. W rzeczywistości tylko zestaw zmapowanych brudnych stron („leniwe zapisywanie”) musi zostać wyczyszczony, a także wszystkie prywatne strony, które zostały zapisane i przeniesiono kod wykonywalny.
Po drugie, w przeciwieństwie do kopiowania pliku, zrzut zestawu stron pamięci RAM, które należy zapisać na dysku, jest pojedynczym sekwencyjnym, ciągłym zapisem z punktu widzenia napędu. Win32 API nawet udostępnia funkcję poziomu użytkownika dla tej samej operacji. Zebranie zapisu jest bezpośrednio obsługiwane przez sprzęt i działa tak szybko, jak dysk jest fizycznie w stanie przyjąć dane (kontroler bezpośrednio pobierze dane przez DMA).
Jest wiele warunków wstępnych, aby to działało (takie jak wyrównanie, rozmiar bloku, przypinanie), i nie działa dobrze z buforowaniem i nie ma czegoś takiego jak „leniwy zapis zwrotny” (który jest bardzo pożądaną optymalizacją podczas normalnej pracy ).
To jest powód, dla którego nie każdy piszetak działa cały czas. Jednak gdy system zapisuje plik hibernacji, wszystkie warunki wstępne są spełnione automatycznie (wszystkie dane są wyrównane, mają rozmiar strony i są przypięte), a buforowanie stało się nieistotne, ponieważ komputer zostanie za chwilę wyłączony.
Po trzecie, wykonanie pojedynczego zapisu ciągłego jest bardzo korzystne zarówno dla dysków wirujących, jak i dysków półprzewodnikowych.
Plik wymiany i plik hibernacji są zwykle jednymi z najwcześniejszych plików utworzonych i zarezerwowanych na dysku. Zwykle mają jeden, najwyżej dwa fragmenty. Tak więc, chyba że sektory zostaną uszkodzone, a dysk nie będzie musiał ponownie przypisać sektorów fizycznych, logiczny zapis sekwencyjny przekłada się na fizyczny zapis sekwencyjny na wirującym dysku.
Żadne operacje odczytu-modyfikacji-zapisu nie są konieczne na dysku, gdy zapisywana jest ogromna ilość ciągłych, ciągłych danych. Ten problem jest mniej wyraźny na wirujących dyskach twardych, które mogą zapisywać pojedyncze sektory, które są dość małe (pod warunkiem, że nie zapisujesz pojedynczych bajtów, co zwykle zapobiega buforowaniu, urządzenie nie musi pobierać oryginalnej zawartości i zapisywać zmodyfikowanej wersji). .
Jest to jednak coś, co jest bardzo zauważalne na dysku SSD, gdzie każdy zapis oznacza, że np. Blok 512 kB (który jest zwykłą liczbą, ale może być większy) musi zostać odczytany i zmodyfikowany przez kontroler i zapisany z powrotem do innego blok. Chociaż możesz w zasadzie pisać do (ale nie nadpisywać)) mniejsze jednostki na dyskach flash, zawsze możesz usunąć tylko ogromne bloki, tak działa sprzęt. To jest powód, dla którego dyski SSD radzą sobie o wiele lepiej w przypadku dużych zapisów sekwencyjnych.
źródło
W czasie hibernacji nie zrzuca całej pamięci RAM.
Będzie już miała dużą część pamięci RAM już zduplikowaną na dysku. Pozwala to nie tylko na szybką hibernację, ale także na szybkie udostępnienie pamięci dla nowych programów (dzięki czemu można je szybko uruchomić).
Dlatego musi napisać tylko niewielką część 4 GB i można to zrobić w 10-15 sekund.
Z Microsoft :
źródło
Oprócz wszystkich powyższych, myślę, że w grę wchodzi kilka innych czynników.
Jednym z nich jest to, że podczas kopiowania pliku należy go odczytać i zapisać; Hybernation wymaga tylko zapisu pliku. Z definicji jest już w pamięci!
Ściśle związane z tym, podczas odczytywania pliku i zapisywania go w tym samym czasie, w celu zaoszczędzenia pamięci, proces polega na: odczytaniu fragmentu, napisaniu fragmentu, aktualizacji katalogu (aby pokazać nowy rozmiar); przeczytaj fragment, napisz fragment, zaktualizuj katalog.
Za każdym razem, gdy przenosisz się z jednej części dysku do drugiej (np. Odczytaj plik a, aby zapisać plik b, napisz plik b, aby zapisać katalog i napisz katalog, aby odczytać następny fragment), dysk musi szukać - przesuń głowice, pozwól głowom osiąść, poczekaj, aż nadejdzie odpowiednia część dysku. Jest to jedna z zalet dysku półprzewodnikowego - wyszukiwanie nie zajmuje w ogóle czasu. Podczas hibernacji dane są zapisywane od końca do końca. Plik hibernacji (wymiany) jest wstępnie przydzielony, więc katalog nie musi być aktualizowany (nie zmieniasz rozmiaru pliku hibernacji, tylko zawartość).
I na koniec, twój komputer zawiesił wszystkie inne zadania - to JEDYNA rzecz, którą robi (wątpię, żeby to miało duże znaczenie, ale na pewno to zrobi!). Nawet rzeczy takie jak zarządzanie pamięcią i przełączanie zadań są zawieszone.
źródło
Wynika to prawdopodobnie z tego, że pamięć RAM ma znacznie szybsze prędkości wejścia / wyjścia niż dysk twardy, więc pamięć RAM może wysyłać zawartość tak szybko, jak dysk twardy może odczytać.
Podczas kopiowania plików ograniczają Cię także różne czynniki - prędkość dysku, jeśli będzie musiał wczytywać i wyjmować ten sam dysk, zajmie to więcej czasu, ograniczona prędkość połączenia (jeśli na dysku zewnętrznym), sprawdzanie go nie zastępuje niczego itp
źródło
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k
i pobierać1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s
, więc wydaje się to możliwe (dodam, że i tak kopiowanie plików w systemie Windows wydaje się niepotrzebnie długo).