¿Qué causa los fallos de página?
Según Wikipedia :
Una falla de página es una trampa para el software generada por el hardware cuando un programa accede a una página que está asignada en el espacio de direcciones virtuales, pero no cargada en la memoria física . (el énfasis es mío)
Bien, eso tiene sentido.
Pero si ese es el caso, ¿por qué cada vez que se actualiza la información del proceso en Process Hacker, veo alrededor de 15 errores de página?
O en otras palabras, ¿por qué se borra algún recuerdo? (No tengo idea de si es memoria de usuario o de kernel). No tengo ningún archivo de paginación y el uso de RAM es de aproximadamente 1,2 GB de 4 GB, que es después de un reinicio limpio. No falta ningún recurso; ¿Por qué se borraría algo?
(Soy el autor de Process Hacker).
En primer lugar:
Una falla de página es una trampa para el software generada por el hardware cuando un programa accede a una página que está asignada en el espacio de direcciones virtuales, pero no cargada en la memoria física.
Eso no es del todo correcto, como se explica más adelante en el mismo artículo ( Error de página menor ). Hay fallas leves de página, donde todo lo que el kernel necesita hacer es agregar una página al conjunto de trabajo del proceso. Aquí hay una tabla del libro Windows Internals (he excluido las que resultan en una infracción de acceso):
Razón de la falla | Resultado |
---|---|
Acceder a una página que no reside en la memoria pero que está en el disco en un archivo de página o en un archivo asignado | Asigne una página física y lea la página deseada desde el disco hasta el conjunto de trabajo correspondiente. |
Acceder a una página que está en la lista de espera o modificada | Realice la transición de la página al proceso, sesión o conjunto de trabajo del sistema relevante |
Acceder a una página de demanda cero | Agregue una página con ceros al conjunto de trabajo relevante |
Escribir en una página de copia en escritura | Haga una copia de la página de proceso privado (o de sesión privada) y reemplace el original en el proceso o en el conjunto de trabajo del sistema. |
Los errores de página pueden ocurrir por diversas razones, como puede ver arriba. Sólo uno de ellos tiene que ver con la lectura del disco. Si intenta asignar un bloque del montón y el administrador del montón asigna nuevas páginas y luego accede a esas páginas, obtendrá un error de página de demanda cero. Si intenta conectar una función en kernel32 escribiendo en las páginas de kernel32, obtendrá un error de copia en escritura porque esas páginas se copian silenciosamente para que sus cambios no afecten a otros procesos.
Ahora, para responder a su pregunta de manera más específica: Process Hacker solo parece tener fallas de página cuando actualiza su información de servicio, es decir, cuando llama a EnumServicesStatusEx , que RPC envía al SCM (services.exe). Mi conjetura es que en el proceso, se asigna mucha memoria, lo que genera fallas de página de demanda cero (la información del servicio requiere varias páginas para almacenarse, IIRC).
Una fuente lenta pero constante de fallas en las páginas es el sistema operativo que busca páginas a las que se accede con poca frecuencia. En este caso, el sistema operativo marca algunas páginas como no presentes, pero las deja en la memoria tal cual. Si una aplicación accede a la página, se produce la trampa #PF y el sistema operativo simplemente vuelve a marcar la página como presente sin más preámbulos. Si pasa "mucho tiempo" y una página nunca falla, entonces el sistema operativo sabe que la página es una buena candidata para intercambiarse si surge la necesidad. Este mecanismo puede funcionar de forma proactiva incluso en momentos sin presión de recursos.
"Página que está asignada en el espacio de direcciones virtuales, pero no cargada en la memoria física" no implica que estuviera previamente en la memoria física. ¿Supongamos que asigna un archivo? Todavía está en el disco, no en la memoria todavía.
Supongamos que asigna un archivo de registro y continúa agregándolo. Cada vez que excede el límite de la memoria comprometida, se produce un error de página, el sistema operativo le proporcionará una nueva página vacía y ajustará la longitud del archivo.
También podrían ser violaciones de acceso que el programa detecta y maneja.
También podría ser que el programa utilice más segmentos de memoria de los que caben en el TLB (que es un caché para las tablas de páginas). Cuando las páginas son contiguas, todas pueden ser manejadas por una sola entrada de la tabla de páginas. Pero si la memoria está fragmentada en el espacio de direcciones físicas, se necesitan muchas entradas en la tabla de páginas y es posible que no quepan en el TLB. Cuando ocurre una falla de TLB, se invoca el controlador de fallas de la página del sistema operativo y busca la asignación en la tabla de páginas del proceso.
En cierto modo, esta es una variación de la respuesta de Dean : las páginas ya están en la RAM física y el sistema operativo necesita cargar esas asignaciones en el TLB, pero no debido a IPC.
Brian señaló que x86 (y por lo tanto todos los sistemas Win32) maneja esto sin fallas de página.
Otra causa más de errores de página es la activación de páginas de protección utilizadas para el crecimiento de la pila y la copia en escritura, pero normalmente esto no ocurriría sin límites. No estoy 100% seguro de si aparecerán como violaciones de acceso o no, porque se marcarán como una violación de acceso al ingresar a la trampa MMU, pero probablemente sean manejadas por el controlador de fallas de la página del sistema operativo y no transformadas en el usuario. infracción de acceso al modo (SEH).