2013-05-23 16 views
7

In un processo di Windows esiste un limite per i thread da utilizzare alla volta. In caso affermativo qual è il numero massimo di thread che possono essere utilizzati per processo?Qual è il numero massimo di thread che un processo può avere in windows

+0

Hai provato https://www.google.de/#q=What+is+the+maximum+number+of+threads+a+process+ puoi + avere + in + windows già? –

+0

Ho provato questo. Il mio ultimo 64 bit Vista rifiuta di creare più di ~ 7000 thread, non ricordo la cifra esatta. –

+5

Questa non è solo una "vera domanda", è preziosa. Non è immediatamente ovvio che il limite non è 16 o 32 o un numero inutilmente piccolo. Inoltre, non è un po '"difficile dire ciò che viene chiesto qui", e non vi sono ambiguità, vaghezza, ecc. Vorrei che le persone che chiudevano tali domande riflettessero un po' di più sul valore che le domande potrebbero fornire agli altri non provvedere a se stessi Questa domanda ha chiesto esattamente cosa volevo sapere e le risposte sono state molto utili. In quale altro modo dovevamo saperlo - tramite ESP? Esperienza? omatai

risposta

4

non c'è limite, che io sappia, ma ci sono due limiti pratici:

  1. Lo spazio virtuale per le pile. Ad esempio in 32-bit lo spazio virtuale del processo è 4 GB, ma solo circa 2G sono disponibili per uso generale. Per impostazione predefinita, ogni thread riserva 1 MB di spazio di stack, quindi il valore massimo è di 2000 thread. Ovviamente è possibile modificare le dimensioni della pila e abbassarla in modo da inserire più thread (parametro dwStackSize in CreateThread o opzione /STACK nel comando linker). Se si utilizza un sistema a 64 bit questo limite praticamente scompare.
  2. L'overhead del programma di pianificazione. Una volta che hai letto le migliaia di thread, solo la loro programmazione manterrà quasi il 100% del tempo della tua CPU, quindi sono comunque quasi inutili. Questo non è un limite difficile, solo il tuo programma sarà più lento e lento più thread creerai.
+0

Bene, dipende dallo stato del thread. 6000 thread bloccati ha effetto zero sul funzionamento della mia macchina. Inoltre, non riesco a vedere come, anche se i thread fossero pronti/funzionanti, sarebbe molto importante se avessi 16 thread o 1600 - i miei 4/8 core sarebbero usciti al massimo in entrambi i casi. –

+0

@MartinJames: perché gli algoritmi utilizzati dallo scheduler del kernel decidono cosa eseguire la scala successiva con le dimensioni della tabella thread. Indubbiamente i dettagli variano con la versione di Windows, ma ricordo di aver creato 2000 thread in WinXP facendo solo 'for (;;) Sleep (1000)' e l'utilizzo della CPU era superiore all'80%. – rodrigo

+0

IIRC, la struttura del thread readdt è fondamentalmente una matrice ordinata prioritaria di code di puntatori ai blocchi di informazioni sui thread. Se una coda ha 2000 voci ma ci sono solo quattro core, lo shuttling intorno ai thread su un interrupt del timer richiede semplicemente di spingere i "vecchi" quattro thread nella parte posteriore e scoppiare quattro "nuovi" dalla parte anteriore - non importa come lunga la coda è. Non ci vorrà molto tempo? –

1

Il limite effettivo è determinato dalla quantità di memoria disponibile in vari modi. Non vi è alcun limite di "non si può avere più di questo" su thread o processi in Windows, ma ci sono dei limiti alla quantità di memoria che è possibile utilizzare all'interno del sistema e, quando si esaurisce, non è possibile crearne altri filettature.

Vedere questo blog da Mark Russinovich: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

Problemi correlati