Pamięć wirtualna: Różnice pomiędzy wersjami

Usunięte 8 bajtów ,  7 lat temu
m
drobne techniczne
m (r2.7.3) (Robot dodał si:අතථ්‍ය මතකය)
m (drobne techniczne)
{{Definicja|Pamięć wirtualna to, z punktu widzenia programisty, znacznie większa ilość pamięci RAM dla procesu niż fizycznie dostępna w systemie<ref>{{Cytuj książkę | tytuł=Leksykon techniki mikrokomputerowej | imię=Andrzej | nazwisko=Markowski | imię2=Andrzej | nazwisko2=Rydzewski | imię3=Henryk | nazwisko3=Kruszyński | miejsce=Warszawa | rok=1989 | seria=Mikrokomputery | wydawca=[[Wydawnictwo SIGMA-NOT|Wydawnictwo Czasopism i Książek Technicznych NOT-SIGMA]] | isbn=83-85001-28-X }}</ref>, niezależnej od innych procesów. Ułatwia to tworzenie aplikacji, a także sztuczne zwiększenie ilości dostępnej pamięci poprzez wykorzystanie części dysku twardego do tego celu.}}
[[plik:Virtual memory.svg|thumb|Z lewej pamięć wirtualna jednego z procesów, z prawej jej rozmieszczenie w pamięci fizycznej.]]
'''Pamięć wirtualna''' - mechanizm zarządzania pamięcią komputera zapewniający [[Proces (informatyka)|procesowi]] wrażenie pracy w jednym dużym, ciągłym obszarze pamięci operacyjnej podczas gdy fizycznie może być ona pofragmentowana, nieciągła i częściowo przechowywana na urządzeniach pamięci masowej. Systemy korzystające z tej techniki ułatwiają tworzenie rozbudowanych aplikacji oraz poprawiają wykorzystanie fizycznej pamięci [[RAM]] w systemach [[Wielozadaniowość|wielozadaniowych]]. Często popełnianym błędem jest utożsamianie pamięci wirtualnej z wykorzystaniem [[Pamięć masowa|pamięci masowej]] do rozszerzenia dostępnej pamięci operacyjnej. Rozszerzenie pamięci na dyski twarde w rzeczywistości jest tylko naturalną konsekwencją zastosowania techniki pamięci wirtualnej, lecz może być osiągnięte także na inne sposoby, np. nakładki lub całkowite przenoszenie pamięci procesów na dysk, gdy znajdują się w stanie uśpienia. Pamięć wirtualna działa na zasadzie przedefiniowania adresów pamięci (fizycznych) na adresy używane przez procesy (logiczne) tak, aby "oszukać" procesy i dać im wrażenie pracy w ciągłej przestrzeni adresowej.
 
Obecnie wszystkie systemy operacyjne ogólnego przeznaczenia wykorzystują techniki pamięci wirtualnej dla procesów uruchamianych w ich obrębie. Wcześniejsze systemy takie, jak [[DOS]], wydania [[Microsoft Windows]]<ref>[http://support.microsoft.com/kb/32905 Windows Version History]</ref> z lat 80. oraz oprogramowanie komputerów mainframe z lat 60. nie pozwalały pracować w środowisku z pamięcią wirtualną. Godnymi odnotowania wyjątkami były komputery [[ATLAS (komputer)|Atlas]], [[B5000]] oraz [[Lisa|Apple Lisa]].
 
== Historia ==
W pierwszych komputerach z lat 40. i 50., podobnie jak współcześnie, pamięć była zorganizowana w sposób dwupoziomowy, analogicznie do obecnego podziału na RAM i pamięć masową). Jednak z powodu braku mechanizmów pamięci wirtualnej, każdy program musiał we własnym zakresie zarządzać przenoszeniem danych z jednego poziomu do drugiego, co komplikowało programowanie. Głównym powodem wprowadzenia pamięci wirtualnej była zatem chęć maksymalnego uproszczenia i automatyzacji procesów związanych z zarządzaniem pamięcią, a nie jej rozszerzenie <ref>[http://cs.gmu.edu/cne/pjd/PUBS/bvm.pdf "Before memory was virtual"], [[Peter J. Denning]], 1997</ref>.
 
Wraz z pojawieniem się wielozadaniowości, wiodące systemy zaczęły udostępniać proste mechanizmy współdzielenia pamięci przez kilka uruchomionych procesów oparte na prostych technikach segmentacji. Dostępna dla procesu pamięć rozpoczynała się od adresu zerowego, a jej koniec wyznaczany był przez wartość rejestru granicznego. Aby uzyskać adres fizyczny, należało dodać do żądanego adresu logicznego wartość rejestru bazowego wyznaczającego przesunięcie. Takie rozwiązanie zostało m.in. zaimplementowane w komputerze [[PDP-10]].
 
Pamięć wirtualna została zaprojektowana między rokiem 1959 a 1962 na Uniwersytecie Manchester dla komputera Atlas, który został ukończony w 1962 roku <ref>http://www.computer50.org/kgill/atlas/atlas.html Opis techniczny komputera ATLAS na stronie WWW Uniwersytetu Manchester]</ref>. Jednak niemiecki informatyk [[Fritz-Rudolf Güntsch]], późniejszy twórca komputera [[Telefunken]] TR 440 twierdzi, że zaproponował tę technikę w roku 1957 w swojej pracy doktorskiej ''Logischer Entwurf eines digitalen Rechengerätes mit mehreren asynchron laufenden Trommeln und automatischem Schnellspeicherbetrieb''.
 
W roku 1961 ukazał się B5000 firmy [[Burroughs]], pierwszy komercyjny komputer z pamięcią wirtualną <ref>
Harvey G. Cragon, ''Memory Systems and Pipelined Processors'', Jones and Bartlett Publishers, ss. 113, [[1996]], ISBN 0-86-720474-5.</ref>. Zamiast stronicowania, korzystał z mechanizmu segmentacji pamięci.
 
 
== Stronicowana pamięć wirtualna ==
 
Prawie wszystkie istniejące obecnie implementacje dzielą [[Wirtualna przestrzeń adresowa|wirtualną przestrzeń adresową]] procesu na ''strony''. Strona to obszar ciągłej pamięci o stałym rozmiarze (zazwyczaj 4kB). Systemy, gdzie zapotrzebowanie na wielkość wirtualnej przestrzeni adresowej jest większe lub dysponujące większymi zasobami pamięci operacyjnej mogą używać stron o większym rozmiarze. Rzeczywista pamięć operacyjna podzielona jest na ''ramki'', których rozmiar odpowiada wielkości stron. System operacyjny według uznania może przydzielać ramkom strony pamięci lub pozostawiać je puste.
 
=== Tablice stron ===
 
Każde odwołanie przez dany proces do wirtualnego adresu pamięci powoduje jego przetłumaczenie na adres fizyczny przy pomocy [[Tablica stron pamięci|tablicy stron]]. Wpisy w tablicy stron przechowują namiary na ramkę, gdzie aktualnie znajduje się dana strona lub znacznik informujący, że dana strona znajduje się aktualnie na dysku twardym.
 
Systemy mogą utrzymywać tylko jedną tablicę stron - wtedy wszystkie procesy pracują we wspólnej wirtualnej przestrzeni adresowej, przy czym każdy z nich używa innej jej części. Odmiennym podejściem jest utrzymywanie osobnych tablic stron dla każdego procesu oraz dodatkowej na potrzeby samego systemu operacyjnego. W tym modelu każdy proces posiada swoją własną, niezależną przestrzeń adresową. Dwa identyczne adresy logiczne należące do różnych procesów tłumaczone są na inne adresy rzeczywiste, uniemożliwiając tym samym jednemu procesowi modyfikację danych innego.
 
=== Dynamiczne tłumaczenie adresów ===
 
Dynamiczne tłumaczenie adresów jest zadaniem [[CPU|głównego procesora]]. Najczęściej wykonywane jest przez sprzętowy komponent zwany [[Memory management unit]] (ang. ''układ zarządzania pamięcią'') obsługujący każde odwołanie do pamięci. MMU przeszukuje aktualną tablicę stron w poszukiwaniu ramki zawierającej żądane dane i przekazuje rzeczywisty adres pozostałym częściom procesora odpowiedzialnym za wykonanie instrukcji. Jeśli MMU stwierdzi, że dana strona nie znajduje się w pamięci, generuje przerwanie braku strony, które musi zostać obsłużone przez zarządcę pamięci systemu operacyjnego.
 
=== Zarządca pamięci ===
 
Ta część systemu operacyjnego odpowiada za tworzenie i zarządzanie tablicami stron, a także obsługuje przerwanie braku strony generowane przez MMU. W przypadku jego wystąpienia zarządca poszukuje wskazanej strony na dysku twardym (''pamięć wymiany''), ładuje ją do aktualnie wolnej ramki, uaktualnia tablicę stron i nakazuje MMU ponowne przetłumaczenie adresu. Ładowanie brakujących stron z dysku jest powolnym procesem, dlatego jeśli system dysponuje wystarczającą liczbą ramek, dąży do minimalizacji wystąpień błędów braku strony.
 
 
=== Strony krytyczne ===
 
Nie wszystkie strony pamięci mogą być przeniesione do pamięci wymiany. Wśród takich krytycznych stron możemy wyróżnić:
 
 
== Segmentowana pamięć wirtualna ==
 
Pamięć wirtualna może być zrealizowana również w oparciu o techniki segmentowania. Wirtualna przestrzeń adresowa aplikacji podzielona jest na bloki zmiennej długości zwane ''segmentami''. Adres logiczny składa się z numeru segmentu oraz przesunięcia w obrębie tego segmentu. Pamięć jest wciąż fizycznie dostępna za pomocą tzw. ''adresu absolutnego'' lub ''liniowego''. Do jego otrzymania, procesor odczytuje deskryptor segmentu z tablicy segmentów. Zawiera on flagę informującą, czy dany segment znajduje się aktualnie w pamięci czy nie, adres początku segmentu oraz jego długość. Następnie sprawdza czy przesunięcie adresu mieści się w granicach segmentu. Jeśli segment nie znajduje się w pamięci, generowane jest przerwanie powiadamiające system operacyjny o konieczności jego załadowania. W trakcie wczytywania może okazać się niezbędne przeniesienie innych segmentów na dysk, aby zrobić miejsce dla nowego.
 
Technikę segmentowanej pamięci wirtualnej wspierał jako dodatkową opcję procesor [[Intel 80286]] będący jednym z przodków wszystkich procesorów stosowanych we współczesnych komputerach PC, jednak nie była ona wykorzystywana w większości systemów operacyjnych.
 
Możliwe jest połączenie segmentacji pamięci ze stronicowaniem poprzez podzielenie każdego segmentu na strony. Systemy korzystające z tej techniki, np. [[Multics]] czy IBM [[System/38]] pamięć wirtualna realizowana jest przez stronicowanie, zaś segmentacja wprowadza dodatkowy mechanizm ochrony. W procesorach [[IA-32]] oraz [[Intel 80386]] segmenty znajdują się w 32-bitowej liniowej stronicowanej przestrzeni adresowej: segmenty mogą być przenoszone z/do przestrzeni adresowej, zaś strony w obrębie przestrzeni adresowej mogą być przenoszone z/do pamięci operacyjnej. Korzystają z tego jednak tylko nieliczne systemy - najczęściej stosowane jest wyłącznie stronicowanie pamięci.
 
Różnica pomiędzy pamięcią stronicowaną a segmentowaną nie polega wyłącznie na podziale pamięci na porcje o stałym i zmiennym rozmiarze. W tego typu systemach segmentacja jest często widoczna dla procesów użytkownika, w przeciwieństwie do przezroczystych stron, które nie wymagają od nich żadnego dodatkowego zaangażowania.
 
== Szamotanie procesów ==
 
Mianem '''szamotania''' określany jest stan procesu, w którym spędza on więcej czasu na oczekiwaniu na brakujące strony pamięci niż na faktycznym wykonywaniu obliczeń, co znacząco spowalnia jego działanie. Problem szamotania występuje we wszystkich implementacjach i objawia się przy zbyt dużym zapotrzebowaniu na pamięć ze strony procesów przy zbyt małej liczby wolnych ramek. Problem może być częściowo rozwiązany przez poprawienie jakości programów, lecz na dłuższą metę jedynym skutecznym lekarstwem jest zainstalowanie większej ilości fizycznej pamięci operacyjnej.
 
== Zobacz takżeteż ==
 
* [[Pamięć fizyczna]] oraz [[Adres fizyczny|Adresowanie fizyczne]]
* [[Adres logiczny]]
** [[Stronicowanie pamięci]]
** [[Segmentacja pamięci]]
** [[Tablica_stron_pamięciTablica stron pamięci|Tablica stron]]
* [[Alokacja pamięci]]