Skip to content

Come funzionano le priorità nel task-manager e quando dovrei/non dovrei impostarle?

Il nostro team di esperti dopo diversi giorni di lavoro e raccolta dati, abbiamo trovato la risposta, speriamo che possa essere molto utile per il tuo progetto.

Soluzione:

Supponiamo di avere una carta "vai in testa alla fila" per il negozio di alimentari. Si va al negozio, si riempie il carrello, si va alle casse e si scopre che non c'è nessuno in fila. La carta vi aiuta a fare il check-out più velocemente? No.

Le priorità non influenzano la velocità di elaborazione, nel senso che un processo a priorità più alta non viene eseguito più velocemente o non utilizza più tempo della CPU.non se è l'unica cosa che vuole usare la CPU.

Per parlare veramente di questo aspetto dobbiamo parlare di thread. I processi non "girano" in Windows. Sono i thread, che sono parti dei processi, a funzionare. (Anche se se un processo ha un solo thread, la distinzione è piuttosto confusa dall'esterno).

(A proposito: La terminologia di marketing secondo cui una CPU ha, ad esempio, "quattro core e otto thread", è fuorviante. Le CPU hanno dei core, ma non "hanno" dei thread. I thread sono parti di processi. Un core di CPU senza hyperthreading abilitato può eseguire un processoead; con l'hyperthreading abilitato, un core può eseguire due thread. Ma le CPU non "hanno" thread).

Ogni thread si trova sempre in uno dei diversi stati di programmazione. Gli stati più comuni sono: In attesa (*nix lo chiama "bloccato"; in entrambi i sistemi operativi significa in attesa di I/O o simili, non utilizza tempo di CPU e non ne vuole); Pronto (vuole utilizzare il tempo della CPU, ma nessuna CPU è disponibile in questo momento); e In esecuzione. Solo i thread in esecuzione consumano tempo di CPUe; In altre parole, se un processo non ha thread in esecuzione, in strumenti come Task Manager si vedrà che utilizza lo zero% di tempo della CPU.

Un thread può essere eseguito solo su un core (o, se l'hyperthreading è abilitato, su un "processore logico") alla volta, quindi un processo può usare solo tanti core (o LP) della CPU quanti sono i thread che vogliono essere eseguiti al momento. (La stessa affermazione può essere fatta per il sistema nel suo complesso).

La maggior parte dei thread sulla maggior parte dei sistemi passa la maggior parte del tempo nello stato di attesa. (Questo è il motivo per cui il vostro processo inattivo dovrebbe ottenere oltre il 95% del tempo della CPU quando il sistema non sta facendo nulla). Fanno eccezione i thread "di lavoro" di cose come il rendering video o 3d, i giochi, ecc. Pochissimi thread potrebbero davvero utilizzare il 100% della CPU, perché in genere devono lavorare su alcuni dati di input che devono leggere da qualche parte e in genere creano dati di output che devono essere scritti da qualche parte. Inoltre, possono fare riferimento a molti dati diversi in memoria nel corso del tempo, il che può significare che devono attendere la risoluzione di errori di pagina.

Ma i thread che eseguono qualcosa come il rendering video o il rendering di immagini 3D potrebbero passare quasi tutto il loro tempo a "elaborare" nella CPU, e molto poco ad aspettare l'I/O. Tali thread sono spesso chiamati "thread di calcolo". Tali thread sono spesso chiamati "compute-bound", il che significa che le loro prestazioni complessive sono limitate principalmente dalla velocità della CPU.

L'impostazione effettuata in Task Manager stabilisce la "priorità di base" per tutti i thread del processo. La priorità effettiva, o "corrente", del thread può essere più alta (ma mai più bassa di quella di base). Per saperne di più, si veda il paragrafo successivo. Le decisioni di programmazione ("chi deve essere eseguito e su quale CPU") vengono sempre prese in base alla priorità attuale del thread. La priorità è significativa solo per i thread pronti e in esecuzione (o per dirla in altro modo, priorità non è per i thread in attesa).

Windows utilizza un preemptive algoritmo di pianificazione. Se un solo thread del sistema vuole utilizzare il tempo della CPU, non ha alcuna importanza quale sia la sua priorità: ottiene il 100% della CPU. Non è che lo scheduler "trattenga" una parte della capacità della CPU quando è in esecuzione un thread a bassa priorità, solo nel caso in cui arrivi qualcosa di più prioritario.

Se due thread vogliono utilizzare una CPU e hanno la stessa priorità, vengono schedulati tramite il cosiddetto "time-slicing" e, nel corso del tempo, ciascuno ottiene circa il 50% del tempo della CPU. Se invece hanno priorità diverse, il thread con priorità più alta ottiene il 100% e quello con priorità più bassa il niente.

(In pratica non otterrà proprio nulla, perché sperimenterà un periodico "aumento di priorità per evitare la fame" che potrebbe dargli qualche decina di msec ogni 4 o 5 secondi circa. Ma questa non è una vera e propria eccezione alla regola "la priorità più alta vince", perché viene fatta regolando la priorità del thread affamato).

Se si dispone di più di un core della CPU, le cose si fanno più interessanti, e le priorità in generale hanno meno effetto. Supponiamo di avere due thread che vogliono essere eseguiti. E supponiamo di avere due o più core della CPU che non stiano facendo nient'altro con priorità uguale o superiore a questi thread. Allora i due thread otterranno ciascuno il 100% di un core, indipendentemente dalle rispettive priorità.

(Due persone si presentano al supermercato e ci sono due cassieri liberi. Uno dei clienti ha una carta "vai in testa alla fila". Non importa).

Versione tl;dr (finora): Le priorità non riguardano "chi ottiene quale proporzione di tempo della CPU", ma piuttosto "chi arriva per primo".

Non mi dilungherò molto sull'hyperthreading, se non per dire che Windows tratta ciascuno dei due "processori logici" di un core più o meno nello stesso modo in cui tratterebbe un core se l'HT fosse disattivato, cioè vengono trattati come "vere" CPU, con questa eccezione: Windows cercherà in tutti i modi di non utilizzare più di un LP alla volta in un core. numero di core di thread che cercano di funzionare contemporaneamente. Questo perché i due "processori logici" non forniscono il doppio delle prestazioni di un singolo core non hyperthreaded.

Riguardo alla "priorità di base": Windows regola ("boost" e "decay") la priorità corrente dei thread in base a ciò che hanno fatto di recente. I thread che hanno recentemente completato operazioni di I/O saranno normalmente una tacca o due sopra la priorità di base.e; I thread dell'interfaccia utente (thread che stanno eseguendo una finestra) saranno spesso molto più in alto; i thread legati alla CPU saranno di solito alla loro base. Lo scopo è quello di mantenere la reattività dell'interfaccia utente del programma e anche di far fluire le richieste di I/O verso oggetti come i dischi.

Un programma (processo) può anche cambiare la priorità di base di ciascuno dei suoi thread, entro un intervallo determinato dalla priorità del processo (quella impostata in Task Manager). Ma la stragrande maggioranza dei programmi non si preoccupa. (Dovrebbero esserlo di più).

Ci sono altre cose che accadono. A causa dell'aumento/decadimento della priorità, dei sistemi multiprocessore (multicore o hyperthread o entrambi), del fatto che in Windows ci sono sempre cose in esecuzione in background (ma, speriamo, che non utilizzino molto tempo della CPU) e degli effetti dell'"affinità" sia dura che morbida, è difficile eseguire dei casi di test e ottenere i risultati esatti che sarebbero previsti qui. Ma questo dovrebbe fornire un quadro quasi corretto.

In conclusione.

È ragionevole lasciare la maggior parte delle cose a "Normale". Se non lo si fa, si può facilmente finire per affamare qualcosa che si vorrebbe far funzionare (anche se non si sa che esiste), come le funzioni di lavaggio della cache del disco del sistema operativo. In effetti, molti dei processi del sistema operativo si troveranno in una posizione diversa da Normal e dovrebbero essere lasciati dove li ha messi Windows.

Un caso ragionevole di utilizzo di Task Manager per modificare le priorità è quello in cui si ha un'attività che assorbe la CPU (come il video o il rendering 3D) e che rallenta l'utilizzo del sistema mentre è in esecuzione. La cosa giusta è, che ci crediate o no, di inferiore la sua priorità di una o due tacche. Utilizzerà volentieri tutti i cicli della CPU che nessun altro desidera, ma si terrà lontano dall'uso interattivo del sistema. Potrebbe impiegare un po' di tempo in più per svolgere il suo lavoro, ma lo svolgerà con un'interferenza minima nell'uso interattivo di altri programmi. Se non vi piace questo compromesso, non fatelo! Se invece lo impostate ad alta priorità nel tentativo di "renderlo più veloce", potrebbe bloccare l'intera interfaccia utente fino a quando non avrà finito.

Non impostate mai nulla sulla cosiddetta classe di priorità Realtime.

(Modifica - aggiunto questo paragrafo) Ok, questa è un'affermazione estrema. ("Nessuna affermazione universale è vera - tranne questa"). Almeno, non senza un'attenta considerazione. Se il vostro obiettivo è far funzionare qualcosa più velocemente, probabilmente non vi aiuterà. Ma potrebbe "bloccare" il sistema (richiedendo un reset o, sulla maggior parte delle macchine moderne, un ciclo di alimentazione). O renderlo così poco reattivo che potrebbe anche essere bloccato.

n.b.: qualsiasi applicazione per la riproduzione di video dovrebbe essere in grado di scegliere la funzione "Pianificazione delle classi multimediali" in Vista e versioni successive. In questo modo si ottiene automaticamente fino all'80% della CPU, calcolata su intervalli relativamente brevi. Se non si riesce a ottenere una riproduzione priva di problemi, c'è qualcosa che non va.

Per maggiori dettagli, vedere i capitoli sui thread e sulla pianificazione in Interni di Windows 6a edizione di Solomon, Russinovich e Ionescu.

Vedere anche la mia risposta qui per informazioni su come vengono impostate le priorità dei processi e dei thread e sul significato della colonna "Priorità" in Task Manager.

La modifica delle priorità cambia il modo in cui il sistema operativo assegna il tempo della CPU alle applicazioni in esecuzione. Ha effetti evidenti solo se l'utilizzo complessivo della CPU è elevato.

Ad esempio, si codifica un video e si guarda un altro video allo stesso tempo. È probabile che l'applicazione di codifica utilizzi il 100% della potenza di calcolo su tutti i core della CPU. Di conseguenza, le altre applicazioni potrebbero essere bloccate.

Per impostazione predefinita, Windows attribuisce la stessa priorità "normale" a entrambe le applicazioni. A questo punto si consiglia di aumentare la priorità del software di riproduzione dei filmati. In questo modo si otterrà una riproduzione video fluida a scapito di una codifica video più lenta, perché il software di codifica sarà degradato a processo in background rispetto al lettore video.

Puoi supportare il nostro lavoro pubblicando un commento e valutandolo, te ne saremo eternamente grati.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.