Domanda

Mi stavo solo chiedendo se esiste un modo elegante per impostare il carico massimo della CPU per un particolare thread eseguendo calcoli intensivi.

In questo momento ho individuato il ciclo che richiede più tempo nel thread (esegue solo la compressione) e lo utilizzo GetTickCount() E Sleep() con valori codificati.Si assicura che il ciclo continui per un certo periodo di tempo e poi dorma per un certo tempo minimo.Più o meno fa il lavoro, ad es.garantisce che il thread non utilizzerà più del 50% della CPU.
Tuttavia il comportamento dipende dal numero di core della CPU (enorme svantaggio) ed è semplicemente brutto (svantaggio minore :)).
Qualche idea?

È stato utile?

Soluzione

Non sono a conoscenza di alcuna API per fare in modo che lo scheduler del sistema operativo faccia ciò che desideri (anche se il tuo thread ha priorità inattiva, se non ci sono thread pronti con priorità più alta, il tuo verrà eseguito).Tuttavia, penso che tu possa improvvisare una funzione di limitazione abbastanza elegante in base a ciò che stai già facendo.Essenzialmente (non ho una macchina di sviluppo Windows a portata di mano):

Scegli un periodo di tempo predefinito durante il quale il thread rimarrà in pausa per ogni iterazione.Quindi, ad ogni iterazione (o ad ogni n-esima iterazione, in modo tale che la funzione di limitazione non diventi essa stessa un carico significativo della CPU),

  1. Calcola la quantità di tempo CPU utilizzata dal thread dall'ultima volta che è stata chiamata la funzione di limitazione (la chiamerò dCPU).Puoi usare il OttieniThreadTimes() API per ottenere il tempo di esecuzione del thread.
  2. Calcola la quantità di tempo reale trascorso dall'ultima volta che è stata chiamata la funzione di limitazione (la chiamerò dClock).
  3. dCPU/dClock è la percentuale di utilizzo della CPU (di una CPU).Se è più alto di quanto desideri, aumenta il tempo di sonno, se è inferiore, diminuisci il tempo di sonno.
  4. Metti il ​​thread in pausa per il tempo calcolato.

A seconda di come il tuo watchdog calcola l'utilizzo della CPU, potresti voler utilizzare GetProcessAffinityMask() per scoprire quante CPU ha il sistema.dCPU / (dClock * CPU) è la percentuale del tempo totale della CPU disponibile.

Dovrai comunque scegliere alcuni numeri magici per il tempo di sospensione iniziale e l'importo di incremento/decremento, ma penso che questo algoritmo potrebbe essere ottimizzato per mantenere un thread in esecuzione abbastanza vicino a una determinata percentuale della CPU.

Altri suggerimenti

Su Linux, puoi modificare la priorità di pianificazione di un thread con nice().

Non riesco a pensare a nessun modo multipiattaforma di ciò che desideri (o qualsiasi modo garantito punto e basta) ma dato che stai utilizzando GetTickCount forse non sei interessato al multipiattaforma :)

Utilizzerei le comunicazioni interprocesso e imposterei i processi intensivi a livelli adeguati per ottenere ciò di cui hai bisogno, ma non sono sicuro che sia appropriato per la tua situazione.

MODIFICARE:Sono d'accordo con Bernardo ecco perché penso che un processo piuttosto che un thread potrebbe essere più appropriato ma potrebbe non essere adatto ai tuoi scopi.

Il problema è che non è normale voler lasciare la CPU inattiva mentre hai del lavoro da fare.Normalmente si imposta un'attività in background sulla priorità IDLE e si lascia che sia il sistema operativo a gestirne la pianificazione per tutto il tempo della CPU non utilizzato dalle attività interattive.

Mi sembra che il problema sia il processo di watchdog.

Se l'attività in background è vincolata alla CPU, è necessario che utilizzi tutto il tempo della CPU inutilizzato per l'attività.

Forse dovresti cercare di sistemare il programma watchdog?

Potresti essere in grado di modificare la priorità di un thread, ma la modifica dell'utilizzo massimo richiederebbe polling e hack per limitare il numero di cose che si verificano o l'utilizzo di strumenti del sistema operativo in grado di impostare l'utilizzo massimo di un processo.Tuttavia, non vedo alcuna circostanza in cui vorresti farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top