windows - salio - ¿Qué causa las fallas de página?
porque nokia salio del mercado (7)
Cada vez que se lee una sección de mmap, se genera un error de página, que incluye cada vez que carga una DLL. Por lo tanto, cargar un archivo DLL en realidad no lee todo el archivo DLL en la memoria, solo causa una falla a medida que se ejecuta el código.
Un error de página es una trampa para el software generado por el hardware cuando un programa accede a una página que está mapeada en el espacio de direcciones virtuales, pero no está cargada en la memoria física . (énfasis mío)
De acuerdo, 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 fallas de página?
O en otras palabras, ¿por qué se está paginando cualquier memoria? (No tengo idea si es usuario o memoria del núcleo). No tengo ningún archivo de página, y el uso de RAM es de aproximadamente 1,2 GB de 4 GB, que es después de un reinicio limpio. No hay escasez de ningún recurso; ¿Por qué algo sería localizado?
La asignación de recursos es un equilibrio delicado entre mantener el almacenamiento primario disponible para su uso y evitar la necesidad de ir a la secundaria tanto como sea posible. Si un proceso intenta asignar memoria y no puede, generalmente es una excepción y, a veces, una excepción fatal.
Esencialmente, no puede mantener todo en la memoria RAM sin recursos gratuitos disponibles porque cuando se inicia un programa o pide más se bloqueará.
Los sistemas operativos utilizan la paginación para agrupar elementos que deben colocarse en la memoria física y moverlos entre la memoria física y la memoria compartida. la mayoría de las veces, los elementos de datos que se colocan en una sola página, están relacionados entre sí. cuando los elementos de datos en una página no se utilizan durante mucho tiempo, el sistema operativo lo mueve a la memoria virtual para liberar espacio en la memoria física. y luego, cuando se requiere una página que está en la memoria virtual, el sistema operativo la mueve de la memoria virtual (disco duro) a la memoria física. ¡Esto es una falla de página!
y recuerde, los diferentes sistemas operativos son diferentes en los algoritmos de paginación.
Una fuente lenta pero constante de fallas de página es el sondeo del sistema operativo para páginas a las que se accede con poca frecuencia. En este caso, el sistema operativo marca algunas páginas que no están presentes, pero las deja en la memoria tal como está. Si una aplicación accede a la página, se produce la captura #PF y el sistema operativo simplemente marca la página presente nuevamente sin más preámbulos. Si pasa un "largo tiempo" y una página nunca falla, entonces el SO sabe que la página es un buen candidato para el intercambio en caso de necesidad. Este mecanismo puede funcionar de manera proactiva incluso en momentos en que no hay presión de recursos.
Verá fallas de página suave cuando la memoria se comparte entre procesos. Básicamente, si tiene un archivo mapeado en memoria compartido entre dos procesos, cuando el segundo proceso carga el archivo mapeado en memoria, se generan fallas en la página: la memoria ya está en la RAM física, pero el sistema operativo necesita reparar la memoria las tablas del administrador para que la dirección de la memoria virtual en su proceso apunte a la página física correcta.
Particularmente para algo como Process Hacker, que probablemente inyecta código en cada proceso en ejecución (para recopilar información) es probable que haga un uso bastante pesado de la memoria compartida para hacer IPC.
(Soy el autor de Process Hacker).
En primer lugar:
Un error de página es una trampa para el software generado por el hardware cuando un programa accede a una página que está mapeada en el espacio de direcciones virtuales, pero no está 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 de página suaves, 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 de Windows Internals (he excluido los que resultan en una infracción de acceso):
- Motivo de la falla - Resultado
- Acceder a una página que no reside en la memoria pero está en el disco en un archivo de página o un archivo mapeado - Asigne una página física y lea la página deseada desde el disco y en el conjunto de trabajo relevante
- Acceder a una página que está en la lista de espera o modificada: Transición de la página al proceso relevante, sesión o conjunto de trabajo del sistema
- Acceder a una página de demanda cero: agregar una página llena de cero al conjunto de trabajo relevante
- Escritura en una página de copia en escritura: realice una copia de la página de proceso privada (o sesión privada) y reemplace el original en proceso o en el conjunto de trabajo del sistema.
Las fallas de página pueden ocurrir por una variedad de razones, como puede ver arriba. Solo uno de ellos tiene que ver con la lectura desde el disco. Si intenta asignar un bloque desde el montón y el administrador de montón asigna nuevas páginas, luego accede a esas páginas, obtendrá un error de demanda de página cero. Si intenta enganchar una función en kernel32 escribiendo en las páginas de kernel32, obtendrá un error de copia sobre escritura porque esas páginas se copian silenciosamente para que sus cambios no afecten a otros procesos.
Ahora, para responder a su pregunta más específicamente: Process Hacker solo parece tener errores de página al actualizar su información de servicio, es decir, cuando llama a EnumServicesStatusEx , que RPCs a SCM (services.exe). Supongo que en el proceso se está asignando una gran cantidad de memoria, lo que lleva a fallas de demanda cero (la información del servicio requiere varias páginas para almacenar, IIRC).
La "página que está mapeada en el espacio de direcciones virtuales, pero no está cargada en la memoria física" no implica que estuviera previamente en la memoria física. ¿Supongamos que mapea un archivo? Todavía está en el disco, no en la memoria todavía.
Supongamos que mapea un archivo de registro y lo sigue añadiendo. Cada vez que exceda el final 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 son capturadas y manejadas por el programa.
También podría ser que el programa use más segmentos de memoria que ajuste en el TLB (que es un caché para las tablas de página). Cuando las páginas son contiguas, todas pueden manejarse mediante una sola entrada de tabla de página. 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 se produce una falla de TLB, se invoca al controlador de fallas de la página del SO y busca la asignación en la tabla de páginas del proceso.
De alguna manera, esta es una variación de la respuesta de Dean : las páginas ya están en 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 un error de página.
Otra causa más de las fallas de página es la activación de las páginas de protección utilizadas para el crecimiento de la pila y la copia por escritura, pero por lo general no ocurrirían sin límite. No estoy 100% seguro de si se mostrarán como violaciones de acceso o no, porque se marcarán como una infracción de acceso al ingresar a la trampa de MMU, pero es probable que el manejador de fallas de la página del SO las maneje y no se transforme en el usuario modo de violación (SEH) de acceso.