Est-il possible d'indiquer à Windows de supprimer complètement un processus


13

Est-il possible d'indiquer au gestionnaire de mémoire virtuelle Windows de sortir un processus particulier du swap?

La situation dans laquelle je me trouve souvent utilise normalement environ 50% de ma RAM pour tous les programmes normaux, l'un étant en particulier un IDE pour une cible intégrée, ainsi que le débogueur associé.

Ensuite, je laisse un processus gourmand en mémoire en cours d'exécution - par exemple, WireShark ou quelque chose qui accumule des données sur un week-end, tout est échangé - comme il se doit. Une fois le gros processus terminé, la plupart des processus sont laissés en swap.

Ensuite, le sporadique fait une pause pour permuter le processus en arrière en causant des problèmes avec le débogueur, probablement en raison de problèmes de synchronisation dans les communications entre IDE et le débogueur matériel. Le contrôle du périphérique cible peut donc être sporadique jusqu'à ce que suffisamment de tentatives aient remis les données de débogage dans l'EDI hors du swap.


Ce serait très utile! Du point de vue des utilisateurs, il est ennuyeux d'attendre le processus échangé après chaque clic ou action de l'utilisateur. Il vaudrait beaucoup mieux dire: "annuler ce processus!" , optez pour un café et revenez à un système réactif!
Tomas

Je ne connais pas les détails du processus d'échange de Windows, mais est- ce quelque chose que vous recherchez? Il devrait y avoir un exemple binaire fonctionnel dans les commentaires.
Rik

1
J'ai eu une fois une question similaire et j'ai écrit un programme basé sur les réponses que j'ai obtenues sur Stack Overflow.
Kerrek SB

@Kerrek, j'ai essayé de compiler votre code sous MinGW et j'ai obtenu des erreurs à chaque lecture "Impossible de lire un octet à partir de 0x161000, erreur 299 (0 octet lu)." Comme je n'ai que Windows au travail, je n'étais pas assez courageux pour exécuter le binaire aléatoire que vous avez attaché, donc le problème pourrait être dans ma compilation.
Greg

1
@KerrekSB, semble être un problème mineur. Vous touchez peut-être une zone de mémoire qui n'est pas mappée? Quoi qu'il en soit, je pense que votre réponse mérite la prime :) PS: la suppression semble beaucoup plus lente qu'elle ne pourrait l'être, par rapport à la vitesse du disque dur. Semble que le goulot d'étranglement est ailleurs, mais où?
Tomas

Réponses:


1

KerrekSB a développé un outil spécial à cet effet:

/programming//a/2940209/684229

Il est disponible sur GiTHUB avec des binaires: https://github.com/louisdx/unpage

Pendant l'exécution, vous obtenez beaucoup d'erreurs "Impossible de lire un octet de 0x .... 000, erreur 299 (0 octet lu)", mais ce n'est pas un problème, l'outil fonctionne très bien.


"mais c'est un problème"? Je ne pense pas que ce soit un problème.
Kerrek SB

Citation: "outil qui essaie de récupérer toutes les applications dans la mémoire physique". Avec le «processus gourmand en mémoire» de l'affiche, cela pourrait ne pas fonctionner.
harrymc

@harrymc Citation de la question: After the big process is finished, most processes are left in swap.. Il est donc vraisemblable qu'il a déjà mis fin au «processus gourmand en mémoire».
Rik

@KerrekSB bien sûr, c'était une faute de frappe. Merci :-)
Tomas

@Tomas J'ai trouvé ça . Avec ma connaissance très limitée de c ++, j'ai vérifié que pour chaque accès échoué, la page est en effet protégée par le bit PAGE_GUARD. J'ai utilisé if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }juste avant la ReadProcessMemoryligne. PAGE_GUARD est 256 et j'ai obtenu 260 avec les pages en échec. Il est donc possible de se débarrasser des erreurs. Quelqu'un avec des connaissances en c ++ et en pagination doit lire le bit PAGE_GUARD.
Rik

1

Vous pouvez utiliser Process Lasso pour donner à un processus une priorité de page Mémoire :

À partir de Windows Vista, chaque page de mémoire a une priorité allant de 0 à 7. La liste de veille est divisée en huit listes qui traitent chacune des pages d'une priorité différente. Lorsque le gestionnaire de mémoire souhaite extraire une page de la liste de veille, il prend d'abord les pages des listes à faible priorité. "

Process Lasso peut aider à gérer les priorités de la mémoire en permettant de définir des priorités de mémoire persistantes pour les processus, afin que leurs pages de mémoire virtuelle soient définies sur une priorité spécifique à chaque exécution.

Process Lasso a deux versions: gratuite et commerciale (18,95 $ avec essai).


Je crains que vous ne répondiez à une question complètement différente. Donner au processus process une priorité mémoire est une tâche différente, probablement inutile dans le contexte OP et moi esquissé: lorsque vous avez déjà un processus en swap et que vous souhaitez le dé-swapper. Vous ne voulez pas l'empêcher de changer.
Tomas

@Tomas: Ce n'est pas ce que je comprends. La demande vise à empêcher l'échange d'un processus donné. Si le processus lui-même n'est pas programmé pour verrouiller ses pages en mémoire, la meilleure solution suivante est de lui donner la priorité de mémoire la plus élevée pour le rendre moins susceptible d'être échangé.
harrymc

3
@harrymc, OP dit que lorsque le porc de mémoire s'exécute, "tout est échangé - comme ils le devraient", c'est ce que souhaite l'OP. C'est juste que lundi matin, il veut que les ensembles de travail des processus importants soient introduits en une seule fois, et non pas dans les dribs et les ternes par les défauts de page au fil du temps.
mgkrebbs

@mgkrebbs: C'est une solution différente au problème, ce que je crois impossible à faire. Ma solution est que si l'EDI n'est jamais échangé, il n'est pas nécessaire de le réintégrer. Le "processus gourmand en mémoire" aura juste quelques mégaoctets de RAM en moins, ce qui n'aura pas trop d'impact sur ses performances.
harrymc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.