KSM permet a ma connaissance de merger rétrospectivement deux pages identiques. C'est utile lorsqu'on utilise plusieurs fichiers identiques (par exemple lorsqu'on a n VM du même OS qui vont chacune avoir la même copie des binaires et des librairies). Ça demande de parcourir la mémoire à la recherche de pages identiques.
Le gestionnaire de mémoire de Linux est capable au moment du mappage mémoire, de voir qu'une page en lecture seule est déjà présente en mémoire dans le système, et de l'utiliser. Cela est possible parce pour ce type de mémoire, le système garde une référence sur le fichier et l'offset qui ont servi à son chargement. Ça évite de dupliquer la mémoire utilisée par les librairies (tel que la libc ou le chargeur dynamique utilisée par tout le monde); en cas de saturation mémoire, ça évite d'avoir à écrire ces pages dans le swap (on pourra les recharger depuis le fichier), et ça permet de ne faire le chargement effectif en mémoire que lorsque (et si) la page est utilisée. Tu trouveras toutes les informations sur la correspondance entre les adresses mémoire et les fichiers dans /proc//maps
L'effet de bord un peu déroutant est qu'il est impossible d'avoir la mémoire occupée par un processus donné. Une partie de la mémoire étant partagée avec d'autres processus, il est difficile de déterminer comment elle doit être comptabilisée.
En prime, les pages en écriture peuvent également être partagées jusqu'à la première écriture par un mécanisme appelé copy-on-write, très utilisé lorsqu'on lance un nouveau processus (fork).
[^] # Re: C'est moi ou ?
Posté par Sébastien Koechlin . En réponse à la dépêche Debian 8 : Jessie l’écuyère est en selle !. Évalué à 10.
Non, ce n'est pas KSM qui s'en occupe.
KSM permet a ma connaissance de merger rétrospectivement deux pages identiques. C'est utile lorsqu'on utilise plusieurs fichiers identiques (par exemple lorsqu'on a n VM du même OS qui vont chacune avoir la même copie des binaires et des librairies). Ça demande de parcourir la mémoire à la recherche de pages identiques.
Le gestionnaire de mémoire de Linux est capable au moment du mappage mémoire, de voir qu'une page en lecture seule est déjà présente en mémoire dans le système, et de l'utiliser. Cela est possible parce pour ce type de mémoire, le système garde une référence sur le fichier et l'offset qui ont servi à son chargement. Ça évite de dupliquer la mémoire utilisée par les librairies (tel que la libc ou le chargeur dynamique utilisée par tout le monde); en cas de saturation mémoire, ça évite d'avoir à écrire ces pages dans le swap (on pourra les recharger depuis le fichier), et ça permet de ne faire le chargement effectif en mémoire que lorsque (et si) la page est utilisée. Tu trouveras toutes les informations sur la correspondance entre les adresses mémoire et les fichiers dans /proc//maps
L'effet de bord un peu déroutant est qu'il est impossible d'avoir la mémoire occupée par un processus donné. Une partie de la mémoire étant partagée avec d'autres processus, il est difficile de déterminer comment elle doit être comptabilisée.
En prime, les pages en écriture peuvent également être partagées jusqu'à la première écriture par un mécanisme appelé copy-on-write, très utilisé lorsqu'on lance un nouveau processus (fork).