2016-09-28 4 views
0

Je lisais à propos de l'utilisation de COW -approach après avoir fait fork dans les systèmes modernes UNIX. Supposons que nous ayons un processus - P1. Il forks; nous obtenons un autre processus - P2. Leur mémoire virtuelle est soutenue par les mêmes pages physiques en raison de COW. Il y a une page où une variable statique globale (par exemple, en dehors de static long variable;main) se trouve (dans le .data segment) qui est soutenu par page physique A.Comment fonctionne COW after fork?

maintenant P1 change de variable globale statique; le noyau, après avoir traité l'erreur de protection, mappe une nouvelle page (page B) sur la mémoire virtuelle de P1 pour stocker cette variable modifiée. De la même manière que P2 modifie sa variable globale statique, le noyau, après avoir traité l'erreur de protection, mappe une nouvelle page (page C) sur la mémoire virtuelle de P1 pour stocker cette variable modifiée.

Maintenant, rien ne fait référence à la page A. Où se trouve-t-elle? Je suppose que ce n'est pas "suspendu dans les airs" en gardant une page physique hors d'usage, gaspillant ainsi de la mémoire?

+0

Pourquoi ne pas simplement modifier A puisque seulement un le référence? Et pourquoi serait-il conservé dans la mémoire physique si rien ne l'utilise? –

+0

@Sami, vous voulez dire que P2 pourrait simplement changer les drapeaux A'pages au lieu de mapper la nouvelle page "C"? Je pense que ce parent pourrait avoir plusieurs enfants donc A devrait rester en lecture seule? –

Répondre

2

Lorsque la page B est créée, l'indicateur COW sur la page A est supprimé car la page n'est plus partagée; il n'est plus nécessaire de le copier avant de le modifier. Par conséquent, P2 utilise simplement la page A, probablement sans encourir une erreur de page, et certainement sans avoir besoin de copier la page. Par conséquent, il n'y a pas de page C et la page A n'est pas non référencée. Notez que si P1 forks à nouveau, ou si P2 forks, ou les deux, avant de modifier la variable sur la page A, alors il pourrait y avoir 3 processus ou plus référençant la page. Le système maintient généralement un compteur de référence pour chaque page dans les informations de contrôle de mappage de mémoire, en enregistrant combien de processus ont mappé la page dans leur mémoire de processus, et ce nombre contrôle si le drapeau COW peut être effacé. Jusqu'à ce qu'il n'y ait qu'un seul processus référençant la page, le drapeau COW reste en vigueur. Une opération exec diminuera le nombre de références pour toutes les pages de l'ancien processus et libérera les pages pour les réutiliser si le nombre de références atteint zéro. Si P1 configure une mémoire explicitement partagée, les drapeaux COW ne seront pas positionnés sur les pages de mémoire partagée même si le compteur de référence peut être supérieur à 1.

1

Page A ne se déforme pas, car une seule copie a lieu.

L'un des deux processus déclenchera la fonction COW en premier. Il obtiendra la nouvelle trame B, et l'autre processus restera avec A.

Nous pourrions faire en sorte que l'autre processus n'obtienne pas de défaut de page. C'est probablement lourd de courses, particulièrement sous SMP où chaque noyau a son propre TLB.

Ou nous pouvons laisser l'autre processus obtenir une erreur de page aussi. Il saura que l'image A ne nécessite plus de copie car, disons, il y a un compte ref dans l'objet de gestion qui suit A, et que le compte ref a la valeur 1 indiquant que A est mappé de manière unique. Le gestionnaire d'erreur de page marquera simplement la page comme étant présente, la gardant mappée à A.

La même chose devrait se produire si un parent engendre un enfant, qu'il se ferme et que le parent touche une page précédemment partagée. Comme il n'est plus partagé, il n'y a aucune raison de le copier-écrire.

+0

Que se passe-t-il si le processus engendre rapidement plusieurs processus enfants? Quelque part dans le noyau, nous avons un compteur qui est diminué de un si un enfant écrit sur la page (causant ainsi une erreur de protection et obtenant une nouvelle page)? –

+1

@BulatM. Cela pourrait fonctionner comme ça. À un moment donné, nous devons savoir que personne d'autre n'a cette page, et elle peut rester. – Kaz