2017-01-13 1 views
5

J'ai une COM écrite en Delphi 101 Berlin. Et j'écris un script pour appeler son API (juste une API, single-threaded, et chacun prend environ 1 minute pour finir).Comment le système d'exploitation peut-il utiliser tous les cœurs pour mon application?

Je lance le fichier vbs en utilisant cscript.exe (64 bits) (et j'utilise le simple job runner here), beaucoup de copies (donc il y a beaucoup de processus), en même temps.

Cependant, j'ai testé sur de nombreux PC (Windows 10 Pro), et il est observé que seulement environ 1 core est en cours d'exécution malgré le fait qu'il a beaucoup de cœurs. Par exemple, sur mes 2 CPU (HPZ800 Intel Xeon X5650, 6 cœurs chacun = 12 cœurs), seul 1 core est utilisé.

Si certains scripts quittent prématurément, l'utilisation de l'UC restante sera améliorée, mais tous ne totalisent pas plus d'un cœur.

Ma question est de savoir comment écrire du code pour bénéficier de multi-cœurs?

enter image description here

+0

Vous dites "Je cours le fichier VBS en utilisant cscript.exe ... beaucoup de copies (donc il y a beaucoup de processus)". Avez-vous des preuves que de nombreux processus sont générés par cscript.exe? Il me semble assez clair que votre projet fonctionne comme un processus monothread. –

+0

comme vous pouvez le voir dans la capture d'écran, il existe de nombreuses copies de cscript.exe (processus), sur mon application, il est seul thread. –

+0

Aussi, juste parce qu'il y a beaucoup de processus en cours d'exécution, cela ne signifie pas que vous maximiserez vos processeurs. Cela dépend de la nature du processus. Si chaque processus fait un sleep() pendant 60 secondes, vous pourriez en avoir des milliers sans troubler votre processeur. –

Répondre

0

Afin d'utiliser des noyaux multiples dans le même temps, plusieurs fils sont requis. L'inverse n'est pas vrai! Pour vraiment tirer parti d'un système multicœur, une application devrait également diviser le traitement principal en plusieurs threads. Ses algorithmes doivent être parallélisés.

Source: https://scalibq.wordpress.com/2012/06/01/multi-core-and-multi-threading/

Mon API COM est mono-thread. Par conséquent, plusieurs processus ne permettent pas au système d'exploitation d'utiliser tous les cœurs. Comme expliqué dans les commentaires, si chaque processus ne dort que pendant 60 secondes, il n'y a aucun moyen de perturber tous les cœurs.

J'ai aussi une autre API avec entièrement multithread, et il peut utiliser tous les cœurs même avec 1 processus.

En outre, il est mentionné que s'il y a un concours d'E/S ou que plusieurs processus se battent pour les mêmes ressources, les utilisations pour les cœurs seront affectées. Je fais quelques expériences et il s'avère qu'un processus monothread peut utiliser au plus un core, mais lancer plusieurs d'entre eux peut utiliser tous les cœurs qui dépendent vraiment du système d'exploitation pour décider. S'il vous plaît voir mes expériences dans les détails When Can Windows Utilize All the Cores?

+1

Je voudrais ajouter ceci: vous n'avez pas le contrôle sur quel thread s'exécute sur quel processus et quand .. Ceci est la responsabilité du système d'exploitation ou d'être plus spécifique au planificateur. Tout ce que vous pouvez faire est que vous définissez des priorités sur les processus, de sorte que le planificateur lui donne plus d'espace. –

+0

J'ai essayé de définir une haute priorité aux processus, mais il semble que cela n'aide pas beaucoup. –