Question

Je suis en cours d'exécution d'un programme en mode utilisateur sur une priorité normale. Mon programme est à la recherche d'un problème NP, et par conséquent, utilise beaucoup de mémoire qui finit par se retrouver dans le fichier d'échange.

Ensuite, ma souris se fige, et il faut toujours pour le gestionnaire des tâches pour ouvrir et me laisser terminer le processus.

Ce que je veux savoir comment je peux arrêter mon système d'exploitation Windows de se bloquer complètement de ce même si seulement 1 de mes 2 noyaux sont utilisés.

Edit: Merci pour les réponses.

Je sais que ce qui en fait utiliser moins de mémoire vous aidera, mais il ne me fais pas de sens juste que l'ensemble OS devrait bloquer.

Était-ce utile?

La solution

Le problème est que lorsqu'un autre programme (par exemple explorer.exe) va exécuter, tout son code et de la mémoire a été permutées. Pour faire de la place pour l'autre programme Windows doit d'abord écrire les données que votre programme utilise le disque, puis charger la mémoire de l'autre programme. Chaque nouvelle page de code qui est exécuté dans l'autre programme nécessite l'accès au disque, faisant courir lentement.

Je ne connais pas le modèle d'accès de votre programme, mais je devine qu'elle touche toutes ses pages de mémoire beaucoup de façon aléatoire, ce qui rend le problème encore plus grave parce que dès que Windows évince une page de mémoire de votre programme, tout à coup vous en avez besoin à nouveau et Windows doit trouver une autre page pour donner le même traitement.

Pour donner d'autres processus plus de RAM à vivre, vous pouvez utiliser SetProcessWorkingSetSize pour réduire la quantité maximale de RAM que votre programme peut utiliser. Bien sûr, cela fera fonctionner votre programme plus lentement parce qu'il doit en faire plus swapping.

Une autre alternative, vous pouvez essayer est d'ajouter des disques au système, et distribuer les fichiers d'échange sur ceux-ci. Vous pouvez avoir un processeur dual-core, mais vous ne disposez que d'un seul lecteur. Distribuer le fichier d'échange sur plusieurs disques permet à Windows d'équilibrer le travail à travers eux (même si je n'ai pas d'expérience de première main de la façon dont elle le fait bien).

Autres conseils

La réponse évidente est « utiliser moins de mémoire ». Lorsque votre application utilise toute la la mémoire disponible, le système d'exploitation a à la page le gestionnaire de tâches (etc.) pour faire place à votre application. Lorsque vous changez de programme, le système d'exploitation a à la page retour les autres programmes (comme ils sont nécessaires). Lectures sur le disque sont plus lents que lit la mémoire, donc tout semble être allant plus lentement.

Si vous voulez éviter cela, demandez à votre application gérer sa propre mémoire, ou utiliser un meilleur algorithme de force brute. (Il y a génétique algorithmes, recuit simulé, etc.)

Je ne pense pas qu'il y ait une réponse de programmation à cette question, en dehors de « restructurer votre application pour utiliser moins de mémoire. » Le problème est swapfile très probablement en raison du goulot d'étranglement pour accéder au disque, surtout si vous utilisez un disque dur IDE ou un fichier d'échange très fragmenté.

Il est un peu extrême, mais vous pouvez toujours réduire votre fichier d'échange afin que vous n'avez pas tous les thashing disque, et votre programme ne peut pas allouer beaucoup de mémoire virtuelle. Sous Panneau de configuration / Avancé / onglet Avancé / Perfromance / Mémoire virtuelle, définir le fichier de page format personnalisé et entrez une valeur de 2 Mo (la plus petite autorisée sur XP). Lorsqu'une allocation échoue, vous devriez obtenir une exception et être en mesure gracieusement sortie. Il n'a pas tout à fait résoudre votre problème, juste vitesses vers le haut;)

Une autre chose à considérer serait si vous êtes plate-forme 32 bits ona, port à un système 64bit et obtenir une boîte avec beaucoup plus de RAM adressable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top