L’un des rôles du noyau d’un système d’exploitation multitâche est la planification : déterminer quel thread d’exécution exécuter quand. Donc, un tel noyau a une notion de thread ou de processus . Un thread est un morceau de code séquentiel en cours d'exécution, qui possède sa propre pile et parfois d'autres données. Dans un contexte de système d'exploitation, les gens utilisent habituellement processus pour désigner un fil qui a son propre espace mémoire, et du fil pour signifier un fil qui partage son espace mémoire avec d' autres fils. Un processus peut avoir un ou plusieurs threads.
Certains systèmes d'exploitation, par exemple les systèmes unix plus anciens, fournissent uniquement des processus: chaque thread géré par le noyau dispose de son propre espace mémoire. D'autres systèmes d'exploitation, par exemple les systèmes unix les plus modernes, permettent aux processus de contenir plusieurs threads d'exécution: ils fournissent une notion de threads au niveau du noyau.
Il est également possible qu'un processus gère son propre thread. En multithreading coopératif , le code de chaque thread contient des instructions pour basculer vers un autre thread. Dans le multithreading préemptif , le processus demande des notifications asynchrones périodiques du noyau et réagit à ces notifications en basculant sur un autre thread. De cette manière, le multithreading est implémenté sans coopération noyau, au niveau utilisateur, dans une bibliothèque.
Un système peut offrir des threads au niveau du noyau et au niveau de l'utilisateur. c'est ce qu'on appelle le threading hybride .
Les threads au niveau utilisateur et au niveau du noyau ont chacun leurs avantages et leurs inconvénients. Le basculement entre les threads de niveau utilisateur est souvent plus rapide, car il n'est pas nécessaire de réinitialiser les protections de la mémoire pour basculer vers le planificateur intégré au noyau ni pour revenir au processus. Cela importe surtout pour les systèmes massivement concurrents qui utilisent un grand nombre de threads de courte durée, tels que certains langages de haut niveau ( Erlang en particulier) et leurs threads verts . Les threads au niveau utilisateur nécessitent moins de support du noyau, ce qui peut simplifier le noyau. Les threads au niveau du noyau permettent à un thread de s'exécuter alors qu'un autre thread du même processus est bloqué dans un appel système; les processus avec des threads au niveau utilisateur doivent veiller à ne pas bloquer les appels système, car ils bloquent tous les threads du processus. Les threads au niveau du noyau peuvent s'exécuter simultanément sur des ordinateurs multiprocesseurs, ce que ne peuvent réaliser des threads au niveau utilisateur.