Quelles sont les causes des défauts de page?

Selon Wikipedia:

Une erreur de page est un piège au logiciel déclenché par le matériel lorsqu'un programme accède à une page qui est mappée dans l'espace d'adressage virtuel, mais pas chargée dans la mémoire physique . (l'emphase est mienne)

OK, c'est logique.

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

Capture

Ou, en d'autres termes, pourquoi est tout de mémoire paginée? (Je n'ai aucune idée si c'est la mémoire de l'utilisateur ou du noyau.) J'ai Pas de fichier de page, et l'utilisation de la RAM est d'environ 1,2 Go sur 4 GO, ce qui est après un redémarrage propre. Il ne manque aucune ressource; pourquoi quelque chose serait-il paginé?

24
demandé sur Michael Mrozek 2011-04-16 07:59:12

7 réponses

(Je suis l'auteur de Process Hacker.)

Tout d'Abord:

Une erreur de page est un piège pour le logiciel soulevé par le matériel quand un programme accède à une page mappée dans le espace d'adressage virtuel, mais pas chargé 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 défauts de page douce, où tout ce que le noyau doit faire est d'ajouter une page à l'ensemble de travail du processus. Voici un table du livre Windows Internals (j'ai exclu ceux qui entraînent une violation d'accès):

  • Raison de la Faute - Résultat
  • accès à une page qui n'est pas en mémoire mais qui est sur le disque dans un fichier de page ou un fichier mappé - allouez une page physique, et lisez la page souhaitée à partir du disque et dans l'ensemble de travail correspondant
  • accès à une page qui se trouve sur la liste de secours ou modifiée- Transition de la page vers le processus pertinent, session, ou ensemble de travail du système
  • accès à une page demand-zero - ajouter une page remplie de zéro à l'ensemble de travail correspondant
  • écriture sur une page copy-on-write - faites une copie process-private (ou session-private) de la page, et remplacez l'original dans le processus ou le jeu de travail du système

Les erreurs de Page peuvent se produire pour diverses raisons, comme vous pouvez le voir ci-dessus. Un seul d'entre eux a à voir avec la lecture à partir du disque. Si vous essayez d'allouer un bloc de la tas et le gestionnaire de tas alloue de nouvelles pages, puis accède à ces pages, vous obtiendrez une erreur de page zéro demande. Si vous essayez d'accrocher 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 afin que vos modifications n'affectent pas les autres processus.

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

36
répondu wj32 2011-04-17 00:41:25

Une source lente mais constante de défauts de page est le système d'exploitation qui Sonde 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 telle quelle. Si une application accède à la page, alors le piège #PF se produit et le système d'exploitation marque simplement la page présente à nouveau sans plus tarder. Si un" long temps " passe et qu'une page ne déclenche jamais une faute, 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 façon proactive, même en période d'absence de pression sur les ressources.

5
répondu srking 2011-04-16 18:27:37

"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 mappez 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 validée, un défaut de page se produit, le système d'exploitation vous fournira une nouvelle page vide et ajustera la longueur du fichier.


Il pourrait également s'agir de violations d'accès qui sont interceptées et manipulés par le programme.


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

À certains égards, il s'agit d'une variation de la réponse de Dean: les pages sont déjà dans la RAM physique, et le système d'exploitation doit 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 erreur de page.


Une autre cause de défauts de page est le déclenchement des pages de garde utilisées pour la croissance de la pile et la copie sur écriture, mais généralement celles-ci ne se produiraient pas sans bound. Je ne suis pas à 100% bien sûr, si ceux-ci apparaissent 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 gestionnaire de défaut de la page OS et non transformés en violation d'accès en mode utilisateur (SEH).

4
répondu Ben Voigt 2017-05-23 12:03:02

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'une DLL ne lit pas réellement toute la DLL en mémoire, cela ne fait qu'en faire une faute lorsque le code est exécuté.

2
répondu Paul Betts 2011-04-16 04:13:02

Vous verrez défauts de page douce 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 second processus charge le fichier mappé en mémoire, des défauts de page douce sont générés - la mémoire est déjà dans la RAM physique, mais le système d'exploitation doit réparer les tables du gestionnaire de mémoire afin que l'adresse de mémoire virtuelle dans votre processus pointe vers

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

1
répondu Dean Harding 2011-04-16 04:11:19

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 dans 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 le déplace vers la mémoire virtuelle pour libérer de l'espace dans la mémoire physique. et puis quand une page est nécessaire sorcière est dans la mémoire virtuelle, le système d'exploitation le déplace de la mémoire virtuelle (disque dur) à la mémoire physique. c'est la faute de Page !

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

Principes de base des défauts de Page

0
répondu Farzin Zaker 2011-04-16 04:11:36

L'allocation des ressources est un équilibre délicat entre garder le stockage primaire disponible pour l'utilisation et éviter d'avoir besoin d'aller 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 gratuites disponibles car lorsqu'un programme démarre ou en demande plus, il se bloque.

0
répondu Bacon Bits 2011-04-16 04:13:25