Pourquoi Linux utilise-t-il une partition de swap quand le noyau prend quand même en charge la pagination / la mémoire virtuelle?

23

Pour autant que je comprenne la pagination et l'échange, ce sont des concepts complètement différents. Si l'échange signifie qu'un processus se trouve entièrement dans la mémoire physique ou sur le disque dur, les parties de pagination d'un processus peuvent se trouver dans la mémoire physique et d'autres parties sur le disque dur.

Mais pourquoi Linux a-t-il alors besoin d'une partition de swap? Si la mémoire physique est pleine, certains processus seront externalisés sur le disque dur et un nouveau processus sera mappé de la mémoire virtuelle à la mémoire physique.

Je ne comprends tout simplement pas pourquoi on a besoin d'une partition d'échange (ou d'échange en général) alors?

Ou est-ce juste une question de terminologie et swap partition == virtual memory?

JohnnyFromBF
la source
5
Méfiez-vous que la «mémoire virtuelle» dans l'architecture informatique est une technique, tandis que MS Windows (incorrectement IMO) la définit comme «la mémoire virtuelle est un espace de stockage sur le disque dur de votre compteur que Windows utilise conjointement avec la mémoire vive (RAM)». IE google windows "mémoire virtuelle"
sciure de bois

Réponses:

25

Oui, c'est juste une question de terminologie, dans de nombreux cas une partition de swap est utilisée comme mémoire virtuelle.

La raison pour laquelle les systèmes UNIX et UNIX préfèrent les partitions d'échange aux fichiers d'échange est qu'ils peuvent être contigus, ce qui réduit les temps de recherche par rapport à un fichier d'échange qui peut être fragmenté.

Patuck
la source
6
Et de cette façon, il est également plus facile de partager une seule partition d'échange entre les installations Linux.
oKtosiTe
3
généralement un fichier d'échange est complètement créé au premier démarrage, donc il ne sera pas fragmenté (enfin .. il y a encore quelques possibilités ..)
AndreaCi
12
Les tout premiers UNIX ne disposaient que de permutation, pas de pagination, et pouvaient uniquement passer à une partition dédiée. La pagination a été implémentée dès que le matériel l'a prise en charge, mais le nom "partition d'échange" est resté. La pagination vers un fichier est plus récente et a une surcharge de système d'exploitation plus élevée ainsi que le risque de fragmentation, il est donc toujours déconseillé.
zwol
1
"La partition de swap est utilisée comme mémoire virtuelle." - Seul Microsoft Windows définit le stockage secondaire (par exemple, le fichier d'échange sur le disque) comme «mémoire virtuelle». Mais même ils essaient de s'éloigner de cet usage. Essayez de googler les fenêtres "mémoire virtuelle" et le synopsis du premier résultat ("La mémoire virtuelle est un espace de stockage ...") ne correspond pas au contenu de la page. Une déclaration correcte serait une «partition de swap utilisée par la mémoire virtuelle».
sciure de bois
14

Je ne sais pas d'où vient l'idée que «l'échange signifie qu'un processus est soit complètement dans la mémoire physique, soit sur le disque dur». Ce sens n'a pas été utilisé depuis quelques décennies. Citant Wikipédia :

Historiquement, l'échange faisait référence au déplacement de / vers le stockage secondaire d'un programme entier à la fois, dans un schéma connu sous le nom de déploiement / déploiement. Dans les années 1960, après l'introduction du concept de mémoire virtuelle - en deux variantes, utilisant des segments ou des pages -, le terme échange a été appliqué au déplacement, respectivement, de segments ou de pages, entre le disque et la mémoire. Aujourd'hui, avec la mémoire virtuelle principalement basée sur des pages, et non sur des segments, l'échange est devenu un synonyme assez proche de la pagination, bien qu'avec une différence. [Douteux - discuter]

En effet, dans tout contexte impliquant Linux (ou d'autres systèmes Unix d'ailleurs), la pagination et l' échange sont à peu près synonymes. Les deux se réfèrent à une utilisation de la mémoire virtuelle où les données de page peuvent être stockées dans la RAM ou sur le disque. (Une page fait 4 Ko sur n'importe quel appareil que vous êtes susceptible de rencontrer.) Le programme utilisant la page de mémoire ne se soucie pas ou ne sait même pas où les données sont stockées, il continue simplement à utiliser l'adresse virtuelle. Le noyau transfère les données entre la RAM et le disque et met à jour les tables MMU au fur et à mesure afin que l'entrée de l'adresse virtuelle pointe vers une page physique en mémoire, ou contient une valeur spéciale qui oblige le processeur à exécuter du code du noyau qui chargera les données appropriées à partir du disque.

La pagination fait référence à ce processus générique. L'échange fait référence au cas où les données sur disque se trouvent dans une zone dédiée: la zone d'échange (une partition d'échange ou un fichier d'échange). La pagination peut également être effectuée entre la RAM et un fichier, et dans ce cas, elle n'est généralement pas appelée échange . Par exemple, lorsque vous exécutez un programme, le code doit être chargé en mémoire pour être exécuté; si une page de code doit être supprimée de la RAM pour faire de la place à autre chose, il n'est pas nécessaire d'écrire cette page dans la zone de swap, car elle peut être rechargée à partir du fichier programme. (Cela peut être fait pour toutes les données en lecture seule, pas seulement le code de programme.)

Si la mémoire physique est (presque) pleine, le noyau recherche une page en RAM (pas un processus entier) qui n'a pas été utilisée récemment. Si cette page reproduit le contenu d'un fichier disque (il y a des tables dans le noyau pour l'indiquer), la page peut être récupérée. Sinon, la page est écrite pour être échangée, puis récupérée. Dans les deux cas, le noyau met à jour l'entrée dans la table de mémoire virtuelle du processus (qui devient la table MMU pendant que le processus s'exécute) pour la marquer comme non dans la RAM et peut ensuite réutiliser la page physique pour autre chose (un programme différent ou une autre page de le même programme).

Gilles 'SO- arrête d'être méchant'
la source
Le premier paragraphe de votre réponse lui dit où il a eu l'idée: de vieux documents. (Je me souviens aussi quand il y avait une différence entre l'échange et la pagination.)
RonJohn
9

La fonction de mémoire virtuelle / pagination permet à un noyau de «virtualiser» la mémoire dans les processus de l'espace utilisateur. Le noyau peut prendre des pages de la mémoire physique et les organiser par pagination afin qu'elles apparaissent contiguës à un processus de l'espace utilisateur.

Une limite peut être définie sur la mémoire d'un processus de l'espace utilisateur et si le processus va au-delà, une "erreur de page" se produit, ce qui provoque une exception de CPU qui rebondit sur le noyau. Cela empêche le programme de l'espace utilisateur de jouer avec la mémoire allouée au noyau ou à d'autres programmes, sans l'autorisation du noyau.

Généralement, les programmes de l'espace utilisateur demandent au noyau d'étendre cette limite via des interfaces bien définies (appelées par les fonctions C malloc()et free()par exemple.). Le noyau est responsable du suivi de la quantité et de la mémoire allouée à un programme.

Ce mécanisme de "défaut de page" peut également permettre au noyau d'échanger la page à laquelle le processus tentait d'accéder avec une à partir du disque, si le noyau est capable de surcharger la mémoire (et que Windows et Linux le prennent en charge), c'est pourquoi il est appelé échange. Si l'accès à la mémoire était en effet invalide (c'est-à-dire que le processus tente d'accéder à la mémoire qu'il n'a pas demandé en premier), alors le processus sera généralement tué avec un SIGSEGV.

Ainsi, le «swapping» est une fonctionnalité supplémentaire (sous Linux, vous pouvez réellement la désactiver entièrement si vous le souhaitez) qui dépend de la mémoire virtuelle / pagination, mais n'est pas requise simplement parce qu'un processeur possède une mémoire virtuelle / pagination. Les concepts ne sont pas les mêmes, mais l'échange dépend de la pagination / mémoire virtuelle pour exister.


De plus, après avoir lu de plus près votre question, "paging" est parfois utilisé comme synomyme de "swapping" - mais je n'ai jamais entendu parler de "swapping" signifiant que la mémoire de tout le processus est permutée vs. "paging" signifiant seulement une partie de il est échangé.

Mais pourquoi Linux a-t-il alors besoin d'une partition de swap? Si la mémoire physique est pleine, certains processus seront externalisés sur le disque dur et un nouveau processus sera mappé de la mémoire virtuelle à la mémoire physique.

La «mémoire virtuelle» est de la mémoire physique, juste «remappée». Le matériel MMU ne peut pas être directement mappé à un périphérique de stockage. La MMU peut renvoyer une erreur qui indique au noyau qu'un processus a tenté d'accéder à la mémoire qu'il ne devrait pas avoir - et le noyau peut utiliser ce mécanisme pour voir qu'un processus veut récupérer quelque chose du disque qu'il pensait être en mémoire, puis faire le " échanger". Le fait est que c'est le système d'exploitation qui décide d'enregistrer les pages sur le disque afin qu'il puisse utiliser ces pages pour d'autres processus, pas le matériel.

LawrenceC
la source
2

En général, la partition de swap n'est pas égale à la mémoire virtuelle.

Les processus peuvent nécessiter plus de mémoire que la mémoire physique réelle, les développeurs de système d'exploitation ont donc décidé de supposer qu'il y avait plus de mémoire dans le système, appelée «mémoire virtuelle».

Cette mémoire virtuelle est essentiellement de la mémoire physique et une partie du disque. Cette partie du disque est appelée "swap" sous Linux.

Les développeurs ont également proposé que l'utilisation de la partie de la mémoire virtuelle située sur le disque dur soit aussi faible que possible. Pour le plaisir, toute la mémoire virtuelle était divisée en petites portions appelées "pages". Beaucoup de pages sont utilisées à faible débit, ces pages doivent être écrites dans la partie de la mémoire virtuelle du disque dur. Cette opération est appelée "échange". Le système d'exploitation doit garder une trace des pages qui ne sont pas dans la mémoire physique pour les trouver en cas de besoin. Une erreur de page se produit lorsqu'un programme souhaite écrire / lire une partie de la mémoire qui est permutée.

Pour répondre à votre question: Linux a besoin d'une partition de swap pour échanger certaines pages de mémoire et vous pouvez voir une statistique d'utilisation de la mémoire virtuelle avec 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 colonne «swap» affiche les statistiques swap out et in. Aussi ce lien explique la mémoire virtuelle et l' utilisation de vmstataussi bien.

Soroosh
la source