Criteri dell'utilità di pianificazione
Questo documento descrive il ruolo dei criteri dell'utilità di pianificazione nel runtime di concorrenza. I criteri dell'utilità di pianificazione controllano la strategia usata dall'utilità di pianificazione quando gestisce le attività. Ad esempio, si consideri un'applicazione per cui viene richiesto che alcune attività vengano eseguite in corrispondenza di THREAD_PRIORITY_NORMAL
e altre attività in corrispondenza di THREAD_PRIORITY_HIGHEST
. È possibile creare due istanze dell'utilità di pianificazione: una tramite cui viene specificato che i criteri ContextPriority
devono essere THREAD_PRIORITY_NORMAL
e un'altra tramite cui viene specificato che gli stessi criteri devono essere THREAD_PRIORITY_HIGHEST
.
Utilizzando i criteri dell'utilità di pianificazione, è possibile dividere le risorse di elaborazione disponibili e assegnare un set prestabilito di risorse a ogni utilità di pianificazione. Si consideri, ad esempio, un algoritmo parallelo che non viene ridimensionato oltre quattro processori. È possibile creare criteri dell'utilità di pianificazione che limitano le attività per l'uso simultaneo di non più di quattro processori.
Suggerimento
Tramite il runtime di concorrenza viene fornita un'utilità di pianificazione predefinita. Di conseguenza, non è necessario crearne una nell'applicazione. Poiché l'Utilità di pianificazione consente di ottimizzare le prestazioni delle applicazioni, è consigliabile iniziare con la libreria PPL (Parallel Patterns Library) o la libreria degli agenti asincroni se non si ha una novità del runtime di concorrenza.
Quando si usa il metodo concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create o concurrency::Scheduler::SetDefaultSchedulerPolicy per creare un'istanza dell'utilità di pianificazione, si fornisce un oggetto concurrency::SchedulerPolicy che contiene una raccolta di coppie chiave-valore che specificano il comportamento dell'utilità di pianificazione. Il SchedulerPolicy
costruttore accetta un numero variabile di argomenti. Il primo argomento è il numero di elementi dei criteri che si sta per specificare. Gli argomenti rimanenti sono coppie chiave-valore per ogni elemento di criteri. Nell'esempio seguente viene creato un SchedulerPolicy
oggetto che specifica tre elementi dei criteri. Nel runtime vengono utilizzati valori predefiniti per le chiavi dei criteri che non sono specificate.
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
L'enumerazione concurrency::P olicyElementKey definisce le chiavi dei criteri associate all'Utilità di pianificazione. Nella tabella seguente vengono descritte le chiavi dei criteri e il valore predefinito usato dal runtime per ognuno di essi.
Chiave dei criteri | Descrizione | Valore predefinito |
---|---|---|
SchedulerKind |
Valore concurrency::SchedulerType che specifica il tipo di thread da usare per pianificare le attività. | ThreadScheduler (utilizzare thread normali). È l'unico valore valido per questa chiave. |
MaxConcurrency |
Valore unsigned int che specifica il numero massimo di risorse di concorrenza usate dall'utilità di pianificazione. |
concurrency::MaxExecutionResources |
MinConcurrency |
Valore unsigned int che specifica il numero minimo di risorse di concorrenza usate dall'utilità di pianificazione. |
1 |
TargetOversubscriptionFactor |
Valore unsigned int che specifica il numero di thread da allocare a ogni risorsa di elaborazione. |
1 |
LocalContextCacheSize |
Valore unsigned int che specifica il numero massimo di contesti che possono essere memorizzati nella cache nella coda locale di ogni processore virtuale. |
8 |
ContextStackSize |
Valore unsigned int che specifica le dimensioni dello stack, espresso in kilobyte, da riservare per ogni contesto. |
0 (usare le dimensioni predefinite dello stack) |
ContextPriority |
Valore int che specifica la priorità del thread di ogni contesto. Può trattarsi di qualsiasi valore che è possibile passare a SetThreadPriority o INHERIT_THREAD_PRIORITY a . |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
Valore concurrency::SchedulingProtocolType che specifica l'algoritmo di pianificazione da usare. | EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
Valore concurrency::D ynamicProgressFeedbackType che specifica se ribilanciare le risorse in base alle informazioni sullo stato di avanzamento basate sulle statistiche. Nota Non impostare questo criterio su ProgressFeedbackDisabled perché è riservato per l'uso da parte del runtime. |
ProgressFeedbackEnabled |
Ogni utilità di pianificazione usa i propri criteri quando pianifica le attività. I criteri associati a un'utilità di pianificazione non influiscono sul comportamento di nessun'altra utilità di pianificazione. Inoltre, non è possibile modificare i criteri dell'utilità di pianificazione dopo aver creato l'oggetto Scheduler
.
Importante
Usare solo i criteri dell'utilità di pianificazione per controllare gli attributi per i thread creati dal runtime. Non modificare l'affinità o la priorità dei thread creati dal runtime poiché si potrebbe verificare un comportamento non definito.
Il runtime crea automaticamente un'utilità di pianificazione predefinita se non ne viene creata in modo esplicito uno. Se si vuole usare l'utilità di pianificazione predefinita nell'applicazione, ma si vuole specificare un criterio da usare per tale utilità di pianificazione, chiamare il metodo concurrency::Scheduler::SetDefaultSchedulerPolicy prima di pianificare il lavoro parallelo. Se non si chiama il Scheduler::SetDefaultSchedulerPolicy
metodo , il runtime usa i valori predefiniti dei criteri della tabella.
Usare i metodi concurrency::CurrentScheduler::GetPolicy e concurrency::Scheduler::GetPolicy per recuperare una copia dei criteri dell'utilità di pianificazione. I valori dei criteri ricevuti da questi metodi possono differire dai valori dei criteri specificati durante la creazione dell'utilità di pianificazione.
Esempio
Per esaminare esempi che usano criteri di utilità di pianificazione specifici per controllare il comportamento dell'utilità di pianificazione, vedere Procedura: Specificare criteri dell'utilità di pianificazione specifici e Procedura: Creare agenti che usano criteri dell'utilità di pianificazione specifici.
Vedi anche
Utilità di pianificazione
Procedura: Definire criteri dell'utilità di pianificazione specifici
Procedura: Creare agenti che usano criteri dell'utilità di pianificazione specifici