6 votes

Empêcher la réduction du jeu de travail de la mémoire dans l'application Console ?

Je veux empêcher le jeu de travail de la mémoire de minimiser dans l'application Console. Dans l'application Windows, je peux le faire en Remplacer les messages SC_MINIMIZE . Mais, comment puis-je intercepter SC_MINIMIZE dans une application console ? Ou bien, puis-je empêcher la minimisation du jeu de travail de la mémoire par d'autres moyens ?

J'utilise Visual Studio 2005 C++. Quelqu'un a un problème, et la solution n'est pas réjouissante. :( http://www.eggheadcafe.com/software/aspnet/30953826/working-set-and-console-a.aspx

Merci, d'avance.

7voto

Remus Rusanu Points 159382

Le rognage de l'ensemble de travail ne peut être évité qu'en verrouillant les pages en mémoire, soit en les verrouillant explicitement à l'aide de la commande VirtualLock ou en mappant la mémoire en AWE . Mais les deux opérations sont extrêmement privilégiées et nécessitent que l'application soit exécutée sous un compte qui a le droit de 'verrouiller les pages en mémoire'. voir Comment faire : Activer l'option de verrouillage des pages en mémoire . Par défaut, personne, pas même les administrateurs, n'a ce privilège.

Techniquement, c'est la réponse que vous cherchez (en omettant les détails "mineurs" sur la façon d'identifier les régions à verrouiller). Mais votre question indique que vous êtes sur une voie totalement erronée.

Le rognage de l'ensemble de la faune et de la flore est une opération fréquente qui n'a pas d'effets indésirables graves. Vous confondez très probablement l'ajustement avec la pagination de la mémoire, mais il s'agit de deux phases distinctes de la durée de vie des pages de mémoire. L'ajustement se produit lorsque le système d'exploitation retire le mappage de la page au processus et place la page dans une liste d'attente. Il s'agit d'une opération très rapide et simple : la page est ajoutée à la liste d'attente et le système d'exploitation de l'OS la supprime. pte est marqué en conséquence. Aucune opération d'E/S ne se produit, le contenu physique de la RAM n'est pas modifié. Lorsque, et si, le processus accède à nouveau à la page découpée, une opération d'entrée/sortie est effectuée. défaut mou se produira. L'erreur de la TLB déclenchera une marche vers le noyau, ce dernier localisera la page dans la liste d'attente et la réallouera au processus. Rapide, rapide, facile, encore une fois, aucune opération d'E/S ne se produit, ni aucun changement de contenu de RAM pour la page. Ainsi, un processus dont tout l'ensemble de travail a été réduit retrouvera l'ensemble actif assez rapidement (microsecondes) s'il continue à référencer les pages.

Ce n'est que lorsque le système d'exploitation aura besoin de nouvelles pages pour sa liste libre qu'il consultera la liste d'attente, prendra la page la plus ancienne et l'échangera réellement sur le disque. Dans cette situation, il y a effectivement des entrées-sorties et le contenu de la RAM est réduit à zéro. Lorsque le processus accède à nouveau à la page a défaut dur se produira. L'erreur de la TLB va réveiller le noyau, qui va inspecter la liste de pte et maintenant une 'vraie' erreur de page va se produire : une nouvelle page libre est allouée, le contenu est lu depuis le disque, et ensuite la page est allouée au processus et l'exécution reprend depuis l'emplacement de l'erreur de la TLB.

Comme vous pouvez le constater, il y a une énorme différence entre l'élagage de l'ensemble de travail et un échange de pages sous pression de la mémoire. Si votre application console est rognée, ne vous en faites pas. Vous ferez des dommages incalculables à la santé du système en verrouillant des pages en mémoire. Et, en fait, vous faites aussi une mauvaise expérience utilisateur en refusant de minimiser quand on vous le demande, juste parce que vous ne comprenez pas le cycle de vie des pages.

Il est vrai qu'il existe des processus qui ont une demande légitime de garder leur poste de travail aussi chaud que possible. Tous ces processus, toujours, sont implémentés en tant que services. Les services bénéficient d'une politique d'élagage plus indulgente de la part du système d'exploitation, et cette politique est réellement configurable.

Si vous êtes vraiment si vous vous préoccupez de la mémoire du système et que vous voulez aider le système d'exploitation, vous devez vous inscrire pour recevoir des notifications de mémoire à l'aide de la fonction CreateMemoryResourceNotification et réagissez à la pression de la mémoire en libérant vos caches, et agrandissez à nouveau vos caches lorsque vous êtes informé que de la mémoire libre est disponible.

3voto

MSN Points 30386

SetProcessWorkingSetSize(Ex) ou utiliser VirtualLock sur la plage que vous voulez garder en mémoire physique.

Les deux auront un impact négatif sur les performances du système sous charge, mais je suppose que vous ne vous souciez pas de cela pour le moment.

2voto

K Singh Points 1265

Étant donné que les applications console n'ont pas, par défaut, de boucle de messages en cours d'exécution, vous ne pourrez pas avoir accès aux messages standard de Windows dans votre application console.

1voto

Yann Ramin Points 25139

Les applications en console ne reçoivent pas de messages de fenêtre. Il n'y a donc aucun moyen de déterminer si l'application se trouve devant l'utilisateur ou non. Vous devrez développer d'autres stratégies (peut-être un minuteur d'activité utilisateur) afin de désallouer la mémoire lorsque l'application n'est pas utilisée.

Vous pouvez également implémenter votre propre wrapper de type Console, mais ce n'est pas une tâche facile à réaliser correctement.

0voto

Necrolis Points 17569

Vous pouvez utiliser un contournement très sournois/hacky pour cela, qui pourrait être votre seul moyen :

SetConsoleTitle("MyConsole"); //at creation
//... 
HWND hWnd = FindWindow(NULL,"MyConsole"); //when it would minimize
ShowWindow(hWnd,SW_MAXIMIZE);

vous pouvez même modifier certaines des propriétés de la fenêtre en utilisant le HWND.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X