I thread del kernel Linux sono davvero processi del kernel?


19

Ho letto in molti punti che Linux crea un thread del kernel per ogni thread utente in una VM Java. (Vedo il termine "thread del kernel" utilizzato in due modi diversi:

  1. un thread creato per far funzionare il core OS e
  2. un thread di cui il sistema operativo è a conoscenza e pianifica l'esecuzione del lavoro dell'utente.

Sto parlando di quest'ultimo tipo.)

Un thread del kernel è lo stesso di un processo del kernel, dal momento che i processi Linux supportano spazi di memoria condivisi tra genitore e figlio o è veramente un'entità diversa?

Risposte:


23

Non c'è assolutamente alcuna differenza tra un thread e un processo su Linux. Se guardi il clone (2) vedrai una serie di flag che determinano cosa è condiviso e cosa non è condiviso, tra i thread.

I processi classici sono solo thread che non condividono nulla; puoi condividere quali componenti vuoi sotto Linux.

Questo non è il caso di altre implementazioni del sistema operativo, dove ci sono differenze molto più sostanziali.


22

La documentazione può essere piuttosto confusa, quindi ecco il " vero " modello Linux:

  • all'interno del kernel di Linux, qualcosa che può essere eseguito (e pianificato) è chiamato "processo",
  • ogni processo ha un ID processo (PID) univoco del sistema e un ID gruppo thread (TGID),
  • un processo "normale" ha PID = TGID e nessun altro processo condivide questo valore TGID,
  • un processo "threaded" è un processo il cui valore TGID è condiviso da altri processi,
  • diversi processi che condividono lo stesso TGID condividono, almeno, lo stesso spazio di memoria e gestori di segnale (a volte di più),
  • se un processo "threaded" ha PID = TGID, può essere chiamato "thread principale",
  • la chiamata getpid()da qualsiasi processo restituirà il suo TGID (= "main thread" PID),
  • la chiamata gettid()da qualsiasi processo restituirà il suo PID (!),
  • qualsiasi tipo di processo può essere creato con la clone(2)chiamata di sistema,
  • i nomi numerici delle cartelle che puoi elencare ls /proccome /proc/NUMBERsono i TGID,
  • i nomi numerici delle cartelle /proc/TGID/taskcome /proc/TGID/task/NUMBERsono PID,
  • anche se non vedi tutti i PID esistenti ls /proc, puoi comunque farlo cd /proc/any_PID.

Conclusione : dal punto di vista del kernel, esistono solo processi, ognuno con il proprio PID univoco e un cosiddetto thread è solo un diverso tipo di processo.

Nota: l'implementazione del concetto di "thread" in Linux ha portato a una confusione del vocabolario, e se ti getpid() sta mentendo non fa quello che pensavi, è perché il suo comportamento segue la compatibilità POSIX (i thread dovrebbero condividere un PID comune) .


1
Suggerimento: usare la parola "task" può aiutare a riferirsi a qualcosa che può essere eseguito senza entrare troppo nella confusione del processo / thread.
Totor

17

I thread sono processi in Linux. Vengono creati con la clonechiamata di sistema, che restituisce un ID processo che può essere inviato un segnale tramite la killchiamata di sistema, proprio come un processo. I processi di thread sono visibili psnell'output. I cloneflag di chiamata vengono passati per determinare la quantità di ambiente del processo padre condivisa con il processo thread.


1
L'uomo pthreads(7)afferma che per l'implementazione NPTL (Native POSIX Threads Library) corrente, "tutti i thread in un processo sono collocati nello stesso gruppo di thread; tutti i membri di un gruppo di thread condividono lo stesso PID". Nell'implementazione obsoleta di LinuxThreads, ogni "thread" ha il proprio PID.
Totor
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.