2009-10-16 19 views
9

Domanda successiva da Multi-core usage, threads, thread-pools.Movimento .NET di thread tra core

I fili vengono spostati da un nucleo all'altro durante il loro ciclo di vita?

Naturalmente. Immagina di avere tre thread in esecuzione su un sistema dualcore. Mostrami un programma corretto che non prevede coinvolgere regolarmente i fili tra i core.

Questa è la mia prima volta su questo sito, quindi non ho avuto abbastanza rep per commentare credo. Ho deciso di fare una nuova domanda facendo riferimento a quella su cui volevo commentare.

Qual è il processo di selezione di un nucleo in cui spostare un thread. È come se lo scheduler avesse un elenco di thread che necessitava di tempo di elaborazione e, man mano che uno finisce, ne inserisce un altro?

Inoltre, mi chiedevo se esiste un riferimento per l'affermazione che i thread vengano spostati tra i core. O è solo considerato "conoscenza comune"?

Grazie!

risposta

6

Non è che il thread stia vivendo su un particolare core e che sia un processo di che si sposta su un altro.

Il sistema operativo ha semplicemente un elenco di thread (e/o processi) che sono pronti per l'esecuzione e li invierà su qualsiasi core/CPU che risulta disponibile.

Detto questo, qualsiasi scheduler intelligente cercherà di pianificare il filo sullo stesso nucleo, per quanto possibile - semplicemente per aumentare le prestazioni (dati è più probabile che sia in quella del nucleo della cache ecc)

+0

Si tratta semplicemente di "la cache era già su questo core, quindi questa ha una maggiore probabilità di ottenere il thread indietro"? Sembrava essere più complicato di quello dopo aver letto "Fast Switching of Threads Between Core" di Strong e Tullsen et al. e "Implicazioni delle prestazioni della migrazione a singolo thread su un chip multi-core" di Constantinou, Sazeides et al. Se si tratta solo della cronologia della cache, allora lo scheduler di Windows è sotto il gruppo di "qualsiasi programma di pianificazione intelligente" o dovrebbe essere prestata attenzione per garantire che la pianificazione sia "intelligente"? – mphair

+0

È più come "questo thread è stato eseguito su questo core e probabilmente (a causa di cose come la cache della CPU) probabilmente verrà eseguito più velocemente se lo pianifico nuovamente su questo core". Non ho letto i documenti che citi, quindi non posso commentare su di loro. Gli algoritmi di pianificazione in Windows e in altri sistemi sono più avanzati di quelli a cui li ho generalizzati, ma l'idea è la stessa. È più veloce eseguire un thread sullo stesso core, quindi è più probabile che lo scheduler lo riporti lì. Ma nessuna garanzia se non si imposta manualmente l'affinità del thread. –

3

MSDN contiene alcuni articoli che probabilmente potrebbero aiutare a chiarire alcune cose: Scheduling Priorities e Multiple Processors.

Estratto (Pianificazione delle priorità):

Le discussioni sono in programma di esecuzione in base a loro priorità di programmazione. Ad ogni filo viene assegnata una priorità di pianificazione. I livelli di priorità vanno da zero (priorità più bassa) a 31 (priorità massima ). Solo la thread a pagina zero può avere una priorità pari a zero. (Lo zero-pagina è un filo sistema responsabile di azzeramento eventuali pagine libere quando non ci sono altri thread che devono funzionare.)

Il sistema tratta le parti con la stessa priorità uguali. Il sistema assegna le fasce orarie in modalità round-robin a tutti i thread con la priorità più alta . Se nessuno di questi thread è pronto per essere eseguito, il sistema assegna le fasce orarie in modalità round-robin a tutti i thread con la priorità successiva . Se una priorità più alta filo diventa disponibile per l'esecuzione, il sistema cessa di eseguire il filo bassa priorità (senza permettere che finisca utilizzando l'ora slice), e assegna un tempo pieno fetta alla priorità superiore filo.

E con riferimento a più processori:

computer con più processori sono in genere progettati per una delle due architetture: Non-Uniform Memory Access (NUMA) o multielaborazione simmetrica (SMP).

In un computer NUMA, ciascun processore è più vicino ad alcune parti della memoria rispetto ad altri, rendendo l'accesso alla memoria più veloce per alcune parti della memoria rispetto ad altre parti. Sotto il modello NUMA, il sistema tenta di pianificare i thread sui processori che sono vicini alla memoria utilizzata. Per ulteriori informazioni su NUMA, vedere Supporto NUMA.

In un computer SMP, due o più processori o core identici si connettono a una singola memoria principale condivisa. Sotto il modello SMP, qualsiasi thread può essere assegnato a qualsiasi processore. Pertanto, la pianificazione di thread su un computer SMP è simile alla pianificazione di thread su un computer con un singolo processore. Tuttavia, lo scheduler dispone di un pool di processori, in modo che possa pianificare i thread da eseguire contemporaneamente. La pianificazione è ancora determinata dalla priorità del thread, ma può essere influenzata impostando l'affinità del thread e il processore ideale del thread, come discusso in questo argomento.

+0

I collegamenti validi, tuttavia, non risolvono realmente il problema della migrazione dei thread. Quando creo il thread, cambiando la priorità o l'affinità del thread o il processore del thread ideale mi consentirò di selezionare il core su cui eseguire il thread, ma cosa succede se qualche altro thread blocca quel core. Lo scheduler quindi tiene conto di ciò e sposta il thread che ho creato in un core disponibile? – mphair

1

Windows fornisce l'API per impostare thread affinity (vale a dire per impostare le CPU su cui questo thread deve essere programmato). Non ci sarà bisogno di tale API se il thread viene sempre eseguito su un core.

2

Is è come se lo scheduler avesse una lista di thread che necessitavano di tempo di elaborazione e quando uno finisce, ne mette un altro in?

Quasi. Quello che descrivi è chiamato cooperative multi-tasking, dove ci si aspetta che i thread riportino regolarmente l'esecuzione allo scheduler (ad esempio vivendo solo per un breve periodo di tempo o chiamando regolarmente Thread.Current.Sleep(0)). Questo non è il modo in cui funziona un sistema operativo consumer moderno, perché un thread non cooperativo può incidere la CPU in un sistema del genere.

Quello che succede invece è che a intervalli di tempo regolari, si verifica un context switch. Il thread in esecuzione, che piaccia o meno, è sospeso. Ciò comporta la memorizzazione di un'istantanea dello stato dei registri della CPU in memoria. Lo scheduler del kernel ha quindi la possibilità di eseguire e rivalutare la situazione e può decidere di lasciare che un altro thread funzioni per un po '. In questo modo le fette di tempo della CPU (misurate in millisecondi o meno) vengono assegnate ai diversi thread. Questo è chiamato pre-emptive multitasking.

Quando un sistema ha più di una CPU o più core CPU, la stessa cosa accade per ogni core. L'esecuzione su ciascun core viene regolarmente sospesa e lo scheduler decide su quale thread eseguire successivamente. Poiché ogni core CPU ha gli stessi registri, lo scheduler può e sposterà un thread tra i core mentre tenta di allocare equamente le fasce temporali.