W rzeczywistości to, co opisałeś, myli balonowanie i „łączenie tej samej strony”. Spróbuję rozwinąć tę kwestię, aby rozróżnienie było widoczne.
Balonowanie pamięci
Jest to sztuczka, aby upewnić się, że część pamięci przydzielonej maszynie wirtualnej gościa pozostaje użyteczna dla innego gościa lub samego hosta (pamięci podręczne itp.). Odbywa się to w następujący sposób:
Jądro gościa jest wstrzykiwane ze sterownikiem, który monitoruje użycie pamięci gościa i „kradnie” część nieużywanej pamięci (przydzielając ją sobie w przestrzeni pamięci gościa, dzięki czemu nic na tym gościu nie może dotknąć tego zakresu).
Następnie informuje jądro hosta, że w rzeczywistości może usunąć te strony pamięci z rdzenia, że nie będą one używane w gościu (dopóki gość nie doświadczy presji pamięci, w którym momencie balon się opróżni i użyje te zakresy ponownie).
Ostatecznie jądro może przydzielić dokładnie tę samą pamięć innemu gościowi i sprawić, że całe użycie pamięci będzie bardziej wydajne, jeśli goście będą pracować z dużą ilością wolnej pamięci.
Scalanie tej samej strony
Ta technika identyfikuje identyczne strony pamięci, które z jakiegoś powodu nie są już oznaczone jako „quasi-tylko do odczytu” przy kopiowaniu przy zapisie, i oznacza je jako takie.
Teraz na poziomie systemu operacyjnego zapotrzebowanie na tego rodzaju sztuczki jest ograniczone. Po prostu, większość czasu, gdy masz identyczne strony pamięci, są one już tylko do odczytu (czasami nawet bez CoW), ponieważ są to głównie kod aplikacji, biblioteki itp. Są one natywnie otwierane za pomocą mapy pamięci, a zatem jądro może zachować tylko jedna ich kopia w rdzeniu (jeśli w ogóle istnieje, może również całkowicie wydrukować stronę i umożliwić jej stronicowanie ze sklepu podstawowego w razie potrzeby).
Na zwirtualizowanym poziomie systemu operacyjnego ta sama zasada jest właściwie stosowana w każdym podsystemie gościa. Jednak jądro hosta nie ma pojęcia, czy dwóch gości uruchamia w większości ten sam kod, a zatem współużytkuje tę samą pamięć - goście nie komunikują się, aby to skoordynować.
Dlatego czasami może skanować cały system w poszukiwaniu identycznych stron pamięci - przez większość czasu będą one identyczne w systemie operacyjnym gościa, a nie w każdym z nich - jądro gościa wykonuje przyzwoitą pracę, utrzymując czystość pamięci w swoim zasięgu. Zatem w typowym środowisku VM, w którym jedno jądro hosta obsługuje ponad 50 gości, oszczędności pamięci mogą być dość znaczne.
Oba naraz
Balonowanie i scalanie na tej samej stronie mogą współistnieć bardzo dobrze, osiągając dość znaczną pamięć zbyt dużą dla identycznych systemów.
Aby odpowiedzieć na twoje pytanie - funkcja łączenia stron może i czasami jest włączona na poziomie systemu operacyjnego. Ma to związek z interpretowaniem stron, które mogą być identyczne bez tego samego pliku kopii zapasowej.
W twoim przykładzie Chromium - same pliki binarne są już deduplikowane poprzez mapę startową tylko do odczytu - dzielą dokładnie tę samą przestrzeń pamięci. Pamięci podręczne stron (zawartość kart) są zwykle również współużytkowane przez procesy (tylko do odczytu kopiowanie przy zapisie) ze względu na sposób zarządzania pamięcią podręczną dysku - ten sam plik na dysku można otworzyć jednocześnie między różnymi procesami na maszynie wirtualnej -optymalny sens.
Korzyść byłaby najbardziej widoczna w przypadku stanu współdzielenia różnych silników Javascript - ale nie jestem pewien, czy są one przydzielane w dokładnie takim samym układzie pamięci, zapewniając, że cała strona pamięci jest identyczna.
W systemach mobilnych jest inaczej. Na przykład Android intensywnie wykorzystuje KSM do deduplikacji identycznego kodu między różnymi aplikacjami.
W obu przypadkach możesz włączyć go samodzielnie w systemie Linux (Kernel SamePage Scalanie). Sterownik eksportuje różne statystyki, które po przeczytaniu tej odpowiedzi powinny być w stanie zinterpretować i podjąć własną decyzję, czy pasuje ona do twojego celu.
https://www.kernel.org/doc/Documentation/vm/ksm.txt