Qual è la differenza tra thread a livello di utente e thread a livello di kernel?


33

Dopo aver letto diverse fonti sono ancora confuso sui thread a livello di utente e kernel.

In particolare:

I thread possono esistere sia a livello di utente che a livello di kernel

Qual è la differenza tra il livello utente e il livello kernel?


1
È davvero Comp Sci (teoria) o solo programmazione?
Mehrdad,

6
@Mehrdad, Sistemi operativi fa parte dell'informatica.
Kaveh,

Risposte:


28

Uno dei ruoli di un kernel del sistema operativo multitasking è la pianificazione : determinare quale thread di esecuzione eseguire quando. Quindi un tale kernel ha qualche nozione di thread o processo . Un thread è un pezzo sequenziale di codice in esecuzione e ha il proprio stack e talvolta altri dati. In un contesto di sistema operativo, le persone di solito usano processo per indicare un thread che ha il proprio spazio di memoria e thread per indicare un thread che condivide il suo spazio di memoria con altri thread. Un processo può avere uno o più thread.

Alcuni sistemi operativi, ad esempio i sistemi unix precedenti, forniscono solo processi: ogni thread gestito dal kernel ha il suo spazio di memoria. Altri sistemi operativi, ad esempio la maggior parte dei moderni sistemi unix, consentono ai processi di contenere più thread di esecuzione: forniscono una nozione di thread a livello di kernel.

È anche possibile che un processo gestisca il proprio threading. Nel multithreading cooperativo , il codice di ogni thread contiene istruzioni per passare a un altro thread. Nel multithreading preventivo , il processo richiede periodicamente notifiche asincrone dal kernel e reagisce a queste notifiche passando a un thread diverso. In questo modo, il multithreading viene implementato senza alcuna cooperazione del kernel, a livello di utente, in una libreria.

Un sistema può offrire thread sia a livello di kernel che a livello di utente; questo è noto come threading ibrido .

I thread a livello di utente e kernel hanno ciascuno i loro vantaggi e svantaggi. Il passaggio tra thread a livello utente è spesso più rapido, poiché non richiede il ripristino delle protezioni della memoria per passare allo scheduler nel kernel e di nuovo per tornare al processo. Ciò è importante soprattutto per i sistemi concomitanti che utilizzano un numero elevato di thread di breve durata, come alcuni linguaggi di alto livello ( Erlang in particolare) e i loro thread verdi . I thread a livello utente richiedono meno supporto per il kernel, il che può semplificare il kernel. I thread a livello di kernel consentono l'esecuzione di un thread mentre un altro thread nello stesso processo è bloccato in a chiamata di sistema; i processi con thread a livello utente devono fare attenzione a non effettuare chiamate di sistema bloccanti, in quanto bloccano tutti i thread del processo. I thread a livello di kernel possono essere eseguiti simultaneamente su macchine multiprocessore, che i thread a livello di utente puramente non possono ottenere.


L'ultima riga dice "I thread a livello di kernel possono essere eseguiti simultaneamente su macchine multiprocessore, che i thread a livello di utente puramente non possono raggiungere". Ma, dice il link indicato, ULT può funzionare simultaneamente stackoverflow.com/questions/14791801/… . Sto sbagliando qualcosa?
Garrick,

Potete per favore controllare il mio commento sopra?
Garrick,

1
@Garrick È possibile eseguire più thread a livello utente contemporaneamente su core diversi, purché funzionino all'interno di thread a livello kernel diversi. Se hai solo ULT come strumento, sei limitato a un singolo processore. Se KLT è disponibile, è possibile distribuire i thread del kernel su più processori e inviare il proprio ULT tra i thread del kernel disponibili.
Gilles 'SO- smetti di essere malvagio' il

4

Pensa ai thread a livello di kernel come a " processori virtuali " e ai thread a livello di utente semplicemente come thread (chiamiamoli come tali per ora). Ora, per un thread da eseguire, è stato assegnato a un processore giusto? Pertanto, ogni thread viene assegnato a un processore virtuale in modo che possa essere eseguito.

Ecco i fatti

  • La creazione di un nuovo processore virtuale è un po 'costosa. (Il kernel deve creare una voce in Thread Control Block , assegnare stack ecc.)

  • La creazione di un thread è piuttosto semplice rispetto alla creazione di un nuovo processore virtuale. Uno sviluppatore di applicazioni può creare thread utilizzando le librerie di thread fornite dai linguaggi di programmazione e sono gestiti nello spazio utente . E diverse lingue implementano il multithreading in diversi modi.

Modelli

  • Se i thread sono mappati su un singolo processore virtuale, è necessario fare attenzione a non effettuare una chiamata di sistema bloccante in nessuno dei thread, poiché altri thread non possono più essere eseguiti contemporaneamente.

  • Questa limitazione può essere superata se è possibile creare alcuni processori virtuali in più. Ora, i thread possono essere eseguiti contemporaneamente (in parallelo se sono presenti più processori reali). Un thread non avrà effetto su altri thread mappati su altri processori virtuali.

  • In quest'ultimo modello, uno o più thread possono essere mappati su processori virtuali.

  • I modelli di cui sopra sono denominati Many to One, One to One e Many to Many rispettivamente.

Riferimenti: concetti di sistema operativo di Galvin et al. Argomento: Discussioni -> Modelli multithreading

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.