Nombre maximal de threads peuvent s'exécuter simultanément en java sur un PROCESSEUR
S'il vous plaît je suis confus au sujet de quelque chose.
Ce que je sais, c'est que le nombre maximal de threads qui peuvent s'exécuter simultanément sur un PROCESSEUR normal d'un ordinateur moderne varie de 8 à 16 fils.
D'autre part, en utilisant les Gpu des milliers de threads peuvent s'exécuter simultanément sans le planificateur d'interrompre un thread pour planifier un autre.
Sur plusieurs postes:
La machine virtuelle Java - nombre maximal de threads https://community.oracle.com/message/10312772
les gens sont en indiquant qu'ils ont exécuté des milliers de java threads simultanément sur normal Processeurs.
Comment cela pourrait-il être???
Et comment puis-je connaître le nombre maximal de threads peuvent s'exécuter simultanément, de sorte que mon code s'ajuste elle-même de façon dynamique en fonction de l'architecture sous-jacente.
OriginalL'auteur user3060396 | 2014-02-08
Vous devez vous connecter pour publier un commentaire.
Les Threads ne sont pas liés à ou limitée par le nombre de processeurs/cœurs. Le planificateur du système d'exploitation peut basculer entre n'importe quel nombre de threads sur un seul PROCESSEUR. C'est le sens de "multitâche préemptif."
Bien sûr, si vous avez plus de threads que de cœurs, pas tous les threads d'exécution simultanément. Certains seront en attente pour un intervalle de temps.
Dans la pratique, le nombre de threads que vous pouvez avoir est limité par le planificateur - mais ce nombre est généralement très élevé (en milliers de dollars ou plus). Il peut varier d'un OS à l'OS et avec des versions individuelles.
Autant que le nombre de threads utile à partir d'un point de vue des performances, comme vous l'avez dit, il dépend du nombre de processeurs disponibles et que la tâche est IO ou liées à l'UC. Faites des essais pour trouver le nombre optimal et de le rendre configurable si possible.
En effet, une bonne clarification.
Juste pour le fun: Le montant maximal de threads que je peux créer sous Windows 7 x64 avec la valeur par défaut la taille de la pile et à l'aide de
STACK_SIZE_PARAM_IS_A_RESERVATION
pour s'assurer que seul le minimum de mémoire nécessaire est en fait commis est d'environ 72k avec 8 go de mémoire.OriginalL'auteur TypeIA
Il y a le matériel et les logiciels de simultanéité. Le 8 à 16 fils se réfère au matériel que vous avez - c'est un ou plusieurs Processeurs avec le matériel pour exécuter 8 à 16 fils parallèles les uns aux autres. Les milliers de threads renvoie le nombre de threads logiciels, le planificateur devra changer de sorte que chaque logiciel thread obtient sa tranche de temps d'exécution sur le matériel.
Pour obtenir le nombre de threads matériels, vous pouvez essayer
Runtime.availableProcessors()
.à moins que votre système d'exploitation fonctionne sur les coopératives de threads, il y aura toujours un cpu de la minuterie de déclenchement du planificateur via une interruption matérielle. Si les filets sont prêts à exécuter dépend de ce qu'ils font et d'avoir des milliers de threads s'ils ne le sommeil est encore gaspillage (une pile et de la structure de gestion pour chaque).
Il est possible de faire fonctionner un OS multitâche préemptif avec pas de timer interrupt. Les autres meams d'engager un planificateur de s'exécuter, c'est à dire, les interruptions de disque, carte réseau, KO, la souris et le logiciel interrompt à partir de requêtes d'e/S et inter-thread synchro sont extrêmement importantes. La minuterie est juste un autre interruption de la source et en ignorant le reste est tout simplement mauvais.
Aussi - vous êtes conscient que les piles sont remplaçables?
tant qu'il y a toujours moins de threads prêts à exécuter que le matériel est disponible et vous avez raison que l'utilisation d'un timer est inutile, une fois que vous obtenez plus de certains processus peuvent mourir de faim. Sur la pile question: piles occuper de la mémoire, des milliers de threads peut rapidement occuper 2 GO ou plus et d'échanger entre eux seulement, il est plus lent à revenir.
OriginalL'auteur josefx
À un moment donné, d'un processeur exécutera le nombre de threads égal au nombre de cœurs de contenus. Cela signifie que sur un système monoprocesseur, un seul thread (ou sans fil) est en cours d'exécution à un moment donné.
Cependant, les processeurs ne pas exécuter chaque thread l'un après l'autre, ils ont plutôt basculer entre plusieurs threads rapidement pour simuler une exécution simultanée. Si ce n'était pas le cas encore créer plusieurs threads, vous n'aurez même pas être en mesure de démarrer plusieurs applications.
Un fil de java (comparé à d'instructions du processeur) est un très haut niveau d'abstraction d'un ensemble d'instructions pour le PROCESSEUR aux processus. Quand il se met à niveau du processeur, il n'y a aucune garantie qui threads de s'exécuter sur la base à un moment donné. Mais étant donné que les processeurs de commuter rapidement entre ces fils, il est théoriquement possible de créer un nombre infini de fils mais au détriment des performances.
Si vous pensez à ce sujet, un ordinateur moderne a des milliers de threads en cours d'exécution au même moment (la combinaison de toutes les applications), tandis que seulement avoir 1 ~ 16 (cas typique) nombre de cœurs. Sans cette tâche de commutation, rien n'aurait pu se faire.
Si vous êtes l'optimisation de votre application, vous devez tenir compte de la quantité de fils que vous avez besoin par le travail à la main, et non par l'architecture sous-jacente. Des gains de performances de parallélisme doit être pondérée contre l'augmentation des frais généraux de l'exécution du thread. Depuis chaque machine est différente, chaque environnement d'exécution est différente, il est impossible de travailler sur certains golden thread count (toutefois, une estimation peut être faite par l'analyse comparative et en regardant le nombre de cœurs).
Réponse fixe.
OriginalL'auteur initramfs