Perché i thread a livello di utente sono più veloci dei thread a livello di kernel?


6

Ho scoperto che i thread a livello di utente sono molto più veloci dei thread a livello di kernel ma non sono riuscito a trovare alcun esempio convincente del PERCHÉ i thread a livello di utente sono più veloci dei thread a livello di kernel? Qualcuno potrebbe spiegarmelo.

I thread a livello di kernel sono lenti e inefficienti. Ad esempio, le operazioni sui thread sono centinaia di volte più lente di quelle dei thread a livello di utente.

preso da qui

Risposte:


7

I thread a livello di kernel richiedono un cambio di contesto , che comporta la modifica di un ampio set di registri del processore che definiscono la mappa di memoria e le autorizzazioni correnti. Elimina anche parte o tutta la cache del processore.

I thread a livello utente richiedono solo una piccola quantità di contabilità all'interno di un thread o processo del kernel.

Tuttavia, la differenza non è grande se i thread eseguono prevalentemente operazioni di I / O, poiché in ogni caso devono passare attraverso il kernel. È molto importante se stai cercando di implementare un tipo di simulazione con un numero molto elevato di processi indipendenti. In tal caso, è necessario prestare particolare attenzione ai meccanismi di sincronizzazione dei thread utilizzati, poiché alcuni di essi vanno anche al kernel e attivano un cambio di contesto.

http://www.cs.rochester.edu/u/cli/research/switch.pdf "In generale, il costo indiretto del cambio di contesto varia da diversi microsecondi a più di mille microsecondi per il nostro carico di lavoro."

Modifica: i thread a livello di utente mantengono uno stack per thread e possono o meno salvare i registri di uso generale a seconda dell'architettura e delle regole clobber della sua convenzione di chiamata. Può essere semplice come scaricare i registri nello stack, passare a un nuovo indirizzo e inserire alcuni registri, che potrebbero essere nella cache se quel thread è stato eseguito di recente.

Context-switch livello di kernel anche cambiare la mappa della memoria scrivendo al TLB , e cambiando il livello di sicurezza (livello di privilegio o "ring") del processore. Vedi "Considerazioni sulle prestazioni"


1
potresti per favore elaborare cosa intendi bookkeeping, perché per quanto ne so anche i thread a livello di utente hanno i loro registri e anche loro hanno bisogno di passare attraverso il cambio di contesto
vikkyhacks

Elimina attivamente la cache del processore prima dell'esecuzione del thread successivo o la cache del processore viene gradualmente sovrascritta con elementi del nuovo thread?
Ryder Bergerud,
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.