Perché la priorità dei processi non produce un miglioramento della velocità?


18

Ho 2 applicazioni che utilizzano entrambe molte risorse di sistema. Quando diminuisco la priorità di uno in Task Manager, aumentando l'altro, non noto alcun miglioramento significativo della velocità nell'applicazione con la priorità più alta.

Perchè è questo? Sta succedendo di più o c'è ancora molto da fare?


6
È come la vita reale. Se hai una priorità maggiore per salire su un aereo rispetto a un altro passeggero, ciò non significa che il volo impiegherà meno tempo per te!
Mehrdad,

Risposte:


28

La priorità non aiuta quando il collo di bottiglia è la CPU stessa. La priorità effettivamente influenza l' algoritmo di pianificazione utilizzato dal sistema operativo per determinare quale processo verrà eseguito successivamente poiché nella maggior parte dei sistemi non sono disponibili processori sufficienti per eseguire continuamente ogni processo.

Un'attività con priorità più elevata raggiungerà la cima della coda più rapidamente, quindi questo aiuta con latenza generale, ma se il processo sta esaurendo l'intero intervallo di tempo viene allocato sul calcolo effettivo, la pianificazione non cambierà nulla lì. La modifica della priorità è più utile quando si dispone di un processo in attesa sull'I / O e si desidera che sia più reattivo.


5
La priorità aiuta quando il collo di bottiglia è troppi thread eseguibili. I thread con priorità più alta su Windows che rimangono eseguibili alla fine della sequenza temporale avranno un'altra possibilità di essere eseguiti preferibilmente a un thread con priorità inferiore (Windows tenta di non morire di fame thread a bassa priorità e occasionalmente li aumenta). La priorità ha scarso effetto sui thread in attesa di I / O: Windows aumenta temporaneamente la priorità di un thread dopo il completamento di un I / O, a seconda del tipo di I / O su cui era in attesa.
Mike Dimmick,

4

La priorità è il tempo della CPU. Tutti i core vengono sempre utilizzati al 100%? In caso contrario, la priorità non avrebbe alcun effetto. Abbastanza spesso la CPU non è il collo di bottiglia, ma è memoria, disco o risorse GPU.


3

La priorità è importante solo quando sono presenti più thread eseguibili rispetto ai core della CPU disponibili. Quando ciò accade, la priorità controlla quali thread possono essere eseguiti. Nella maggior parte dei sistemi, non c'è abbastanza calcolo in corso per qualsiasi contesa sulla CPU: i thread sono tutti bloccati , in attesa che accada qualcosa. Potrebbe essere in attesa che tu digiti qualcosa, muovi il mouse, tocchi lo schermo o che i dati arrivino dal disco, dalla rete, da qualche altro dispositivo che hai collegato o che un altro thread finisca di lavorare su un dato critico struttura. Potrebbe essere in attesa di leggere una parte del programma dal disco o della memoria che è stata scambiata per essere letta, anziché leggere esplicitamente un file.

In Windows, lo scheduler mantiene una coda di thread eseguibili a ogni livello di priorità. Quando prende una decisione di pianificazione - che un thread ha esaurito il suo quantum (tempo consentito prima che qualcos'altro debba essere eseguito), il che significa che un altro thread dovrebbe fare un giro, oppure il thread si è bloccato e non è più eseguibile, o una priorità più alta il thread è stato sbloccato: verrà pianificato il thread successivo nella coda al livello di priorità più alto con tutti i thread eseguibili. Se il thread in esecuzione ha esaurito il suo quantum, viene messo alla fine della coda. Se è l'unico thread al suo livello di priorità che è eseguibile e non ci sono altri thread eseguibili con priorità più elevata, ma non in esecuzione, avrà un altro turno.

Nei sistemi multicore / multiprocessore, potrebbero esserci delle restrizioni su quali core può essere eseguito un thread. Inoltre, il sistema cerca di mantenere i thread sul loro core ideale e all'interno del loro nodo NUMA in modo che i dati del thread siano probabilmente ancora nella cache di quel core e abbia un rapido accesso ai dati che ha creato. I thread verranno comunque eseguiti su core non ideali se non è possibile scegliere cosa eseguire successivamente.

Il sistema utilizza vari boost di priorità dinamici e dimensioni quantiche dinamiche in modo che l'applicazione in primo piano ottenga più tempo (se necessario) rispetto ai processi in background e in modo che i processi possano reagire rapidamente al completamento delle operazioni di I / O (inclusi mouse, tastiera e input touchscreen). Inoltre, il potenziamento prioritario viene utilizzato per aggirare le inversioni prioritarie, in cui un thread ad alta priorità è in attesa di una risorsa che è attualmente in possesso di un thread a bassa priorità. Se è in esecuzione anche un thread con priorità media, il thread con priorità bassa del tempo del processore sarà ridotto a fame, mantenendo il thread con priorità alta. Quindi il thread a bassa priorità viene temporaneamente potenziato alla priorità più alta in modo da guadagnare tempo e spero di rilasciare la risorsa di cui il thread ad alta priorità ha bisogno.

Prima di Windows Vista, la priorità del thread non influiva sulla velocità con cui le operazioni di I / O venivano completate. A partire da Windows Vista, anche gli I / O possono avere una priorità, che per impostazione predefinita deriva dalla priorità del thread.

Riepilogo: in gran parte non vedrai alcun effetto nel cambiare le priorità dei thread a meno che la tua CPU non sia pesantemente caricata, e anche allora l'effetto sarà in genere minimo. Se il processo deve attendere l'I / O o non è in contrasto con altri processi per il tempo della CPU, sta già eseguendo il più veloce possibile e cambiando priorità non lo renderà più veloce.


0

In generale, è necessario uno sforzo supplementare per fare in modo che un programma utilizzi più di una CPU (aggiungendo il multi-threading). Quindi, anche se il programma ha la massima priorità disponibile, potrebbe utilizzare solo un core.

Altre possibili questioni:

  • Il programma potrebbe essere inefficiente / scritto male
  • Potrebbe essere rallentato a causa dell'accesso al disco "lento" o di una rete lenta

0

Anche aumentare la priorità di I / O di un processo associato a I / O non ne determinerà necessariamente l'esecuzione più rapida. Ad esempio, se è un consumatore di dati prodotti da un processo separato, possibilmente remoto, e tiene il passo con la velocità con cui quella fonte produce i dati, allora non può andare più veloce o avere un throughput più elevato.

Contrariamente a quanto affermato categoricamente nella prima frase della risposta attualmente accettata ( /superuser//a/752587/322588 ), i cambiamenti di priorità sono più efficaci quando la CPU è il collo di bottiglia, come spiegato nella risposta di Mike Dimmick ( /superuser//a/752864/322588 ). Inoltre, l'affermazione nel secondo paragrafo della risposta accettata, "se il tuo processo sta esaurendo l'intero intervallo di tempo è allocato sul calcolo effettivo, la pianificazione non cambierà nulla lì" è completamente sbagliata a meno che il processo non abbia già generalmente la priorità più alta di tutte thread eseguibili ogni volta che è in attesa di essere eseguito. Questo perché in tutte le altre circostanze, aumentare la priorità è probabile che ottenga più tempi per intervallo di clock.

Mike Dimmick ha sottolineato i problemi con questa risposta un paio di giorni fa e ha fornito una risposta molto migliore, ma il primo inspiegabilmente continua a guadagnare voti. L'affermazione del suo autore secondo cui sta semplicemente smorzando la sua risposta per noi manichini non è plausibile, perché non è semplicemente semplice, o addirittura semplicistica, è assolutamente sbagliata, almeno per quanto riguarda i processi legati alla CPU.

Disclaimer: non conosco il signor Dimmick, anche se posso dire che sa di cosa sta scrivendo.


Forse hai frainteso; la domanda era sui processi in esecuzione più veloce. I processi collegati alla CPU esauriranno la loro intera unità di programmazione (quantistica) e alla fine passeranno in coda di processi pronti. In un sistema operativo desktop come Windows, ciò significa che il processo ha possibilità 1 / quantum-Hz da eseguire ogni secondo. Cambiare la priorità (generalmente) non cambia la lunghezza dei suoi tempi. Per completare sarà necessario sempre lo stesso numero di quanti di programmazione. Fondamentalmente , questo è il modo in cui Windows misura effettivamente il runtime del processo: numero di quanti pianificati.
Andon M. Coleman,

Il processo può finire presto, ma ancora correva per lo stesso numero di unità di pianificazione. Quando un processo associato a I / O si inserisce nella lista d'attesa, potrebbe avere una seconda possibilità di eseguire e anticipare un processo in esecuzione con una priorità inferiore prima che scada il suo quanto se l'operazione di I / O viene completata. I processi legati alla CPU non hanno questa libertà, esauriscono il loro intero intervallo di tempo e poi entrano in una coda pronta. Si è possibile per loro di eseguire subito dopo se hanno una priorità sufficiente, ma che non ha nulla a che fare con il modo in cui Windows misura il tempo di esecuzione.
Andon M. Coleman,

La priorità su un processo associato I / O in attesa è fondamentalmente diversa e può avere un impatto misurabile sul runtime segnalato in Windows. Ancora una volta, Windows misura il runtime come il numero di quanti scaduti (anche se un processo spende 1 ms su un quantum di 10 ms effettivamente in esecuzione e quindi attende volontariamente i restanti 9 ms per l'I / O, il kernel di Windows lo considera come 10 ms di runtime in modalità utente). La prevenzione può aiutare le applicazioni associate a I / O a richiedere meno quanti per terminare. Altri kernel (ad es. Linux) possono misurare correttamente quanti parziali nel runtime di un processo, ma Windows no.
Andon M. Coleman,

@ AndonM.Coleman A partire da Vista e successivamente, sì, può e lo fa.
Jamie Hanrahan,

@JamieHanrahan: Beh, puoi sempre chiamare timeBeginPeriod (...), cosa che già fa qualsiasi cosa interattiva. Un gioco in genere lo imposta su 1 all'avvio, e questo applica un intervallo di programmazione di 1 ms su tutta la linea a tutto ciò che è in esecuzione sul sistema. Non è isolato solo dal processo che l'ha fatto. Fa parte del motivo per cui è difficile prendere sul serio Windows per il multi-tasking.
Andon M. Coleman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.