web-dev-qa-db-fra.com

Qu'est-ce qui cause des défauts de page?

selon Wikipedia :

Un défaut de page est un piège pour le logiciel généré par le matériel lorsqu'un programme accède à une page qui est mappée dans l'espace d'adressage virtuel, mais pas chargé dans la mémoire physique. (c'est moi qui souligne)

D'accord, cela a du sens.

Mais si c'est le cas, pourquoi chaque fois que les informations de processus dans Process Hacker sont actualisées, je vois environ 15 défauts de page?

Screenshot

Ou en d'autres termes, pourquoi la mémoire est-elle paginée? (Je n'ai aucune idée s'il s'agit de la mémoire de l'utilisateur ou du noyau.) Je n'ai aucun fichier de page , et l'utilisation RAM est d'environ 1,2 Go sur 4 Go, ce qui est après un redémarrage propre. Il n'y a pas de pénurie de ressources; pourquoi quelque chose serait-il paginé?

25
Mehrdad

(Je suis l'auteur de Process Hacker.)

D'abord:

Une erreur de page est un piège pour le logiciel généré par le matériel lorsqu'un programme accède à une page mappée dans l'espace d'adressage virtuel, mais non chargée dans la mémoire physique.

Ce n'est pas tout à fait correct, comme expliqué plus loin dans le même article ( Erreur de page mineure ). Il y a des erreurs de page logicielles, où tout le noyau doit faire est d'ajouter une page à l'ensemble de travail du processus. Voici un tableau du livre Windows Internals (j'ai exclu ceux qui entraînent une violation d'accès):

  • Raison de l'erreur - Résultat
  • Accéder à une page qui ne réside pas en mémoire mais qui se trouve sur le disque dans un fichier d'échange ou un fichier mappé - Allouez une page physique et lisez la page souhaitée à partir du disque et dans le jeu de travail correspondant
  • Accès à une page qui se trouve sur la liste de réserve ou modifiée - Transitionnez la page vers le processus, la session ou l'ensemble de travail système correspondant
  • Accès à une page de demande nulle - Ajoutez une page remplie de zéro à l'ensemble de travail correspondant
  • Écriture sur une page de copie sur écriture - Faites une copie de la page privée du processus (ou privée de la session) et remplacez l'original dans le processus ou le jeu de travail système

Les défauts de page peuvent se produire pour diverses raisons, comme vous pouvez le voir ci-dessus. Un seul d'entre eux concerne la lecture à partir du disque. Si vous essayez d'allouer un bloc à partir du tas et que le gestionnaire de tas alloue de nouvelles pages, puis accède à ces pages, vous obtiendrez une erreur de page de demande nulle. Si vous essayez de raccorder une fonction dans kernel32 en écrivant dans les pages de kernel32, vous obtiendrez une erreur de copie sur écriture car ces pages sont silencieusement copiées de sorte que vos modifications n'affectent pas les autres processus.

Maintenant, pour répondre à votre question plus spécifiquement: Process Hacker ne semble avoir des défauts de page lors de la mise à jour de ses informations de service - c'est-à-dire, lorsqu'il appelle EnumServicesStatusEx , quels RPC au SCM (services.exe). Je suppose que dans le processus, beaucoup de mémoire est allouée, conduisant à des défauts de page sans demande (les informations de service nécessitent plusieurs pages à stocker, IIRC).

39
wj32

Une source lente mais régulière d'erreurs de page est le sondage du système d'exploitation pour les pages rarement consultées. Dans ce cas, le système d'exploitation marque certaines pages non présentes, mais les laisse en mémoire telles quelles. Si une application accède à la page, le piège #PF se produit et le système d'exploitation marque simplement la page présente à nouveau sans plus attendre. Si un "long temps" s'écoule et qu'une page ne déclenche jamais un défaut, le système d'exploitation sait que la page est un bon candidat pour l'échange si le besoin s'en fait sentir. Ce mécanisme peut fonctionner de manière proactive même en l'absence de pression sur les ressources.

5
srking

"page mappée dans l'espace d'adressage virtuel, mais non chargée dans la mémoire physique" n'implique pas qu'elle était auparavant dans la mémoire physique. Supposons que vous mappiez un fichier? Il est toujours sur le disque, pas encore en mémoire.

Supposons que vous mappiez un fichier journal et que vous continuiez à y ajouter. Chaque fois que vous dépassez la fin de la mémoire engagée, une erreur de page se produit, le système d'exploitation vous fournira une nouvelle page vide et ajustera la longueur du fichier.


Il peut également s'agir de violations d'accès qui sont détectées et traitées par le programme.


Il se peut également que le programme utilise plus de segments de mémoire que le TLB (qui est un cache pour les tables de pages). Lorsque les pages sont contiguës, elles peuvent toutes être gérées par une seule entrée de table de pages. Mais si la mémoire est fragmentée en espace d'adressage physique, de nombreuses entrées de table de pages sont nécessaires et peuvent ne pas tenir dans le TLB. Lorsqu'un échec TLB se produit, le gestionnaire de défauts de page du système d'exploitation est appelé et recherche le mappage dans la table de pages du processus.

À certains égards, il s'agit d'une variante de réponse de Dean : les pages sont déjà dans la RAM physique, et le système d'exploitation a besoin de charger ces mappages dans le TLB, mais pas à cause de l'IPC.

Brian a souligné que x86 (et donc tous les systèmes Win32) gère cela sans défaut de page.


Pourtant, une autre cause de défauts de page est le déclenchement de pages de garde utilisées pour la croissance de la pile et la copie sur écriture, mais elles ne se produisent généralement pas sans limite. Je ne suis pas sûr à 100% si ceux-ci apparaîtront comme des violations d'accès ou non, car ils seront marqués comme une violation d'accès à l'entrée du piège MMU, mais sont probablement gérés par le système d'exploitation) gestionnaire de défauts de page et non transformé en violation d'accès en mode utilisateur (SEH).

4
Ben Voigt

Chaque fois qu'une section mmap'd est lue, une erreur de page est générée, ce qui inclut chaque fois que vous chargez une DLL. Ainsi, le chargement d'un DLL ne lit pas réellement tous les DLL dans la mémoire, il ne fait que provoquer une erreur lors de l'exécution du code).

2
Ana Betts

Vous verrez défauts de page logicielle lorsque la mémoire est partagée entre les processus. Fondamentalement, si vous avez un fichier mappé en mémoire partagé entre deux processus, lorsque le deuxième processus charge le fichier mappé en mémoire, des erreurs de page logicielle sont générées - la mémoire est déjà dans la RAM physique, mais le système d'exploitation doit réparer la mémoire les tables du gestionnaire afin que l'adresse de la mémoire virtuelle dans votre processus pointe vers la page physique correcte.

En particulier pour quelque chose comme Process Hacker, qui injecte probablement du code dans chaque processus en cours (afin de collecter des informations), il utilise probablement assez la mémoire partagée pour faire IPC.

1
Dean Harding

Les systèmes d'exploitation utilisent la pagination pour regrouper les éléments qui doivent être placés dans la mémoire physique et les déplacer entre la mémoire physique et la mémoire partagée. la plupart du temps, les éléments de données placés sur une seule page sont liés les uns aux autres. lorsque les éléments de données d'une page ne sont pas utilisés pendant une longue période, le système d'exploitation la déplace vers la mémoire virtuelle pour libérer de l'espace dans la mémoire physique. puis lorsqu'une page est requise alors qu'elle se trouve dans la mémoire virtuelle, le système d'exploitation la déplace de la mémoire virtuelle (disque dur) vers la mémoire physique. c'est Page Fault!

et rappelez-vous, différents systèmes d'exploitation sont différents dans les algorithmes de pagination.

Bases des défauts de page

0
Farzin Zaker

L'allocation des ressources est un équilibre délicat entre le fait de maintenir le stockage primaire disponible pour l'utilisation et d'éviter d'avoir à passer au secondaire autant que possible. Si un processus essaie d'allouer de la mémoire et ne peut pas, c'est généralement une exception et parfois une exception fatale.

Essentiellement, vous ne pouvez pas tout garder en RAM sans ressources libres disponibles car lorsqu'un programme démarre ou en demande plus, il se bloque.

0
Bacon Bits