Poiché i thread utente sono associati ai thread del kernel, perché non creiamo tutti i thread come thread del kernel che è un processo con zero thread utente. Il mapping del thread utente al thread del kernel non crea un sovraccarico?
Questo è ciò che viene tipicamente fatto. La maggior parte delle piattaforme moderne non ha più thread utente. Troverai due tecnologie simili a thread utente, coroutine e fili / fibre. Ma non sono preventivi. Quindi il vero threading degli utenti si è praticamente estinto a favore dei thread del kernel.
(Per evitare confusione, per "thread del kernel", intendiamo thread che sono programmati dal kernel, non thread che vengono eseguiti nello spazio del kernel. Per "thread utente", intendiamo thread che non sono pianificati individualmente dal kernel ma dove lo scheduler dello spazio utente decide quale thread dello spazio utente deve essere eseguito.)
Why don't we create all threads as kernel thread
Quello che stai suggerendo è chiamato modello one to one in letteratura ed è principalmente usato. Ad esempio, JVM (Solaris) originariamente utilizzava molti modelli, creava solo un thread del kernel per molti thread utente. Ma poi è passato al modello one to one a causa di problemi di prestazioni.
Doesn't mapping of user thread to kernel thread create overhead?
Lo fa. Ma quel sovraccarico è nello spazio utente perché la creazione e la gestione dei thread utente sono fatti da qualche libreria come JVM e non richiede molto evolversi del kernel (leggere meno chiamate di sistema). Ma quando creiamo un thread del kernel per ogni thread utente, il sovraccarico si sposta nello spazio del kernel, perché ora il kernel deve creare strutture dati aggiuntive per ogni thread del kernel (leggere la chiamata del sistema clone in Linux). Inoltre, più thread del kernel significano più carico sullo schedulare (a seconda del criterio di pianificazione).
Leggi altre domande sui tag operating-systems multithreading