Perché Linux usa una partizione di swap quando il kernel supporta comunque il paging / la memoria virtuale?


23

Per quanto ho capito paginazione e scambio, sono concetti completamente diversi. Mentre lo scambio significa che un processo è completamente nella memoria fisica o sul disco rigido, con parti di paginazione di un processo possono essere nella memoria fisica e altre parti possono essere sul disco rigido.

Ma allora perché Linux ha bisogno di una partizione di swap? Se la memoria fisica è piena, alcuni processi verranno esternalizzati sul disco rigido e un nuovo processo verrà mappato dalla memoria virtuale alla memoria fisica.

Non capisco perché uno abbia bisogno di una partizione di swap (o di swap in generale) allora?

O è solo una questione di terminologia e swap partition == virtual memory?


5
Attenzione che la "memoria virtuale" nell'architettura del computer è una tecnica, mentre MS Windows (erroneamente IMO) la definisce come "La memoria virtuale è lo spazio di archiviazione sul disco rigido del computer che Windows utilizza in combinazione con la memoria ad accesso casuale (RAM)". IE google windows "memoria virtuale"
segatura

Risposte:


25

Sì, è solo una questione di terminologia, in molti casi una partizione di swap viene utilizzata come memoria virtuale.

Il motivo per cui i sistemi UNIX e UNIX preferiscono le partizioni di swap ai file di paging è che possono essere contigui, il che si traduce in tempi di ricerca inferiori rispetto a un file di paging che può essere frammentato.


6
E in questo modo è anche più facile condividere una singola partizione di swap tra installazioni Linux.
oKtosiTe

3
di solito un file di paging viene completamente creato al primo avvio, quindi non sarà frammentato (beh .. ci sono ancora alcune possibilità ..)
AndreaCi

12
I primissimi UNIX avevano solo lo scambio, non il paging, e potevano solo passare a una partizione dedicata. Il paging è stato implementato non appena l'hardware lo ha supportato, ma il nome "partizione di swap" è rimasto bloccato. Il paging di un file è più recente e presenta un overhead del sistema operativo più elevato oltre a rischiare la frammentazione, quindi è ancora scoraggiato.
zwol,

1
"La partizione di swap viene utilizzata come memoria virtuale." - Solo Microsoft Windows definisce l'archiviazione secondaria (ad esempio il file di paging sul disco) come "memoria virtuale". Ma anche loro stanno provando ad allontanarsi da questo uso. Prova a cercare su Google "memoria virtuale" e la sinossi per il primo risultato ("La memoria virtuale è spazio di archiviazione ...") non corrisponde al contenuto della pagina. Un'istruzione corretta sarebbe una "partizione di swap utilizzata dalla memoria virtuale".
segatura

14

Non so da dove venga l'idea che "lo scambio significa, che un processo è completamente nella memoria fisica o sul disco rigido". Questo significato non è in uso da alcuni decenni. Citando Wikipedia :

Storicamente, lo scambio si riferiva al passaggio dalla / alla memoria secondaria di un intero programma alla volta, in uno schema noto come roll-in / roll-out. Negli anni '60, dopo l'introduzione del concetto di memoria virtuale - in due varianti, usando segmenti o pagine - il termine scambio veniva applicato allo spostamento, rispettivamente, di segmenti o pagine, tra disco e memoria. Oggi con la memoria virtuale basata principalmente su pagine, non segmenti, lo scambio è diventato un sinonimo abbastanza stretto di paging, anche se con una differenza.

In effetti, in qualsiasi contesto che coinvolga Linux (o altri sistemi unix per quella materia), il paging e lo scambio sono praticamente sinonimi. Entrambi si riferiscono a un uso della memoria virtuale in cui i dati della pagina possono essere archiviati nella RAM o sul disco. (Una pagina è di 4kB su qualsiasi dispositivo che potresti incontrare.) Il programma che utilizza la pagina di memoria non si preoccupa o sa nemmeno dove sono archiviati i dati, continua a usare l'indirizzo virtuale. Il kernel trasferisce i dati tra la RAM e il disco e aggiorna le tabelle MMU mentre procede in modo che la voce per l'indirizzo virtuale punti a una pagina fisica in memoria o contenga un valore speciale che induce il processore a eseguire del codice del kernel che caricherà i dati appropriati dal disco.

Il paging si riferisce a questo processo generico. Lo scambio si riferisce al caso in cui i dati su disco si trovano in un'area dedicata: l'area di scambio (una partizione di scambio o file di scambio). Il paging può anche essere eseguito tra la RAM e un file, e in questo caso di solito non viene indicato come scambio . Ad esempio, quando si esegue un programma, il codice deve essere caricato in memoria per essere eseguito; se una tabella codici deve essere eliminata dalla RAM per fare spazio a qualcos'altro, non è necessario scrivere questa pagina nell'area di scambio, perché può essere ricaricata dal file di programma. (Questo può essere fatto per tutti i dati di sola lettura, non solo per il codice del programma.)

Se la memoria fisica è (quasi) piena, il kernel cerca una pagina nella RAM (non un intero processo) che non è stata utilizzata di recente. Se quella pagina riproduce il contenuto di un file su disco (ci sono tabelle nel kernel per indicarlo), la pagina può essere recuperata. In caso contrario, la pagina viene scritta per lo scambio, quindi recuperata. In entrambi i casi, il kernel aggiorna la voce nella tabella di memoria virtuale del processo (che diventa la tabella MMU mentre il processo viene eseguito) per contrassegnarla come non nella RAM e può quindi riutilizzare la pagina fisica per qualcos'altro (un programma diverso o un'altra pagina di lo stesso programma).


Il primo paragrafo della tua risposta gli dice dove ha avuto l'idea: vecchi documenti. (Ricordo quando c'era anche una differenza tra lo scambio e il paging.)
Ron John

9

La funzione di paging / memoria virtuale consente a un kernel di "virtualizzare" la memoria ai processi dello spazio utente. Il kernel può prendere le pagine dalla memoria fisica e disporle attraverso il paging in modo che appaiano contigui a un processo di spazio utente.

È possibile impostare un limite nella memoria di un processo spazio utente e se il processo va oltre si verifica un "errore di pagina", che provoca un'eccezione della CPU che rimbalza sul kernel. Questo impedisce al programma userspace di fare confusione con la memoria allocata al kernel o ad altri programmi, senza il permesso del kernel.

In genere i programmi di spazio utente chiedono al kernel di estendere questo limite tramite interfacce ben definite (chiamate dalle funzioni C malloc()e free()per esempio.). Il kernel è responsabile di tenere traccia della quantità e della memoria allocata da un programma.

Questo meccanismo di "errore di pagina" può anche consentire al kernel di scambiare la pagina a cui il processo stava tentando di accedere con uno dal disco, se il kernel è in grado di eseguire l'overprovisioning della memoria (e sia Windows che Linux supportano questo), quindi perché si chiama swapping. Se l'accesso alla memoria non era effettivamente valido (ovvero il processo sta tentando di accedere alla memoria non prima richiesto), in genere il processo verrà interrotto con un SIGSEGV.

Pertanto, lo "scambio" è una funzione aggiuntiva (in Linux è possibile disabilitarla completamente se si desidera) che dipende dalla memoria virtuale / dal paging, ma non è necessario solo perché una CPU ha memoria virtuale / paging. I concetti non sono gli stessi ma lo scambio dipende dall'esistenza di paging / memoria virtuale.


Inoltre, dopo aver letto più da vicino la tua domanda, "paging" è talvolta usato come sinonimo di "scambio" - ma non ho mai sentito parlare di "scambio", il che significa che l'intera memoria del processo viene scambiata contro "paging" che significa solo una parte di viene scambiato.

Ma allora perché Linux ha bisogno di una partizione di swap? Se la memoria fisica è piena, alcuni processi verranno esternalizzati sul disco rigido e un nuovo processo verrà mappato dalla memoria virtuale alla memoria fisica.

La "memoria virtuale" è la memoria fisica, semplicemente "rimappata". L'hardware MMU non può essere mappato direttamente su alcun dispositivo di archiviazione. La MMU può generare un errore che dice al kernel che un processo ha tentato di accedere alla memoria che non avrebbe dovuto - e il kernel può usare questo meccanismo per vedere che un processo vuole qualcosa dal disco che pensava fosse in memoria e quindi fare il " scambiare". Il punto è che è il sistema operativo che decide di salvare le pagine su disco in modo che possa usare quelle pagine per altri processi, non l'hardware.


2

In generale la partizione di swap non è uguale alla memoria virtuale.

I processi possono richiedere più memoria della memoria fisica effettiva, quindi gli sviluppatori del sistema operativo hanno deciso di supporre che ci sia più memoria nel sistema che si chiama "memoria virtuale".

Questa memoria virtuale è fondamentalmente memoria fisica e una parte del disco. Questa parte del disco è chiamata "swap" in Linux.

Inoltre, gli sviluppatori hanno proposto che l'utilizzo della parte della memoria virtuale che si trova sul disco rigido debba essere il più basso possibile. Per amor di esso, tutta la memoria virtuale è stata divisa in piccole porzioni chiamate "pagine". Molte pagine vengono utilizzate a bassa velocità, queste pagine devono essere scritte nella parte della memoria virtuale sul disco rigido. Questa operazione si chiama "swap out". Il sistema operativo deve tenere traccia di quali pagine non sono presenti nella memoria fisica per trovarle quando necessario. L'errore di pagina si verifica quando un programma vuole scrivere / leggere una parte della memoria che viene scambiata.

Per rispondere alla tua domanda: Linux ha bisogno di una partizione di swap per scambiare alcune pagine di memoria e puoi vedere una statistica dell'uso della memoria virtuale con 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

La colonna 'swap' mostra lo swap out e in statistica. Anche questo link spiega anche la memoria virtuale e l'utilizzo di vmstat.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.