¿Es posible insinuar a Windows para que un proceso quede completamente fuera de intercambio?

13

¿Es posible insinuar al administrador de memoria virtual de Windows para sacar un proceso particular del intercambio?

La situación en la que a menudo me encuentro es usar aproximadamente el 50% de mi RAM para todos los programas normales, uno en particular es un IDE para un objetivo incrustado, junto con su depurador asociado.

Luego dejo un proceso de memoria hambriento en ejecución, por ejemplo, Wirehark o algo que está acumulando datos durante un fin de semana, todo se intercambia, como deberían. Una vez finalizado el gran proceso, la mayoría de los procesos se dejan en intercambio.

Luego, las pausas esporádicas para volver a intercambiar el proceso causan problemas con el depurador, presumiblemente debido a problemas de sincronización en las comunicaciones entre IDE y el depurador de hardware. Por lo tanto, el control del dispositivo de destino puede ser esporádico hasta que suficientes intentos hayan recuperado los datos de depuración en el IDE.

Greg
fuente
¡Esto sería muy útil! Desde el punto de vista de los usuarios, es molesto esperar el proceso de intercambio después de cada clic o acción del usuario. Sería mucho mejor decir: "¡Intercambie este proceso!" , ve a tomar un café y regresa a un sistema receptivo.
Tomás
No estoy familiarizado con los detalles del proceso de intercambio de Windows, pero ¿es esto algo que estás buscando? Debería haber un ejemplo binario que funcione en los comentarios.
Rik
1
Una vez tuve una pregunta similar y escribí un programa basado en las respuestas que obtuve en Stack Overflow.
Kerrek SB
@Kerrek, intenté compilar su código en MinGW y obtuve errores en cada lectura "Error al leer un byte de 0x161000, error 299 (lectura de 0 bytes)". Como solo tengo Windows en el trabajo, no fui lo suficientemente valiente como para ejecutar el binario aleatorio que adjuntaste, por lo que el problema podría estar en mi compilación.
Greg
1
@KerrekSB, parece un problema menor. ¿Quizás estás tocando un área de memoria que no está asignada? De todos modos, creo que su respuesta merece la recompensa :) PD: el intercambio parece mucho más lento de lo que podría ser, en comparación con la velocidad del disco duro. Parece que el cuello de botella está en otro lugar, pero ¿dónde?
Tomás

Respuestas:

1

KerrekSB desarrolló una herramienta especial para este propósito:

/programming//a/2940209/684229

Está disponible en GiTHUB con binarios: https://github.com/louisdx/unpage

Durante la ejecución, obtiene muchos errores "Error al leer un byte de 0x .... 000, error 299 (lectura de 0 bytes)", pero no es un problema, la herramienta funciona muy bien.

Tomás
fuente
"pero es un problema"? No creo que sea un problema.
Kerrek SB
Cita: "herramienta que intenta recuperar todas las aplicaciones en la memoria física". Con el "proceso de memoria" del cartel, esto podría no funcionar.
harrymc
@harrymc cita de la cuestión: After the big process is finished, most processes are left in swap.. Por lo tanto, presumiblemente ya terminó el "proceso de memoria hambriento".
Rik
@KerrekSB, por supuesto, fue un error tipográfico. Gracias :-)
Tomas
@Tomas Encontré esto . Con mi conocimiento muy limitado de c ++, verifiqué que por cada acceso fallido, la página está protegida por el bit PAGE_GUARD. Solía if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }justo antes de la línea ReadProcessMemory. PAGE_GUARD es 256 y obtuve 260 con las páginas fallidas. Por lo tanto, es posible deshacerse de los errores. Alguien con conocimientos de c ++ y de paginación necesita leer el bit PAGE_GUARD.
Rik
1

Puede usar Process Lasso para dar a un proceso una prioridad de página de memoria :

Comenzando con Windows Vista, cada página de memoria tiene una prioridad que va de 0 a 7. La Lista de espera se divide en ocho listas que manejan cada una páginas con una prioridad diferente. Cuando el Administrador de memoria desea tomar una página de la Lista de espera, primero toma las páginas de las listas de baja prioridad. "

Process Lasso puede ayudar a administrar las prioridades de memoria al permitir que se establezcan prioridades de memoria persistentes para los procesos, de modo que sus páginas de memoria virtual se establezcan con una prioridad específica cada vez que se ejecutan.

Process Lasso tiene dos versiones: gratuita y comercial ($ 18.95 con prueba).

harrymc
fuente
Me temo que está respondiendo una pregunta completamente diferente. Darle al proceso una prioridad de memoria es una tarea diferente, probablemente inútil en el contexto que OP y yo esbozamos: cuando ya tienes un proceso que está en intercambio y quieres deshacerlo. No desea evitar que se vaya a intercambiar.
Tomás
@Tomas: Ese no es mi entendimiento. La solicitud es evitar que se intercambie un proceso determinado. Si el proceso en sí no está programado para bloquear sus páginas en la memoria, la siguiente mejor solución es darle la mayor prioridad de memoria para que sea menos probable que se intercambie.
harrymc
3
@harrymc, OP dice que cuando se ejecuta el problema de memoria, "todo se intercambia, como deberían", así que eso es lo que quiere el OP. Es solo que el lunes por la mañana quiere que los conjuntos de trabajo de los procesos importantes se incorporen de una vez, no en trabas y drabs por fallas de página con el tiempo.
mgkrebbs
@mgkrebbs: Esa es una solución diferente al problema, que creo que es imposible de hacer. Mi solución es que si el IDE nunca se cambia, entonces no hay necesidad de volver a cambiarlo. El "proceso de memoria" solo tendrá unos pocos megabytes menos de RAM, lo que no afectará demasiado su rendimiento.
harrymc