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?
Odpowiedzi:
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.
źródło
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:
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?
Zalety:
Niedogodności:
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 wymaga2 GB
alokacji pamięci z pamięci RAM), zostanie zainstalowane na komputerze z samą1 GB
pamię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ęć przekroczy2 GB
, po prostu przerwij i wyskoczy z komunikatem, że nie ma wystarczającej ilości pamięci?Nie można zapobiec zniekształceniu pamięci. Istnieją miliony programów, nawet gdyby każdemu z nich przydzielono tylko
1 kB
pamięć, całkowita wymagana ilość pamięci przekroczyłaby16 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ęci1
do1023
i VLC jest przypisany1000
do1676
? Co się stanie, jeśli Photoshop przechowuje niektóre dane w lokalizacji1008
, 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.
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 GB
cała twoja pamięć jest wyczerpana, a RAM wygląda tak: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:
Załóżmy, że zamknięcie tych dwóch zwalnia
700 MB
miejsce - (400
+300
) MB. Teraz musisz uruchomić Operę , która zajmie450 MB
miejsce. Cóż,450 MB
w 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 pozostawi700 MB
puste 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 adres45
z danymi123
, a system operacyjny zapisał go w lokalizacji2012
i utworzył wpis w mapie, mapując45
do2012
. Jeśli oprogramowanie jest teraz przeniesione do pamięci, to, co było w lokalizacji2012
, nie będzie już w2012
, ale w nowej lokalizacji, a system operacyjny musi odpowiednio zaktualizować mapę, aby mapować45
do nowy adres, aby oprogramowanie mogło uzyskać oczekiwane dane (123
), gdy zapyta o lokalizację pamięci45
. Jeśli chodzi o oprogramowanie, jedyne, co wie, to ten adres45
zawiera dane123
!)! Wyobraź sobie proces, który odwołuje się do zmiennej lokalneji
. 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:W porządku. Przypuśćmy, że w jakiś cudowny sposób udaje ci się przyspieszyć procesy. Teraz
700 MB
na dole jest wolne miejsce:Opera gładko układa się na dole. Teraz twoja pamięć RAM wygląda tak:
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:
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,holes
połą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.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:
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!
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 .
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 -
paging
isegmentation
. Porozmawiajmypaging
. W tym podejściu wirtualna przestrzeń adresowa procesu jest odwzorowywana na pamięć fizyczną w fragmentach - tzwpages
. Typowypage
rozmiar to4 kB
. Mapowanie jest obsługiwane przez coś zwanego apage table
, podany adres wirtualny, wszystko, co teraz musimy zrobić, to dowiedzieć się, do któregopage
adresu należy, a następnie zpage table
, znaleźć odpowiednią lokalizację dla tegopage
w rzeczywistej pamięci fizycznej (znanej jakoframe
) i podać że przesunięcie adresu wirtualnego w ramachpage
jest takie samo dla,page
jak i dlaframe
, znajdź rzeczywisty adres, dodając to przesunięcie do adresu zwróconego przezpage table
. Na przykład: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 strony8
(każdapage
zawiera8
lokalizacje, cała wirtualna przestrzeń adresowa40
lokalizacji zawiera zatem5
strony). Więc ta lokalizacja należy do strony nr.4
(35/8
). W tympage
miejscu ta lokalizacja ma przesunięcie3
(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ęcpage 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.4
dla tego procesu (w zasadzie fragment pamięci z programu na dysku, którego adresy są w zakresie od32
do39
). Kiedy nadejdzie, system operacyjny przydziela stronę gdzieś w pamięci RAM, powiedzmy, że pierwsza ramka sama w sobie, apage table
dla tego procesu zwraca uwagę, że strona jest4
mapowana na ramkę0
w 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 strona4
jest już zamapowana na ramkę0
w pamięci RAM. Więc system operacyjny po prostu przechodzi do-0
tej ramki w pamięci RAM, uzyskuje dostęp do danych z przesunięciem3
w tej ramce (poświęć chwilę, aby to zrozumieć.page
, który został pobrany z dysku, zostanie przeniesiony doframe
. Zatem niezależnie od przesunięcia indywidualnej lokalizacji pamięci na stronie, będzie ono takie samo również w ramce, ponieważ w obrębiepage
/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 table
w tej chwili ma tylko jeden wpis, mapujący stronę4
do ramki0
. To znowu chybienie , proces zwalnia procesor, sterownik urządzenia pobiera stronę z dysku, proces ponownie odzyskuje kontrolę nad procesorem ipage table
jest aktualizowany. Powiedzmy, że strona3
jest odwzorowana na ramkę1
w 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 lokalizacji8
, co oznacza(1,0)
. Strony1
nie ma jeszcze w pamięci, ta sama procedura jest powtarzana ipage
przydzielana jest ramka2
w 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 adresu30
. Mapuje do(3,6)
ipage table
mówi, że strona3
jest w pamięci RAM i mapuje do ramki1
. 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 miejscach11
,32
,26
,27
wszystkie są hity , czyli dane wymagane przez proces znajduje się bezpośrednio w pamięci RAM bez potrzeby szukać gdzie indziej.Załóżmy teraz, że
3
nadejdzie żądanie dostępu do pamięci dla lokalizacji . To przekłada się(0,3)
, apage table
do tego procesu, który obecnie ma 3 wpisy, dla stron1
,3
i4
mó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żeLRU
opierać się na tym, gdzie klatka, do której ostatnio uzyskano dostęp w procesie, ma zostać eksmitowana. Może to byćfirst-come-first-evicted
podstawa, 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). Jednakframe
jest to mapowane do niektórychpage
! (Obecnie jest mapowany przez tabelę stron na stronę3
naszego jedynego procesu). Więc o tym procesie trzeba powiedzieć tę tragiczną wiadomość, że taframe
, która należy do ciebie, ma zostać eksmitowana z pamięci RAM, aby zrobić miejsce dla innejpages
. Proces musi upewnić się, że aktualizuje swojepage table
informacje, to znaczy usuwa wpis dla tego duetu ramek strony, tak aby następnym razem, gdy zostanie wysłane żądaniepage
, poprawnie poinformuje proces, żepage
nie ma go już w pamięci i musi zostać pobrany z dysku. Dobry. Ramka1
jest więc usuwana, strona0
jest przenoszona i umieszczana w pamięci RAM, a wpis dotyczący strony3
jest usuwany i zastępowany0
mapowaniem strony do tej samej ramki1
. Więc teraz nasze mapowanie wygląda następująco (zwróć uwagę na zmianę koloru w drugiejframe
po prawej stronie):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ą
page
wymianę! 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 amiss
, 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 reference
tj. 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 samegopage
,page
któ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,page
zgodnie 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.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
pages
nie jest już używanych, więc gdy inne procesy potrzebują więcej pamięci, prostaLRU
oparta na zasadzie eksmisja automatycznie usuwa te mniej używanepages
z pamięci RAM i zastępuje je nowymi stronami z inne procesy (i oczywiście aktualizacjapage tables
wszystkich tych procesów, a także oryginalnego procesu, który teraz wymaga mniej miejsca), wszystko to bez kosztownej operacji zagęszczania!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
frames
z pamięci RAM. Wszystko dzieje się w jednostkachpages
, dlatego nie ma pojęciahole
teraz, a zatem nie ma mowy o tym, aby cokolwiek się ruszało! Być może 10pages
musiało zostać przeniesionych z powodu tego nowego wymogu, którego tysiącepages
pozostały nietknięte. Podczas gdy wcześniej wszystkie procesy (każdy ich kawałek) musiały zostać przeniesione!Teraz, gdy proces musi wykonać jakąś operację we / wy, może łatwo zwolnić procesor! System operacyjny po prostu usuwa wszystko
pages
z 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 jepages
do pamięci RAM (oczywiście zastępującpages
niektó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!)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-table
ten 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
.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:Paging
to 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ływanepage swap
i wywoływane jest zdarzenie nie znalezienia żądanej strony w pamięci RAMpage 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łaniethrashing
).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,i
pobiera 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 uruchomieniui
musi 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 adresi
na rzeczywisty adres fizyczny, tak więc ilekroć w ramach tej funkcji jakiś kod wymaga wartościi
, 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 TB
w 64-bitowym systemie Windows256 TB
. Oczywiście jest to również ograniczone rozmiarem dysku, ponieważ tam jest tworzona kopia zapasowa pamięci.źródło
Bezwstydnie kopiuję fragmenty strony podręcznika man z góry
źródło
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.
źródło