Jakie są różnice między pamięcią wirtualną a pamięcią fizyczną?


102

Często jestem mylony z pojęciem wirtualizacji w systemach operacyjnych. Biorąc pod uwagę pamięć RAM jako pamięć fizyczną, dlaczego potrzebujemy pamięci wirtualnej do wykonywania procesu?

Gdzie znajduje się ta pamięć wirtualna, gdy proces (program) z zewnętrznego dysku twardego jest przenoszony do pamięci głównej (pamięci fizycznej) w celu wykonania.

Kto dba o pamięć wirtualną i jaki jest jej rozmiar?

Załóżmy, że jeśli rozmiar pamięci RAM wynosi 4 GB (tj. 2 ^ 32-1 przestrzeni adresowych), jaki jest rozmiar pamięci wirtualnej?


2
A jeśli masz 512 MB i potrzebujesz zaadresować 4 GB?
Oded

tylko potrzebna część programu jest przenoszona do pamięci głównej. Proszę mnie poprawić, jeśli się mylę. Dzięki ..
starkk92

3
„Pamięć wirtualna” jest jak niewidomi badający słonia. Każdy będzie miał inne wrażenie.
Hot Licks

2
Ci z Was, którzy mogą chcieć szczegółowej odpowiedzi, powinni zapoznać się z- tą- odpowiedzią.
RickyA

Odpowiedzi:


85

Pamięć wirtualna jest między innymi abstrakcją, która daje programiście iluzję posiadania nieskończonej ilości pamięci dostępnej w ich systemie.

Mapowania pamięci wirtualnej są tworzone tak, aby odpowiadały rzeczywistym adresom fizycznym. System operacyjny tworzy i obsługuje te mapowania - wykorzystując tabelę stron, między innymi struktury danych, do obsługi mapowań. Odwzorowania pamięci wirtualnej zawsze znajdują się w tabeli stron lub w podobnej strukturze danych (w przypadku innych implementacji pamięci wirtualnej może nie powinniśmy nazywać tego „tablicą stron”). Tablica stron również znajduje się w pamięci fizycznej - często w przestrzeniach zarezerwowanych przez jądro, których programy użytkownika nie mogą nadpisać.

Pamięć wirtualna jest zwykle większa niż pamięć fizyczna - nie byłoby powodu do mapowania pamięci wirtualnej, gdyby pamięć wirtualna i pamięć fizyczna miały ten sam rozmiar.

Tylko potrzebna część programu jest przechowywana w pamięci, zazwyczaj jest to temat zwany „stronicowaniem”. Pamięć wirtualna i stronicowanie są ściśle powiązane, ale to nie ten sam temat. Istnieją inne implementacje pamięci wirtualnej, takie jak segmentacja.

Mogę się mylić w tym miejscu, ale założę się, że rzeczy, które trudno ci omówić, mają związek z określonymi implementacjami pamięci wirtualnej, najprawdopodobniej stronicowaniem. Nie ma jednego sposobu na stronicowanie - jest wiele implementacji, a ta, którą opisuje twój podręcznik, prawdopodobnie nie jest tym samym, co ta, która pojawia się w prawdziwych systemach operacyjnych, takich jak Linux / Windows - prawdopodobnie istnieją subtelne różnice.

Mógłbym wypowiedzieć tysiące akapitów na temat stronicowania ... ale myślę, że lepiej zostawić inne pytanie dotyczące konkretnie tego tematu.


4
Istnieją powody, dla których pamięć wirtualna i pamięć fizyczna mają ten sam rozmiar. VM umożliwia różnym procesom posiadanie własnych przestrzeni adresowych. Chroni to dane jednego procesu przed zapisaniem przez inny proces. Pozwala także nadać różne uprawnienia różnym przestrzeniom adresowym, więc niektórzy użytkownicy systemu mogą mieć wyższe uprawnienia do odczytu / zapisu niż inni. Posiadanie takiej samej ilości pamięci wirtualnej i pamięci fizycznej eliminuje jednak zalety przechowywania maszyn wirtualnych.
prawie

1
Aby dodać do komentarza almela: Nawet jeśli istnieje mniejsza lub taka sama wielkość pamięci wirtualnej niż pamięć fizyczna: oprócz korzyści związanych z bezpieczeństwem i stabilnością, wiele programów 32-bitowych może działać w całej pamięci, która w innym przypadku nie byłaby w stanie (np. 64-bitowy), pamięć fizyczna może być lepiej zarządzana, aby uniknąć niektórych problemów z fragmentacją, przezroczyste techniki kopiowania przy zapisie wymagają maszyny wirtualnej itp.
Kaganar

2
Zauważ dobrze, że pamięć wirtualna w żaden sposób nie jest „nieskończona”, ani też taki projekt nie ma na celu inspirowania takich iluzji. Architektura AMD64 pozwala obecnie na 48-bitowe adresowanie pamięci wirtualnej ( AMD APM, tom 2. str. 120 ). Chociaż przypadki użycia są różne, można argumentować, że jedną z głównych zalet jest możliwość zarezerwowania znacznie większych, ciągłych przebiegów przestrzeni adresowej niż byłoby powszechnie możliwe w przestrzeni fizycznej. Ten zarezerwowany zakres jest następnie zatwierdzany na żądanie, co może wyeliminować potrzebę tworzenia połączonych struktur, a także realokacji.
awdz9nld

Czy jest jakaś książka, którą mógłbym przeczytać o tego typu rzeczach, tj. O pamięci wirtualnej, jej układzie, technice stronicowania w wyszukanych szczegółach? Gdzie mogę się tego wszystkiego nauczyć?
Water Cooler v2

@ WaterCoolerv2 Mam słabość do „Systemy komputerowe: zintegrowane podejście do architektury i systemów operacyjnych” Umakishore Ramachandrana. Jest to podręcznik, ale myślę, że jest dość dokładny i wyjaśnia wszystko dobrze w porównaniu z innymi książkami o systemach operacyjnych. Ale tak naprawdę większość książek na temat systemów operacyjnych prawdopodobnie przejdzie przez stronicowanie, pamięć wirtualną itp.
PinkElephantsOnParade

86

Oprogramowanie działa w systemie operacyjnym na bardzo prostej zasadzie - wymaga pamięci. System operacyjny urządzenia zapewnia to w postaci pamięci RAM. Wymagana ilość pamięci może się różnić - niektóre programy wymagają dużej pamięci, inne wymagają marnej pamięci. Większość (jeśli nie wszyscy) użytkowników uruchamia wiele aplikacji w systemie operacyjnym jednocześnie, a biorąc pod uwagę, że pamięć jest droga (a rozmiar urządzenia jest ograniczony), ilość dostępnej pamięci jest zawsze ograniczona. Biorąc pod uwagę, że wszystkie programy wymagają pewnej ilości pamięci RAM i wszystkie mogą działać w tym samym czasie, system operacyjny musi zadbać o dwie rzeczy:

  1. Oprogramowanie działa zawsze, dopóki użytkownik go nie przerwie, tj. Nie powinno automatycznie przerywać pracy z powodu braku pamięci w systemie operacyjnym.
  2. Powyższe działanie przy zachowaniu przyzwoitej wydajności działającego oprogramowania.

Teraz główne pytanie sprowadza się do tego, jak zarządzana jest pamięć. Od czego dokładnie zależy, gdzie w pamięci będą znajdować się dane należące do danego oprogramowania?

Możliwe rozwiązanie 1 : Pozwól poszczególnym programom wyraźnie określać adres pamięci, którego będą używać w urządzeniu. Załóżmy, że Photoshop deklaruje, że zawsze będzie używał adresów pamięci w zakresie od 0do 1023(wyobraź sobie pamięć jako liniową tablicę bajtów, więc pierwszy bajt jest w lokalizacji 0, a 1024bajt w lokalizacji 1023) - tj. Zajmuje 1 GBpamięć. Podobnie VLC deklaruje, że zajmie zakres pamięci 1244do 1876itp.

Zalety:

  1. Każda aplikacja ma wstępnie przypisane gniazdo pamięci, więc po jej zainstalowaniu i uruchomieniu po prostu przechowuje swoje dane w tym obszarze pamięci i wszystko działa poprawnie.

Niedogodności:

  1. To się nie skaluje. Teoretycznie aplikacja może wymagać dużej ilości pamięci, gdy robi coś naprawdę ciężkiego. Aby zapewnić, że nigdy nie zabraknie pamięci, przydzielony jej obszar pamięci zawsze musi być większy lub równy tej ilości pamięci. Co się stanie, jeśli oprogramowanie, którego maksymalne teoretyczne zużycie pamięci wynosi 2 GB(a więc wymaga 2 GBalokacji pamięci z pamięci RAM), zostanie zainstalowane na komputerze z samą 1 GBpamięcią? Czy oprogramowanie powinno po prostu przerywać pracę podczas uruchamiania, mówiąc, że dostępna pamięć RAM jest mniejsza niż 2 GB? A może powinien być kontynuowany, a w momencie, gdy wymagana pamięć przekroczy 2 GB, po prostu przerwij i wyskoczy z komunikatem, że nie ma wystarczającej ilości pamięci?

  2. Nie można zapobiec zniekształceniu pamięci. Istnieją miliony programów, nawet gdyby każdemu z nich przydzielono tylko 1 kBpamięć, całkowita wymagana ilość pamięci przekroczyłaby 16 GB, czyli więcej niż oferuje większość urządzeń. Jak zatem można przydzielić różne programy w pamięci, które nie zajmują swoich obszarów? Po pierwsze, nie ma scentralizowanego rynku oprogramowania, który mógłby regulować, że kiedy nowe oprogramowanie jest wydawane, musi przypisać sobie tyle pamięci z tego jeszcze niezajętego obszarua po drugie, nawet gdyby tak było, nie da się tego zrobić, ponieważ nie. oprogramowania jest praktycznie nieskończona (a zatem wymaga nieskończonej pamięci, aby pomieścić je wszystkie), a całkowita pamięć RAM dostępna na dowolnym urządzeniu nie jest wystarczająca, aby pomieścić nawet ułamek tego, co jest wymagane, co sprawia, że ​​nieuniknione jest przekroczenie granic pamięci jednego oprogramowania na innym. Więc co się dzieje, gdy Photoshop jest przypisane lokalizacje pamięci 1do 1023i VLC jest przypisany 1000do 1676? Co się stanie, jeśli Photoshop przechowuje niektóre dane w lokalizacji 1008, a następnie VLC nadpisuje je własnymi danymi, a później Photoshopuzyskuje do niego dostęp myśląc, że są to te same dane, które były tam wcześniej przechowywane? Jak możesz sobie wyobrazić, będą się dziać złe rzeczy.

Tak więc wyraźnie, jak widać, ten pomysł jest raczej naiwny.

Możliwe rozwiązanie 2 : Wypróbujmy inny schemat - w którym system operacyjny zajmie się większością zarządzania pamięcią. Oprogramowanie, gdy wymaga pamięci, po prostu zażąda systemu operacyjnego, a system operacyjny odpowiednio dostosuje się. Say OS zapewnia, że ​​za każdym razem, gdy nowy proces żąda pamięci, przydzieli pamięć z możliwie najniższego adresu bajtowego (jak wspomniano wcześniej, pamięć RAM można wyobrazić sobie jako liniową tablicę bajtów, więc w przypadku 4 GBpamięci RAM zakres adresów dla bajt od 0do2^32-1) jeśli proces jest uruchamiany, w przeciwnym razie, jeśli jest to uruchomiony proces żądający pamięci, przydzieli z ostatniej lokalizacji pamięci, w której nadal znajduje się ten proces. Ponieważ oprogramowanie będzie wysyłało adresy bez uwzględnienia faktycznego adresu pamięci, w którym będą przechowywane te dane, system operacyjny będzie musiał utrzymywać mapowanie, na oprogramowanie, adresu wysyłanego przez oprogramowanie na rzeczywisty adres fizyczny (Uwaga: to jeden z dwóch powodów, dla których nazywamy tę koncepcję Virtual Memory. Oprogramowanie nie troszczy się o rzeczywisty adres pamięci, na którym są przechowywane ich dane, po prostu wypluwa adresy w locie, a system operacyjny znajduje właściwe miejsce, aby je dopasować i znaleźć później, jeśli jest to wymagane).

Powiedzmy, że urządzenie zostało właśnie włączone, system operacyjny właśnie się uruchomił, w tej chwili nie działa żaden inny proces (ignorując system operacyjny, który również jest procesem!), I decydujesz się uruchomić VLC . Tak więc VLC jest przydzielana część pamięci RAM z najniższych adresów bajtowych. Dobry. Teraz, gdy wideo jest uruchomione, musisz uruchomić przeglądarkę, aby wyświetlić jakąś stronę internetową. Następnie musisz uruchomić Notatnik, aby napisać jakiś tekst. A potem Eclipse do kodowania ... Wkrótce 4 GBcała twoja pamięć jest wyczerpana, a RAM wygląda tak:

                                   wprowadź opis obrazu tutaj

Problem 1: Teraz nie możesz rozpocząć żadnego innego procesu, ponieważ cała pamięć RAM jest zużyta. Dlatego programy muszą być pisane z uwzględnieniem maksymalnej dostępnej pamięci (praktycznie będzie jeszcze mniej, ponieważ inne programy również będą działać równolegle!). Innymi słowy, nie możesz uruchomić aplikacji zużywającej dużo pamięci na rozpadającym się 1 GBkomputerze.

W porządku, więc teraz decydujesz, że nie musisz już otwierać Eclipse i Chrome , zamknij je, aby zwolnić trochę pamięci. Przestrzeń zajmowana w pamięci RAM przez te procesy jest odzyskiwana przez system operacyjny i wygląda teraz tak:

                                    wprowadź opis obrazu tutaj

Załóżmy, że zamknięcie tych dwóch zwalnia 700 MBmiejsce - ( 400+ 300) MB. Teraz musisz uruchomić Operę , która zajmie 450 MBmiejsce. Cóż, 450 MBw sumie masz więcej niż przestrzeń, ale ... nie jest ona ciągła, jest podzielona na poszczególne części, z których żadna nie jest wystarczająco duża, aby się zmieścić 450 MB. Więc wpadłeś na genialny pomysł, przenieśmy wszystkie poniższe procesy na jak najwyższy, co pozostawi 700 MBpuste miejsce w jednym kawałku na dole. To się nazywacompaction. Świetnie, poza tym ... wszystkie procesy, które tam są, są uruchomione. Przeniesienie ich będzie oznaczało przeniesienie adresu całej ich zawartości (pamiętaj, system operacyjny utrzymuje odwzorowanie pamięci wyrzuconej przez oprogramowanie na rzeczywisty adres pamięci. Wyobraź sobie, że oprogramowanie wypluło adres 45z danymi 123, a system operacyjny zapisał go w lokalizacji 2012i utworzył wpis w mapie, mapując 45do 2012. Jeśli oprogramowanie jest teraz przeniesione do pamięci, to, co było w lokalizacji 2012, nie będzie już w 2012, ale w nowej lokalizacji, a system operacyjny musi odpowiednio zaktualizować mapę, aby mapować 45do nowy adres, aby oprogramowanie mogło uzyskać oczekiwane dane ( 123), gdy zapyta o lokalizację pamięci 45. Jeśli chodzi o oprogramowanie, jedyne, co wie, to ten adres45zawiera dane 123!)! Wyobraź sobie proces, który odwołuje się do zmiennej lokalnej i. Do czasu ponownego uzyskania dostępu jego adres się zmienił i nie będzie już mógł go znaleźć. To samo dotyczy wszystkich funkcji, obiektów, zmiennych, w zasadzie wszystko ma adres, a przeniesienie procesu będzie oznaczało zmianę adresu wszystkich z nich. Co prowadzi nas do:

Problem 2: Nie możesz przenieść procesu. Wartości wszystkich zmiennych, funkcji i obiektów w tym procesie mają zakodowane na stałe wartości wypluwane przez kompilator podczas kompilacji, proces zależy od tego, czy znajdują się one w tym samym miejscu podczas jego życia, a ich zmiana jest kosztowna. W rezultacie procesy opuszczają „ holes” duże rozmiary. To się nazywa External Fragmentation.

W porządku. Przypuśćmy, że w jakiś cudowny sposób udaje ci się przyspieszyć procesy. Teraz 700 MBna dole jest wolne miejsce:

                        wprowadź opis obrazu tutaj

Opera gładko układa się na dole. Teraz twoja pamięć RAM wygląda tak:

                                    wprowadź opis obrazu tutaj

Dobry. Wszystko wygląda dobrze. Jednak nie zostało zbyt wiele miejsca, a teraz musisz ponownie uruchomić Chrome , znany świnia pamięci! Aby rozpocząć, potrzeba dużo pamięci, a nie zostało ci już prawie żadnej ... Z wyjątkiem ... teraz zauważysz, że niektóre procesy, które początkowo zajmowały dużą przestrzeń, teraz nie potrzebują dużo miejsca. Być może zatrzymałeś wideo w VLC , dlatego nadal zajmuje trochę miejsca, ale nie tak dużo, jak to wymagane podczas odtwarzania wideo o wysokiej rozdzielczości. Podobnie dla Notatnika i Zdjęć . Twoja pamięć RAM wygląda teraz następująco:

                                        wprowadź opis obrazu tutaj

Holes, jeszcze raz! Wracamy do punktu wyjścia! Tyle że wcześniej dziury występowały w wyniku kończenia się procesów, teraz jest to spowodowane procesami wymagającymi mniej miejsca niż dotychczas! I znowu masz ten sam problem, holespołączone dają więcej miejsca niż potrzeba, ale są rozproszone, nie są zbyt przydatne w izolacji. Musisz więc ponownie przenieść te procesy, co jest kosztowną operacją i do tego bardzo częstą, ponieważ procesy często zmniejszają się w ciągu swojego życia.

Problem 3: Procesy w czasie ich życia mogą się zmniejszać, pozostawiając niewykorzystaną przestrzeń, która w razie potrzeby będzie wymagać kosztownej operacji przenoszenia wielu procesów. To się nazywa Internal Fragmentation.

W porządku, więc teraz Twój system operacyjny wykonuje wymagane czynności, przenosi procesy i uruchamia Chrome, a po pewnym czasie pamięć RAM wygląda tak:

wprowadź opis obrazu tutaj

Chłodny. Teraz załóżmy, że ponownie wznowisz oglądanie Avatara w VLC . Jego zapotrzebowanie na pamięć wzrośnie! Ale ... nie ma już miejsca na jego wzrost, ponieważ Notatnik jest przytulony u dołu. Tak więc ponownie wszystkie procesy muszą poruszać się poniżej, aż VLC znajdzie wystarczającą ilość miejsca!

Problem 4: Jeśli procesy muszą się rozwijać, będzie to bardzo kosztowna operacja

W porządku. Załóżmy teraz, że zdjęcia są używane do ładowania niektórych zdjęć z zewnętrznego dysku twardego. Dostęp do dysku twardego przenosi Cię z królestwa pamięci podręcznych i pamięci RAM do obszaru dysku, który jest wolniejszy o rząd wielkości. Boleśnie, nieodwołalnie, transcendentalnie wolniej. Jest to operacja we / wy, co oznacza, że ​​nie jest związana z procesorem (jest raczej odwrotnie), co oznacza, że ​​nie musi teraz zajmować pamięci RAM. Jednak nadal uparcie zajmuje pamięć RAM. Jeśli chcesz w międzyczasie uruchomić Firefoksa , nie możesz, ponieważ nie ma dużo dostępnej pamięci, podczas gdy gdyby zdjęcia zostały usunięte z pamięci na czas jego aktywności związanej z I / O, zwolniłoby to dużo pamięci, a następnie (kosztowne) kompaktowanie, po którym następuje dopasowanie Firefoksa .

Problem 5: Zadania związane z we / wy nadal zajmują pamięć RAM, co prowadzi do niedostatecznego wykorzystania pamięci RAM, która w międzyczasie mogła zostać wykorzystana przez zadania związane z procesorem.

Tak więc, jak widać, mamy tak wiele problemów nawet z podejściem do pamięci wirtualnej.


Istnieją dwa podejścia do rozwiązania tych problemów - pagingi segmentation. Porozmawiajmy paging. W tym podejściu wirtualna przestrzeń adresowa procesu jest odwzorowywana na pamięć fizyczną w fragmentach - tzw pages. Typowy pagerozmiar to 4 kB. Mapowanie jest obsługiwane przez coś zwanego a page table, podany adres wirtualny, wszystko, co teraz musimy zrobić, to dowiedzieć się, do którego pageadresu należy, a następnie z page table, znaleźć odpowiednią lokalizację dla tego pagew rzeczywistej pamięci fizycznej (znanej jako frame) i podać że przesunięcie adresu wirtualnego w ramach pagejest takie samo dla, pagejak i dla frame, znajdź rzeczywisty adres, dodając to przesunięcie do adresu zwróconego przez page table. Na przykład:

wprowadź opis obrazu tutaj

Po lewej stronie znajduje się wirtualna przestrzeń adresowa procesu. Powiedzmy, że wirtualna przestrzeń adresowa wymaga 40 jednostek pamięci. Gdyby fizyczna przestrzeń adresowa (po prawej) miała również 40 jednostek pamięci, byłoby możliwe zmapowanie wszystkich lokalizacji od lewej do prawej i bylibyśmy bardzo szczęśliwi. Ale pech chciał, że pamięć fizyczna nie tylko ma mniej (24 tutaj) dostępnych jednostek pamięci, ale także musi być współdzielona między wieloma procesami! Dobra, zobaczmy, jak sobie z tym poradzimy.

Po rozpoczęciu procesu powiedz, że zostało wysłane żądanie dostępu do pamięci dla lokalizacji 35. Tutaj jest rozmiar strony 8(każda pagezawiera 8lokalizacje, cała wirtualna przestrzeń adresowa 40lokalizacji zawiera zatem 5strony). Więc ta lokalizacja należy do strony nr. 4( 35/8). W tym pagemiejscu ta lokalizacja ma przesunięcie 3( 35%8). Więc ta lokalizacja może być określona przez tuple (pageIndex, offset)= (4,3). To dopiero początek, więc żadna część procesu nie jest jeszcze przechowywana w rzeczywistej pamięci fizycznej. Tak więc page table, który zachowuje odwzorowanie stron po lewej stronie na rzeczywiste strony po prawej stronie (gdzie są nazywaneframes) jest obecnie pusty. Więc system operacyjny zwalnia procesor, pozwala sterownikowi urządzenia na dostęp do dysku i pobiera numer strony. 4dla tego procesu (w zasadzie fragment pamięci z programu na dysku, którego adresy są w zakresie od 32do 39). Kiedy nadejdzie, system operacyjny przydziela stronę gdzieś w pamięci RAM, powiedzmy, że pierwsza ramka sama w sobie, a page tabledla tego procesu zwraca uwagę, że strona jest 4mapowana na ramkę 0w pamięci RAM. Teraz dane są wreszcie w pamięci fizycznej. System operacyjny ponownie wysyła zapytanie do tabeli stron o krotkę (4,3)i tym razem tabela stron mówi, że strona 4jest już zamapowana na ramkę 0w pamięci RAM. Więc system operacyjny po prostu przechodzi do- 0tej ramki w pamięci RAM, uzyskuje dostęp do danych z przesunięciem 3w tej ramce (poświęć chwilę, aby to zrozumieć.page, który został pobrany z dysku, zostanie przeniesiony do frame. Zatem niezależnie od przesunięcia indywidualnej lokalizacji pamięci na stronie, będzie ono takie samo również w ramce, ponieważ w obrębie page/ frame, jednostka pamięci nadal znajduje się w tym samym miejscu względnie!) I zwraca dane! Ponieważ dane nie został znaleziony w pamięci w pierwszej samego zapytania, ale raczej miał być pobierany z dysku mają być załadowane do pamięci, stanowi ona panienko .

W porządku. Załóżmy teraz, że utworzono dostęp do pamięci dla lokalizacji 28. Sprowadza się do (3,4). Page tablew tej chwili ma tylko jeden wpis, mapujący stronę 4do ramki 0. To znowu chybienie , proces zwalnia procesor, sterownik urządzenia pobiera stronę z dysku, proces ponownie odzyskuje kontrolę nad procesorem i page tablejest aktualizowany. Powiedzmy, że strona 3jest odwzorowana na ramkę 1w pamięci RAM. Tak (3,4)się stanie (1,4), a dane w tej lokalizacji w pamięci RAM zostaną zwrócone. Dobry. W ten sposób załóżmy, że następny dostęp do pamięci dotyczy lokalizacji 8, co oznacza (1,0). Strony 1nie ma jeszcze w pamięci, ta sama procedura jest powtarzana i pageprzydzielana jest ramka2w pamięci RAM. Teraz mapowanie procesu RAM wygląda jak na powyższym obrazku. W tym momencie pamięć RAM, która miała tylko 24 jednostki pamięci, jest zapełniona. Załóżmy, że następne żądanie dostępu do pamięci dla tego procesu pochodzi z adresu 30. Mapuje do (3,6)i page tablemówi, że strona 3jest w pamięci RAM i mapuje do ramki 1. Yay! Więc dane są pobierane z lokalizacji RAM (1,6)i zwracane. Jest to strzał w dziesiątkę , ponieważ wymagane dane można uzyskać bezpośrednio z pamięci RAM, dzięki czemu jest bardzo szybki. Podobnie, kolejne kilka wniosków, mówią o miejscach 11, 32, 26, 27wszystkie są hity , czyli dane wymagane przez proces znajduje się bezpośrednio w pamięci RAM bez potrzeby szukać gdzie indziej.

Załóżmy teraz, że 3nadejdzie żądanie dostępu do pamięci dla lokalizacji . To przekłada się (0,3), a page tabledo tego procesu, który obecnie ma 3 wpisy, dla stron 1, 3i 4mówi, że ta strona nie jest w pamięci. Podobnie jak w poprzednich przypadkach, jest on pobierany z dysku, jednak w przeciwieństwie do poprzednich przypadków pamięć RAM jest zapełniona! Więc co teraz zrobić? Oto piękno pamięci wirtualnej, ramka z pamięci RAM jest eksmitowana! (Różne czynniki decydują o tym, która ramka ma zostać eksmitowana. Może LRUopierać się na tym, gdzie klatka, do której ostatnio uzyskano dostęp w procesie, ma zostać eksmitowana. Może to być first-come-first-evictedpodstawa, gdzie ramka, która została przydzielona najdłużej, została eksmitowana itp. .) Więc jakaś rama jest eksmitowana. Powiedz ramkę 1 (po prostu wybierz ją losowo). Jednak framejest to mapowane do niektórychpage! (Obecnie jest mapowany przez tabelę stron na stronę 3naszego jedynego procesu). Więc o tym procesie trzeba powiedzieć tę tragiczną wiadomość, że ta frame, która należy do ciebie, ma zostać eksmitowana z pamięci RAM, aby zrobić miejsce dla innej pages. Proces musi upewnić się, że aktualizuje swoje page tableinformacje, to znaczy usuwa wpis dla tego duetu ramek strony, tak aby następnym razem, gdy zostanie wysłane żądanie page, poprawnie poinformuje proces, że pagenie ma go już w pamięci i musi zostać pobrany z dysku. Dobry. Ramka 1jest więc usuwana, strona 0jest przenoszona i umieszczana w pamięci RAM, a wpis dotyczący strony 3jest usuwany i zastępowany 0mapowaniem strony do tej samej ramki1. Więc teraz nasze mapowanie wygląda następująco (zwróć uwagę na zmianę koloru w drugiej framepo prawej stronie):

wprowadź opis obrazu tutaj

Widziałeś, co się właśnie stało? Proces musiał się rozwijać, wymagał więcej miejsca niż dostępna pamięć RAM, ale w przeciwieństwie do naszego wcześniejszego scenariusza, w którym każdy proces w pamięci RAM musiał zostać przeniesiony, aby dostosować się do rosnącego procesu, tutaj stało się to tylko przez jedną pagewymianę! Było to możliwe dzięki temu, że pamięć procesu nie musi już być ciągła, może znajdować się w różnych miejscach w kawałkach, system operacyjny przechowuje informacje o tym, gdzie się znajdują, a gdy jest to wymagane, są odpowiednio odpytywane. Uwaga: możesz pomyśleć, co, co, jeśli w większości przypadków jest to a miss, a dane muszą być stale ładowane z dysku do pamięci? Tak, teoretycznie jest to możliwe, ale większość kompilatorów jest zaprojektowana w następujący sposóblocality of referencetj. jeśli używane są dane z jakiejś lokalizacji pamięci, następne potrzebne dane będą znajdować się gdzieś bardzo blisko, być może z tego samego page, pagektóre właśnie zostało załadowane do pamięci. W efekcie następne pudło nastąpi po jakimś czasie, większość nadchodzących wymagań dotyczących pamięci zostanie zaspokojona przez właśnie wprowadzoną stronę lub strony już w pamięci, które były ostatnio używane. Dokładnie ta sama zasada pozwala nam eksmitować również najmniej niedawno używane, pagezgodnie z logiką, że to, co nie było używane od jakiegoś czasu, prawdopodobnie nie będzie używane przez jakiś czas. Jednak nie zawsze tak jest, aw wyjątkowych przypadkach tak, wydajność może ucierpieć. Więcej o tym później.

Rozwiązanie problemu 4: Procesy mogą teraz łatwo rosnąć, jeśli napotkamy problem z przestrzenią, wystarczy wykonać prostą pagewymianę, bez przenoszenia żadnego innego procesu.


Rozwiązanie problemu 1: Proces może uzyskać dostęp do nieograniczonej pamięci. Gdy potrzeba więcej pamięci niż jest dostępna, dysk jest używany jako kopia zapasowa, nowe wymagane dane są ładowane do pamięci z dysku, a ostatnio używane dane frame(lub page) są przenoszone na dysk. Może to trwać w nieskończoność, a ponieważ miejsce na dysku jest tanie i praktycznie nieograniczone, daje iluzję nieograniczonej pamięci. Innym powodem dla nazwy Virtual Memoryjest iluzja pamięci, która nie jest naprawdę dostępna!

Chłodny. Wcześniej mieliśmy problem polegający na tym, że chociaż proces zmniejsza się, pusta przestrzeń jest trudna do odzyskania przez inne procesy (ponieważ wymagałoby to kosztownego zagęszczenia). Teraz jest to łatwe, gdy proces staje się mniejszy, wiele z jego pagesnie jest już używanych, więc gdy inne procesy potrzebują więcej pamięci, prosta LRUoparta na zasadzie eksmisja automatycznie usuwa te mniej używane pagesz pamięci RAM i zastępuje je nowymi stronami z inne procesy (i oczywiście aktualizacja page tableswszystkich tych procesów, a także oryginalnego procesu, który teraz wymaga mniej miejsca), wszystko to bez kosztownej operacji zagęszczania!

Rozwiązanie problemu 3: Ilekroć procesy zmniejszają się, jego framespamięć RAM będzie mniej wykorzystywana, więc prosta LRUeksmisja na podstawie może usunąć te strony i zastąpić je pageswymaganymi przez nowe procesy, unikając w ten sposób Internal Fragmentationbez potrzeby compaction.

Jeśli chodzi o problem 2, poświęć chwilę, aby to zrozumieć, sam scenariusz został całkowicie usunięty! Nie ma potrzeby przenoszenia procesu, aby dostosować go do nowego procesu, ponieważ teraz cały proces nigdy nie musi pasować od razu, tylko niektóre jego strony muszą pasować ad hoc, co dzieje się poprzez wyrzucenie framesz pamięci RAM. Wszystko dzieje się w jednostkach pages, dlatego nie ma pojęcia holeteraz, a zatem nie ma mowy o tym, aby cokolwiek się ruszało! Być może 10 pagesmusiało zostać przeniesionych z powodu tego nowego wymogu, którego tysiące pagespozostały nietknięte. Podczas gdy wcześniej wszystkie procesy (każdy ich kawałek) musiały zostać przeniesione!

Rozwiązanie problemu 2: Aby uwzględnić nowy proces, dane tylko z rzadziej używanych części innych procesów muszą być w razie potrzeby eksmitowane, a dzieje się to w jednostkach o stałej wielkości zwanych pages. Dlatego nie ma możliwości holeani External Fragmentationz tym systemem.

Teraz, gdy proces musi wykonać jakąś operację we / wy, może łatwo zwolnić procesor! System operacyjny po prostu usuwa wszystko pagesz pamięci RAM (być może przechowuje je w jakiejś pamięci podręcznej), podczas gdy w międzyczasie nowe procesy zajmują pamięć RAM. Po zakończeniu operacji we / wy system operacyjny po prostu przywraca je pagesdo pamięci RAM (oczywiście zastępując pagesniektóre inne procesy, mogą pochodzić z tych, które zastąpiły oryginalny proces lub mogą pochodzić z niektórych, które same muszą wykonać I / O teraz, a więc mogę wyrzec się pamięci!)

Rozwiązanie problemu 5: Kiedy proces wykonuje operacje we / wy, może łatwo zrezygnować z użycia pamięci RAM, która może zostać wykorzystana przez inne procesy. Prowadzi to do właściwego wykorzystania pamięci RAM.

Oczywiście teraz żaden proces nie uzyskuje bezpośredniego dostępu do pamięci RAM. Każdy proces uzyskuje dostęp do lokalizacji pamięci wirtualnej, która jest mapowana na fizyczny adres RAM i utrzymywana przez page-tableten proces. Mapowanie jest oparte na systemie operacyjnym, system operacyjny informuje proces, która ramka jest pusta, dzięki czemu można tam umieścić nową stronę dla procesu. Ponieważ ta alokacja pamięci jest nadzorowana przez sam system operacyjny, może łatwo zapewnić, że żaden proces nie narusza zawartości innego procesu, przydzielając tylko puste ramki z pamięci RAM lub po wkroczeniu na zawartość innego procesu w pamięci RAM, komunikując się z procesem aby go zaktualizować page-table.

Rozwiązanie pierwotnego problemu: Nie ma możliwości uzyskania przez proces dostępu do zawartości innego procesu, ponieważ całą alokacją zarządza sam system operacyjny, a każdy proces działa we własnej wirtualnej przestrzeni adresowej w piaskownicy.

Tak więc paging(między innymi), w połączeniu z pamięcią wirtualną, jest tym, co napędza dzisiejsze oprogramowanie działające w systemach operacyjnych! Uwalnia to twórcę oprogramowania od martwienia się o to, ile pamięci jest dostępne na urządzeniu użytkownika, gdzie przechowywać dane, jak zapobiec uszkodzeniu danych oprogramowania przez inne procesy itp. Jednak nie jest to oczywiście w pełni odporne. Istnieją wady:

  1. Pagingto ostatecznie daje użytkownikowi iluzję nieskończonej pamięci poprzez użycie dysku jako dodatkowej kopii zapasowej. Pobieranie danych z pamięci pomocniczej w celu dopasowania do pamięci (wywoływane page swapi wywoływane jest zdarzenie nie znalezienia żądanej strony w pamięci RAM page fault) jest kosztowne, ponieważ jest operacją we / wy. To spowalnia proces. Kilka takich zamian stron następuje po kolei i proces staje się boleśnie powolny. Czy kiedykolwiek widziałeś, jak Twoje oprogramowanie działa dobrze i elegancko, i nagle staje się tak wolne, że prawie się zawiesza, lub nie pozostawia ci możliwości ponownego uruchomienia? Prawdopodobnie miało miejsce zbyt wiele zamian stron, co powodowało spowolnienie (wywołanie thrashing).

Wracając do OP,

Dlaczego potrzebujemy pamięci wirtualnej do wykonywania procesu? - Jak szczegółowo wyjaśnia odpowiedź, dać oprogramowaniu iluzję urządzenia / systemu operacyjnego z nieskończoną pamięcią, tak aby można było uruchomić dowolne oprogramowanie, duże lub małe, bez martwienia się o alokację pamięci lub inne procesy uszkadzające jego dane, nawet gdy bieganie równolegle. Jest to koncepcja realizowana w praktyce różnymi technikami, z których jedną, jak tu opisano, jest Paging . Może to być również segmentacja .

Gdzie znajduje się ta pamięć wirtualna, gdy proces (program) z zewnętrznego dysku twardego jest przenoszony do pamięci głównej (pamięci fizycznej) w celu wykonania? - Pamięć wirtualna sama w sobie nie stoi nigdzie, jest abstrakcją, zawsze obecną, gdy oprogramowanie / proces / program jest uruchamiany, tworzona jest dla niego nowa tablica stron i zawiera mapowanie z wyplutych przez nią adresów proces na rzeczywisty adres fizyczny w pamięci RAM. Ponieważ adresy wyplute przez ten proces nie są prawdziwymi adresami, w pewnym sensie są one w rzeczywistości tym, co możesz powiedzieć the virtual memory.

Kto dba o pamięć wirtualną i jaki jest jej rozmiar? - Zajmuje się tym w tandemie system operacyjny i oprogramowanie. Wyobraź sobie funkcję w swoim kodzie (która ostatecznie została skompilowana i przekształcona w plik wykonywalny, który zrodził proces), która zawiera zmienną lokalną - plik int i. Gdy kod jest wykonywany, ipobiera adres pamięci w stosie funkcji. Ta funkcja sama jest przechowywana jako obiekt w innym miejscu. Te adresy są generowane przez kompilator (kompilator, który skompilował Twój kod do pliku wykonywalnego) - adresy wirtualne. Po uruchomieniu imusi znajdować się gdzieś w rzeczywistym adresie fizycznym przez co najmniej czas trwania tej funkcji (chyba że jest to zmienna statyczna!), Więc system operacyjny mapuje wygenerowany przez kompilator wirtualny adresina rzeczywisty adres fizyczny, tak więc ilekroć w ramach tej funkcji jakiś kod wymaga wartości i, ten proces może wysłać zapytanie do systemu operacyjnego o ten adres wirtualny, a system operacyjny może z kolei zapytać o fizyczny adres o przechowywaną wartość i zwrócić ją.

Załóżmy, że jeśli rozmiar pamięci RAM wynosi 4 GB (tj. 2 ^ 32-1 przestrzeni adresowych), jaki jest rozmiar pamięci wirtualnej? - Rozmiar pamięci RAM nie jest powiązany z rozmiarem pamięci wirtualnej, zależy od systemu operacyjnego. Na przykład w 32-bitowym systemie Windows tak jest 16 TBw 64-bitowym systemie Windows 256 TB. Oczywiście jest to również ograniczone rozmiarem dysku, ponieważ tam jest tworzona kopia zapasowa pamięci.


2
To świetny, dogłębny opis VM / stronicowania (powinien być gdzieś w blogu). Jedną z części mapowania / stronicowania maszyn wirtualnych, która mnie dezorientuje, jest to, że nadal wymaga (pozornie) wielu dostępów do dysku dla każdego błędu strony lub wymiany. Czy każda zamiana strony (z maszyny wirtualnej na dysk i odwrotnie) wywołuje odczyt / zapis na dysku? Wydaje mi się, że to ogromny narzut.
Aroic

@TMartin tak, strona jest zapisywana w pliku pagefile.sys i uważam, że istnieją 2 zapisy, jeden dla strony i jeden dla PFN, który jest przechowywany w tablicy wewnątrz pliku stronicowania. Algorytm LRU zapewnia, że ​​głównie strona z najmniej dostępnym PTE z każdego zestawu roboczego procesu (najstarszy wiek) zostanie wysłana na listę oczekujących i ostatecznie stronicowana, więc istnieje prawdopodobieństwo, że strona została już dawno zapisana na dysku. jest ponownie dostępny, więc stanie się to w tle. Jest to również stosunkowo rzadkie wydarzenie w ogólnym planie; miejmy nadzieję, że większość błędów stron będzie łagodna.
Lewis Kelsey

Lista oczekujących ma również własny system priorytetów i gdy lista zerowa i lista wolnych jest pusta, zaczyna wyświetlać strony oczekujące o najniższym priorytecie. Nie jestem pewien, na czym opiera się priorytet, ale może on odpowiadać poprzedniej epoce LRU
Lewis Kelsey

16

Bezwstydnie kopiuję fragmenty strony podręcznika man z góry

VIRT - obraz wirtualny (kb) Całkowita ilość pamięci wirtualnej używanej przez zadanie. Obejmuje cały kod, dane i biblioteki współdzielone oraz strony, które zostały zamienione i strony, które zostały zmapowane, ale nie są używane.

SWAP - rozmiar zamieniony (kb) Pamięć, która nie jest rezydentna, ale jest obecna w zadaniu. Jest to pamięć, która została wymieniona, ale może zawierać dodatkową pamięć nierezydentną. Ta kolumna jest obliczana przez odjęcie pamięci fizycznej od pamięci wirtualnej


5

Zobacz tutaj: Pamięć fizyczna kontra wirtualna

Pamięć wirtualna jest przechowywana na dysku twardym i jest używana po zapełnieniu pamięci RAM. Pamięć fizyczna jest ograniczona wielkością układów pamięci RAM zainstalowanych w komputerze. Pamięć wirtualna jest ograniczona przez rozmiar dysku twardego, więc pamięć wirtualna może pomieścić więcej.


Czy pamięć wirtualna jest przechowywana na dysku twardym w pliku wymiany / partycji?
BruceJohnJennerLawso

3
@BruceJohnJennerLawso: nie, wirtualny = zamiana + fizyczny
RickyA

Zgadzam się z @RickyA, zawsze wirtualny> = fizyczny.
hastrb
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.