Dlaczego Linux używa partycji wymiany, kiedy jądro i tak obsługuje pamięć stronicowania / wirtualną?

23

O ile rozumiem stronicowanie i zamianę, są to zupełnie inne pojęcia. Chociaż zamiana oznacza, że ​​proces znajduje się całkowicie w pamięci fizycznej lub na dysku twardym, przy czym stronicowanie części procesu może znajdować się w pamięci fizycznej, a inne części mogą znajdować się na dysku twardym.

Ale dlaczego Linux wymaga partycji wymiany? Jeśli pamięć fizyczna jest pełna, niektóre procesy zostaną przeniesione na dysk twardy, a nowy proces zostanie zmapowany z pamięci wirtualnej do pamięci fizycznej.

Po prostu nie rozumiem, dlaczego trzeba partycji wymiany (lub wymiany ogólnie)?

Czy to tylko kwestia terminologii i swap partition == virtual memory?

JohnnyFromBF
źródło
5
Uważaj, że „pamięć wirtualna” w architekturze komputerowej jest techniką, podczas gdy MS Windows (niepoprawnie IMO) definiuje ją jako „Pamięć wirtualna to przestrzeń dyskowa na dysku twardym komputera, z której Windows korzysta w połączeniu z pamięcią o swobodnym dostępie (RAM)”. IE google windows „pamięć wirtualna”
trociny

Odpowiedzi:

25

Tak, to tylko kwestia terminologii, w wielu przypadkach partycja wymiany jest używana jako pamięć wirtualna.

Powodem, dla którego UNIX i systemy podobne do UNIX wolą partycje wymiany od plików stronicowania, jest to, że mogą one być ciągłe, co powoduje krótszy czas wyszukiwania w porównaniu z plikiem stronicowania, który może być pofragmentowany.

Patuck
źródło
6
W ten sposób łatwiej jest również współużytkować pojedynczą partycję wymiany między instalacjami Linuksa.
oktosiTe
3
zwykle plik stron jest tworzony całkowicie przy pierwszym uruchomieniu, więc nie zostanie podzielony (cóż ... wciąż istnieje kilka możliwości ..)
AndreaCi
12
Najwcześniejsze systemy UNIX miały tylko zamianę, nie stronicowanie i mogły jedynie zamieniać się na dedykowaną partycję. Stronicowanie zostało zaimplementowane, gdy tylko sprzęt go obsługiwał, ale nazwa „zamień partycję” utknęła. Stronicowanie do pliku jest nowsze i ma większy narzut na system operacyjny, a także ryzykuje fragmentację, więc nadal jest odradzane.
zwolnienie
1
„partycja wymiany jest używana jako pamięć wirtualna.” - Tylko Microsoft Windows definiuje pamięć dodatkową (np. Plik strony na dysku) jako „pamięć wirtualną”. Ale nawet oni próbują odejść od tego użycia. Spróbuj przejrzeć „wirtualną pamięć” systemu Windows, a streszczenie pierwszego wyniku („Pamięć wirtualna to miejsce do przechowywania ...”) nie pasuje do zawartości strony. Prawidłową instrukcją byłoby „partycja wymiany jest używana przez pamięć wirtualną”.
trociny
14

Nie wiem, skąd masz pojęcie, że „zamiana oznacza, że ​​proces jest albo całkowicie w pamięci fizycznej, albo na twardym dysku”. To znaczenie nie było używane od kilku dekad. Cytując Wikipedię :

Historycznie, zamiana dotyczyła przenoszenia z / do pamięci dodatkowej całego programu na raz, w schemacie znanym jako roll-in / roll-out. W latach 60. XX wieku, po wprowadzeniu koncepcji pamięci wirtualnej - w dwóch wariantach, przy użyciu segmentów lub stron - termin wymiany stosowano odpowiednio do przenoszenia segmentów lub stron między dyskiem a pamięcią. Dziś z pamięcią wirtualną opartą głównie na stronach, a nie na segmentach, zamiana stała się dość bliskim synonimem stronicowania, choć z jedną różnicą. [Wątpliwe - dyskutuj]

Rzeczywiście, w każdym kontekście związanym z Linuksem (lub innymi systemami unixowymi), stronicowanie i zamiana są w zasadzie synonimami. Oba odnoszą się do wykorzystania pamięci wirtualnej, w której dane strony mogą być przechowywane w pamięci RAM lub na dysku. (Strona ma rozmiar 4 kB na dowolnym urządzeniu, które prawdopodobnie napotkasz). Program korzystający ze strony pamięci nie dba o to, a nawet nie wie, gdzie są przechowywane dane, po prostu używa wirtualnego adresu. Jądro przesyła dane między pamięcią RAM a dyskiem i aktualizuje tabele MMU, tak aby wpis adresu wirtualnego wskazywał na fizyczną stronę w pamięci lub zawierał specjalną wartość, która powoduje, że procesor wykonuje kod jądra który załaduje odpowiednie dane z dysku.

Stronicowanie odnosi się do tego ogólnego procesu. Zamiana odnosi się do przypadku, gdy dane na dysku znajdują się w dedykowanym obszarze: obszarze wymiany (partycja wymiany lub plik wymiany). Stronicowanie można również wykonać między pamięcią RAM a plikiem, w takim przypadku zwykle nie jest to określane jako zamiana . Na przykład podczas wykonywania programu kod musi zostać załadowany do pamięci, aby został wykonany; jeśli strona kodowa musi zostać eksmitowana z pamięci RAM, aby zrobić miejsce na coś innego, nie trzeba zapisywać tej strony w obszarze wymiany, ponieważ można ją ponownie załadować z pliku programu. (Można to zrobić dla wszystkich danych tylko do odczytu, nie tylko kodu programu.)

Jeśli pamięć fizyczna jest (prawie) pełna, jądro szuka strony w pamięci RAM (nie całego procesu), która nie była ostatnio używana. Jeśli ta strona odtwarza zawartość pliku dyskowego (w jądrze znajdują się tabele, które to wskazują), stronę można odzyskać. Jeśli nie, strona jest zapisywana w celu zamiany, a następnie odzyskiwana. Tak czy inaczej, jądro aktualizuje wpis w tablicy pamięci wirtualnej procesu (który staje się tabelą MMU podczas wykonywania procesu), aby oznaczyć go jako inny niż w pamięci RAM, a następnie może ponownie użyć strony fizycznej do czegoś innego (innego programu lub innej strony ten sam program).

Gilles „SO- przestań być zły”
źródło
Pierwszy akapit twojej odpowiedzi mówi mu, skąd pomysł: stare dokumenty. (Pamiętam też, kiedy istniała różnica między zamianą a stronicowaniem.)
RonJohn
9

Funkcja pamięci wirtualnej / stronicowania pozwala jądrze „wirtualizować” pamięć do procesów w przestrzeni użytkownika. Jądro może pobierać strony z pamięci fizycznej i układać je za pomocą stronicowania, aby wyglądały na przylegające do procesu przestrzeni użytkownika.

Limit można ustawić w pamięci procesu przestrzeni użytkownika, a jeśli proces wykracza poza to, pojawia się „błąd strony”, który powoduje wyjątek procesora, który wraca do jądra. Zapobiega to bałaganowaniu programu przestrzeni użytkownika pamięcią przydzieloną do jądra lub innych programów bez zgody jądra.

Zazwyczaj programy przestrzeni użytkownika proszą jądro o rozszerzenie tego limitu za pomocą dobrze zdefiniowanych interfejsów (wywoływanych przez funkcje C malloc()i free()na przykład.). Jądro jest odpowiedzialne za śledzenie ilości i ilości pamięci przydzielonej programowi.

Ten mechanizm „błędu strony” może również pozwolić jądrze zamienić stronę, do której proces próbował uzyskać dostęp z dysku z jednego dysku, jeśli jądro jest w stanie przesadzić pamięć (i zarówno Windows, jak i Linux to obsługują), dlatego nazywa się to zamianą. Jeśli dostęp do pamięci był rzeczywiście nieprawidłowy (tzn. Proces próbuje uzyskać dostęp do pamięci, o którą nie poprosił wcześniej), zazwyczaj proces zostanie zabity za pomocą SIGSEGV.

Tak więc „zamiana” jest dodatkową funkcją (w Linuksie możesz ją całkowicie wyłączyć, jeśli chcesz), która zależy od pamięci wirtualnej / stronicowania, ale nie jest wymagana tylko dlatego, że procesor ma pamięć wirtualną / stronicowanie. Pojęcia nie są takie same, ale zamiana zależy od istnienia stronicowania / pamięci wirtualnej.


Ponadto, po dokładniejszym przeczytaniu pytania, „stronicowanie” jest czasem używane jako synomia „zamiany” - ale nigdy nie słyszałem o „zamianie”, co oznacza, że ​​pamięć całego procesu jest zamieniana w porównaniu do „stronicowania”, co oznacza tylko część jest zamieniony.

Ale dlaczego Linux wymaga partycji wymiany? Jeśli pamięć fizyczna jest pełna, niektóre procesy zostaną przeniesione na dysk twardy, a nowy proces zostanie zmapowany z pamięci wirtualnej do pamięci fizycznej.

„Pamięć wirtualna” to pamięć fizyczna, po prostu „odwzorowana”. Sprzęt MMU nie może bezpośrednio mapować na żadnym urządzeniu pamięci masowej. MMU może zgłosić błąd, który informuje jądro, że proces próbował uzyskać dostęp do pamięci, a nie powinien - i jądro może użyć tego mechanizmu, aby zobaczyć, że proces chce odzyskać coś z dysku, który myślał, że jest w pamięci, a następnie wykonać „ zamiana". Chodzi o to, że to system operacyjny decyduje o zapisaniu stron na dysku, aby mógł używać tych stron do innych procesów, a nie sprzętu.

LawrenceC
źródło
2

Ogólnie partycja wymiany nie jest równa pamięci wirtualnej.

Procesy mogą wymagać więcej pamięci niż rzeczywista pamięć fizyczna, dlatego twórcy systemu operacyjnego postanowili założyć, że w systemie jest więcej pamięci, która nazywa się „pamięcią wirtualną”.

Ta pamięć wirtualna jest w zasadzie pamięcią fizyczną i częścią dysku. Ta część dysku nosi nazwę „swap” w systemie Linux.

Również programiści zaproponowali, aby wykorzystanie części pamięci wirtualnej znajdującej się na dysku twardym było jak najmniejsze. Ze względu na to cała pamięć wirtualna została podzielona na małe części zwane „stronami”. Wiele stron jest używanych w niskim tempie, strony te muszą być zapisane w części pamięci wirtualnej na dysku twardym. Ta operacja nazywa się „zamień”. System operacyjny musi śledzić, które strony nie znajdują się w pamięci fizycznej, aby je znaleźć w razie potrzeby. Błąd strony występuje, gdy program chce zapisać / odczytać część pamięci, która została zamieniona.

Aby odpowiedzieć na twoje pytanie: Linux potrzebuje partycji wymiany, aby zamienić niektóre strony pamięci i możesz zobaczyć statystyki wykorzystania pamięci wirtualnej za pomocą vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

Kolumna „swap” pokazuje zamianę i statystyki. Również ten link wyjaśnia pamięć wirtualną i jej użycie vmstat.

soroosh
źródło