W jaki sposób pamięć wirtualna faktycznie zwiększa przestrzeń pamięci?


70

Rozumiem, że pamięć wirtualna oszukuje program, wyświetlając więcej pamięci, niż jest w rzeczywistości dostępna.

Ale ostatecznie musi odwzorować adres logiczny na faktycznie fizyczny adres. Jak to zwiększa pamięć?


12
To stara koncepcja. Oryginalną motywacją dla pamięci wirtualnej była forma zarządzania pamięcią, aby zapewnić przestrzeń adresową większą niż pamięć fizyczna. Ale wtedy pamięć była niskiej gęstości i bardzo droga. Obecnie głównym powodem korzystania z pamięci wirtualnej jest bezpieczeństwo procesu.
trociny

2
„A teraz, jak to zwiększa pamięć?”. Nie ma Aplikacja nie zna pamięci fizycznej systemu, tylko pamięć wirtualną, dlatego aplikacja skarży się na brak pamięci, chodzi o pamięć wirtualną, a nie pamięć fizyczną
Ramhound

2
Pamiętaj, że systemy pamięci wirtualnej są dość inteligentne. Jeśli n procesów ma tę samą stronę tylko do odczytu, wszystkie n procesów może korzystać z tej samej strony pamięci fizycznej.
Eric Lippert,

65
Nie myśl o pamięci wirtualnej jako oszukiwaniu czegokolwiek. Pamięć to abstrakcyjna zdolność do przechowywania i pobierania danych . Pamięć wirtualna stanowi implementację tej abstrakcji. To, że część tej abstrakcji jest wspierana przez pamięć RAM, a część przez dysk, jest szczegółem implementacji abstrakcji.
Eric Lippert,

4
@HagenvonEitzen Nie jestem pewien, jak pamięć jest „zawsze” na dysku ... oprócz stron pierwotnie odczytanych z dysku, chyba że strona zostanie zamieniona, jej zawartość nigdy nie może znajdować się na dysku, a dotyczy to zwłaszcza stron, które są przypięte do pamięci, np. ponieważ jest krytyczny dla funkcjonalności jądra.
Michael

Odpowiedzi:


116

To wcale nie zwiększa pamięci fizycznej . Jego celem jest coś zupełnie innego. To, co może zrobić, to udostępnić inne sklepy kopii zapasowych, które pozwalają programom na użycie większej ilości pamięci niż jest to fizycznie dostępne.

Pamięć wirtualna służy do oddzielania i izolowania procesów od siebie, a także umożliwia kierowanie dostępu do pamięci do alternatywnych lokalizacji.

Pamięć wirtualna pozwala systemowi nadać każdemu procesowi własną przestrzeń pamięci odizolowaną od innych procesów. Dzięki programom skutecznie działającym we własnej przestrzeni, daje im to pełny dostęp do całej przestrzeni adresowej, zamiast konieczności obejścia innych programów, które mogą również wymagać użycia „tych samych” adresów. Ma to efekt uboczny polegający na zwiększeniu niezawodności i bezpieczeństwa, ponieważ procesy nie mogą łatwo ze sobą kolidować.

Wirtualna pamięć aplikacji jest tworzona w razie potrzeby. Aplikacja wydaje się (sama w sobie) znajdować się w jednym ciągłym bloku pamięci, ale może być całkowicie rozproszona w pamięci fizycznej.

Pamięć wirtualna pozwala także na przechwytywanie i przekierowywanie dostępu do pamięci, co pozwala nam korzystać z funkcji takich jak plik wymiany. Oznacza to, że możemy wypchnąć części pamięci, które nie były ostatnio używane na dysk i ustawić wskaźnik, który mówi „ten blok pamięci znajduje się w pliku x w lokalizacji y”, a następnie możemy zwolnić pamięć fizyczną obszar do wykorzystania przez inną aplikację. Gdy aplikacja potrzebuje tej pamięci, można ją odczytać z dysku, umieścić w pewnej lokalizacji fizycznej pamięci RAM (potencjalnie innej niż poprzednio) i odwzorować z powrotem w tę samą lokalizację pamięci wirtualnej, co poprzednio.

W ten sam sposób, w jaki wykorzystywany jest plik strony, pamięć wirtualna może również pozwolić systemowi operacyjnemu na efektywne „leniwe” ładowanie bibliotek współdzielonych dla programu. Gdy program główny mówi systemowi operacyjnemu, że chce użyć określonej biblioteki, system operacyjny może zaoszczędzić czas, sprawdzając wymagania dotyczące biblioteki, przydzielając miejsce w obszarze pamięci wirtualnej dla aplikacji, ale zamiast ładować całą bibliotekę w nim może odroczyć ładowanie stron biblioteki z dysku, dopóki nie będą one faktycznie potrzebne. W ten sposób jedynymi częściami biblioteki, które ładują się do pamięci RAM, są te, które są faktycznie używane przez program, części, które nigdy nie są używane, nigdy się nie ładują, więc nie marnuj pamięci RAM.

Stosując te techniki, poprawiamy stabilność systemu i pozwalamy na uruchamianie większej liczby procesów w ograniczonej przestrzeni bez wzajemnego wpływu. Nie „zwiększa pamięci”, ale zamiast tego pozwala nam efektywniej wykorzystywać to, co mamy.

Plik wymiany jest włączona przez systemy pamięci wirtualnej, ale w przeszłości był zdezorientowany jak jest pamięć wirtualna.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Sathyajith Bhat

21

Wyjaśnienie Laika

System będzie musiał mapować każdy adres wirtualny na adres fizyczny, gdy pamięć ta zostanie użyta, ale nie cała pamięć zostanie wykorzystana w tym samym czasie . Załóżmy na przykład, że masz 20 zakładek w przeglądarce, z których każda zajmuje 1 GB pamięci. W systemie operacyjnym bez obsługi pamięci wirtualnej potrzebujesz do tego 20 GB pamięci RAM. Sztuka polega na tym, że nie przeglądasz wszystkich 20 kart jednocześnie, więc system operacyjny z pamięcią wirtualną pozwoli ci korzystać z takiej przeglądarki z zaledwie kilkoma GB pamięci RAM, zamieniając nieaktywne karty na dysk.

Bardziej złożone aspekty

Pamięć wirtualna nie jest używana wyłącznie do wymiany. Jego głównym celem jest w rzeczywistości uniknięcie fragmentacji pamięci RAM, co jest dużym problemem w systemach bez zarządzania pamięcią wirtualną: możesz mieć 1 GB wolnej pamięci RAM, ale jeśli jest w porcjach po 10 MB, aplikacja żądająca 100 MB nie będzie mogła działać .

Z czasem pamięć wirtualna znalazła jeszcze więcej zastosowań, w szczególności losowy dostęp do plików: wiele aplikacji, takich jak bazy danych, stanie się boleśnie powolne, jeśli będą zmuszone do sekwencyjnego odczytu plików i będą działać znacznie szybciej, jeśli system operacyjny pozwoli im udawać, że cały plik się znajduje (wirtualny ) pamięć i optymalizacja We / Wy dysku i buforowanie na podstawie wzorców dostępu.


9
to smutne, że żyjemy w świecie, w którym każda karta przeglądarki wymaga 1 GB pamięci
tbodt

9
@tbodt Obwiniam starożytnych Egipcjan. Gdyby tylko wiedzieli, co robią, oswajając te nieznośne koty!
Dmitrij Grigoryev,

@tbodt To też trochę przesada. Moja przeglądarka z otwartymi 8 kartami zajmuje tylko 500 MB pamięci.
Random832

2
@ Random832 Jasne, że to przesada, choć nie jestem pewien, czy istnieje granica między przesadą a przyszłością. Mój pierwszy komputer miał 32 MB pamięci RAM i mogłem łatwo otworzyć 8 kart w Operze bez zauważalnej zamiany. Teraz zajmuje 500 MB, więc w ciągu kolejnych 20 lat równie dobrze może osiągnąć 8 GB.
Dmitrij Grigoriew

5

Pamięć wirtualna nie zwiększa pamięci, w sensie faktycznego dodawania większej ilości pamięci głównej. Ale MOŻE zwiększyć zakres użytecznych adresów . Można więc mieć działający program składający się z segmentu kodu i segmentu danych (stosu i stosu), a oba mogą zajmować zakres adresów wirtualnych większy niż zakres adresów fizycznych zapewnianych przez fizycznie rzeczywistą przestrzeń pamięci maszyna. Sztuczka polega na tym, że tylko niewielka część tych adresów wirtualnych jest wspierana przez fizyczną pamięć główną w dowolnym momencie [ale ostatecznie wszystko jest wspierane przez pamięć dyskową] . Działa to ze względu na fenomen lokalizacji odniesienia: W dowolnym momencie wykonywane są tylko instrukcje w jednej lub więcej małych, ciągłych sekcjach segmentu programu i obsługiwane są tylko dane w jednej lub więcej małych, sąsiadujących sekcjach segmentu danych [oczywiście zachowanie jest w rzeczywistości bardziej złożone , ale przez większą część czasu jest zgodny z tym wzorem]


4

Rozumiem, że pamięć wirtualna oszukuje program, wyświetlając więcej pamięci, niż jest w rzeczywistości dostępna.

Oryginalną motywacją dla pamięci wirtualnej była forma zarządzania pamięcią, aby zapewnić przestrzeń adresową większą niż pamięć fizyczna.
Oprogramowanie może wykorzystać pełną przestrzeń adresową procesora (np. Przestrzeń adresową 2 ^ 32), podczas gdy rzeczywista zainstalowana pamięć fizyczna stanowi zaledwie ułamek tej liczby.
Duże programy mogą być przenośne wśród komputerów, które korzystały z pamięci wirtualnej bez nakładania ogromnych (zainstalowanych) wymagań dotyczących pamięci.
To wykorzystanie pamięci wirtualnej powróciło w czasach komputerów mainframe i pamięci z rdzeniem ferrytowym (która była fizycznie niska i kosztowna).

Ale ostatecznie musi odwzorować adres logiczny na faktycznie fizyczny adres. Jak to zwiększa pamięć?

Pamięć wirtualna ewoluowała od techniki zapewniającej więcej przestrzeni adresowej dla programu.
Pamięć wirtualna jest kluczowym elementem zapewniającym bezpieczeństwo każdemu procesowi we współczesnych systemach operacyjnych, dzięki czemu proces nie może zakłócać innego procesu ani nie może być zagrożony przez inny proces.
Ale przetwarzanie wieloprocesowe (nie mylić z procesami wieloprocesowymi ) z pamięcią wirtualną nadal zapewnia bardziej widoczną pamięć dla systemu niż pamięć fizyczna.

Każdy utworzony proces ma własną wirtualną przestrzeń adresową, tj. Własną pamięć wirtualną.
Ilość pamięci fizycznej, która jest faktycznie używana (i mapowana do pamięci wirtualnej) do każdego procesu, jest dynamiczna. Zazwyczaj tylko pamięć wirtualna zawierająca kod (aka tekst) i strony / segmenty danych do wykonania procesu jest odwzorowywana na pamięć fizyczną (aka rezydentną w pamięci).

Nieistotny kod (ponieważ nie jest obecnie wykonywany) i dane (ponieważ nie są przywoływane / przetwarzane) nie muszą być rezydentne przez cały czas. Strony i segmenty kodu i / lub danych można „zamienić” na magazyn kopii zapasowych (np. Przestrzeń wymiany lub plik strony na dysku twardym lub dysku SSD), a później „zamieniać (w tył) w razie potrzeby” (inaczej „na żądanie” ).

Pamięć wirtualna ułatwia efektywne wykorzystanie skończonej pamięci fizycznej wśród wielu procesów, z których każdy ma własną chronioną wirtualną przestrzeń adresową. Suma tych wirtualnych pamięci byłaby zwykle większa niż zainstalowana pamięć fizyczna.
„Zwiększona pamięć” pochodzi teraz z perspektywy systemu, a nie tylko perspektywy programu.


3

Pamięć wirtualna zwiększa ilość danych, które program może adresować. Z punktu widzenia oprogramowania (ogólnie) nie obchodzi nas, gdzie przechowywane są ich dane. Może być przechowywany w fizycznej pamięci DRAM, może być przechowywany na dysku flash podłączonym do urządzenia, a nawet może być przechowywany na obracającym się talerzu. Oprogramowanie dba o to, że gdy prosi o dostęp do tych danych, osiąga sukces.

W praktyce chcemy również, aby programy działały szybko. Ze względu na szybkość dbamy o to, gdzie są dane. Chcemy, aby najczęściej używane dane były przechowywane w sprzęcie, który umożliwia najszybszy dostęp. Nasze programy to jak uruchomić w całości z pamięci DRAM. Często jednak nie mamy wystarczającej ilości pamięci DRAM, aby to zrobić. Pamięć wirtualna jest rozwiązaniem.

Dzięki pamięci wirtualnej system operacyjny „wysyła strony” dane, które nie były używane od dłuższego czasu, i zapisuje je na dysku twardym. Jest to nadal dostępne, tylko powolne. Jeśli program żąda danych znajdujących się na dysku twardym, system operacyjny musi poświęcić czas na odczytanie danych z dysku i przeniesienie ich z powrotem do pamięci DRAM.

Teoretycznie mógłby po prostu odczytać dane bezpośrednio z dysku. Są jednak powody, dla których tak się nie dzieje. Programy nie muszą być świadome wszystkich tych komplikacji. Możemy pisać oprogramowanie, które inteligentnie umieszcza dane na dysku (nazywa się to buforowaniem). Jednak wymaga to dużo dodatkowej pracy. Najszybciej możemy to zrobić w kodzie:

if data is not in memory
    read data from disk into memory
operate on data

Bystry czytelnik zauważy, że nawet jeśli dane są w pamięci, musieliśmy warunkowo sprawdzić, czy tam są. Jest to znacznie wolniejsze niż bezpośrednie działanie w pamięci!

Pamięć wirtualna rozwiązuje ten problem, sprawdzając sprzęt na procesorze. Procesor jest w stanie wykonać tę operację pamięci wirtualnej niezwykle szybko, ponieważ może mu poświęcić sprzęt. Każda próba zrobienia tego w samym oprogramowaniu musi wykorzystywać części procesora ogólnego przeznaczenia, które są naturalnie wolniejsze niż dedykowane tranzystory.

Prowadzi to do tego, dlaczego zawsze stronicujemy dane z powrotem do pamięci, a nie tylko odczytujemy je z dysku i pozostawiamy przy tym. Dzielimy pamięć na „strony”, z których każda jest oznaczona jako obecna lub nieobecna w pamięci. System operacyjny utrzymuje tę tabelę w formacie dogodnym dla bezpośredniego użycia procesora. Ilekroć program uzyskuje dostęp do danych, które są obecne, sprzęt CPU zapewnia im bezpośredni dostęp do danych w pamięci DRAM. Gdy dane nie są obecne, pojawia się „błąd strony”, informujący system operacyjny, aby załadował tę stronę z dysku do fizycznej strony pamięci i zaktualizował tabelę, aby skierować procesor na tę nową fizyczną stronę.

Kluczem do tego całego problemu jest zminimalizowanie jego użycia. W praktyce okazuje się, że systemy operacyjne bardzo dobrze wybierają, jakie dane przechowywać w pamięci i jakie dane wysyłać na dysk, więc ogromna większość dostępów do pamięci występuje bez powodowania błędu strony.


2

Robi to, czyniąc wpisy map tymczasowymi.

Gdy program uzyskuje dostęp do adresu logicznego, CPU szuka na mapie odpowiedniego adresu fizycznego. Jeśli zostanie znaleziony, dostęp do pamięci przebiega zgodnie z oczekiwaniami; jeśli nie zostanie znaleziony, należy przydzielić adres fizyczny, a zawartość załadować z innego magazynu - „przestrzeni wymiany”. Jeśli każdy adres fizyczny został już przydzielony do jakiegoś adresu logicznego, wówczas niektóre adresy logiczne muszą zostać „zamienione” (ich zawartość zapisana z powrotem w przestrzeni wymiany), aby udostępnić adresy fizyczne.

Maksymalna przydzielona pamięć to wielkość przestrzeni wymiany, która może być znacznie większa niż zainstalowana pamięć. Pomocne może być myślenie o przestrzeni wymiany jako „prawdziwej” pamięci, a pamięci RAM jako szybkiej pamięci podręcznej dla przestrzeni wymiany.

(Jest to dalekie od dokładnego opisu, ma na celu odpowiedzieć na bezpośrednie pytanie bez wchodzenia w istotne, ale niepotrzebne szczegóły).


1

Podstawowa koncepcja polega na tym, że współczesny procesor może zarządzać tabelami translacji, śledząc „jakie zakresy adresów przypisano do określonego procesu i które adresy fizyczne (na przykład linie A00..Axx na magistrali pamięci), JEŻELI DOWOLNE , obecnie są używane do faktycznego przechowywania danych. „JEŻELI JAKIEKOLWIEK”, ponieważ „wcale” jest możliwym i akceptowalnym stanem: W takim przypadku warunek błędu (tzw. „błąd strony”) zostanie podniesiony na poziomie sprzętowym - a ten błąd uruchomi moduł obsługi na poziomie systemu operacyjnego, który może np. załadować zawartość pamięci, która została zapisana do pliku wymiany z powrotem do dowolnego wolnego miejsca w pamięci fizycznej (w przypadku odczytu) lub znaleźć rzeczywistą lokalizację do umieszczenia rzeczy (w przypadek zapisu), zaktualizuj powyższą tabelę tłumaczeń,i dopiero TO sterowanie ręczne powraca do procesu, który próbował uzyskać dostęp do tej pamięci ... i co nie będzie mądrzejsze z tego, co się stało.


1

Pamięć wirtualna:

1) pozwala na mapowanie dużej wirtualnej przestrzeni adresowej na mniejszą ilość pamięci fizycznej, z nadmiarem „zamienionym” na dysk lub dysk SSD lub potencjalnie na NVRAM i inne urządzenia.

2) umożliwia mapowanie większej wirtualnej przestrzeni adresowej (np. 64-bitowej) na mniejszą fizyczną przestrzeń adresową (np. 32 lub 64 bity)

3) umożliwia mapowanie mniejszej wirtualnej przestrzeni adresowej (np. 32 bity) na większą fizyczną przestrzeń adresową (np. 40 bitów), a tym samym pozwala starszym aplikacjom na korzystanie z bardziej fizycznej pamięci DRAM.

4) pozwala, aby pamięć fizyczna, którą sfragmentowaliśmy i nieciągłe w fizycznej przestrzeni adresowej, stała się wirtualna w wirtualnej przestrzeni adresowej.

5) pozwala procesom otrzymać własne wirtualne przestrzenie adresowe, a tym samym być odizolowane od siebie.

6) umożliwia różnym adresom wirtualnym dzielenie tych samych wartości danych w celu przydzielenia jednej strony fizycznej.

Może się to zdarzyć w ramach jednego procesu lub systemu operacyjnego - większość systemów operacyjnych wywodzących się z systemu BSD UNIX ma pojedynczą stronę zerową z zerami, którą można odwzorować na dowolną stronę wirtualną wypełnioną zerami, zwykle COW (Kopiuj przy zapisie - zer tylko do odczytu, zapisuje uwięziony oraz strona nieudostępniona i zapisana).

Może się to zdarzyć między procesami - np. UNIX fork () tworzy procesy potomne, które współużytkują prawie całą pamięć wirtualną w sposób COW.

Może się to zdarzyć między systemami operacyjnymi - np. Systemy operacyjne gościa na hoście maszyny wirtualnej mogą mieć deduplikowane strony, wspólne COW itp. (Niektóre niedawne ataki bezpieczeństwa wykorzystały to.)

7) pamięć wirtualna może umożliwiać mapowanie części wirtualnej przestrzeni adresowej na pliki lub pamięć na innych procesorach, czy to w tym samym systemie wieloprocesorowym, czy przez Internet.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.