Déterminer si la mémoire après fork est une copie sur écriture

Je voudrais écrire un petit programme qui montre si le système d’exploitation utilise copy-on-write après un appel à fork() . Le problème est que la copie sur écriture est essentiellement transparente pour les processus affectés.

Pour une variable donnée, les adresses de mémoire virtuelle accédées par l’opérateur & apparaissent identiques pour les processus forkés, même lorsque ces processus stockent des valeurs différentes dans cette variable. Existe-t-il un moyen de déterminer si les variables des processus distincts sont stockées à la même adresse physique? Y a-t-il un moyen de déterminer s’ils ne le sont pas?

En général, dans le sens où ils sont portables sur tous les systèmes POSIX ou POSIX, non, il n’y a aucun moyen d’observer COW, surtout pas au niveau de la page (vous pourriez être en mesure de l’observer plus simplement en mémoire “disponible” si le système fournit une telle figure). Mais sous Linux, vous pouvez l’observer via /proc/[pid]/pagemap pour les processus potentiellement partagés. /proc/kpagecount et /proc/kpageflags peuvent également contenir des informations pertinentes, mais vous devez y accéder avec root. Voir:

https://www.kernel.org/doc/Documentation/vm/pagemap.txt

Je spécule ici, mais je pense que cela ne serait pas possible dans le processus. Comme vous le dites, nous avons effectivement une copie parfaite de l’espace d’adressage. Cependant, vous avez une certaine unicité, par exemple l’ID de processus, et vous pouvez donc écrire une valeur unique à une adresse choisie, puis écrire la valeur dans un fichier ou utiliser une communication inter-processus (par exemple un canal) pour autoriser les processus pour comparer leurs valeurs et donc confirmer qu’ils sont maintenant différents.

POSIX ne spécifie pas le comportement de copie sur écriture, il n’y a donc pas de méthode standard pour le détecter, car un système pourrait même ne pas utiliser COW.

Vous pourriez peut-être manipuler votre ulimit de mémoire virtuelle, en le verrouillant à un petit nombre, de telle sorte que la modification d’une page vous mettrait et vous donnerait un signal. Cela serait très sensible aux détails du système, si vous pouviez le faire fonctionner.

Si vous voulez une solution spécifique à Linux et que vous exécutez un kernel 2.6.34 ou supérieur, cette Q & R devrait vous aider. Ce n’est pas sortingvial.