Eine der Rollen eines Multitasking-Betriebssystem-Kernels ist das Planen : Bestimmen, welcher Ausführungsthread wann ausgeführt werden soll. Ein solcher Kernel hat also eine Vorstellung von Thread oder Prozess . Ein Thread ist ein sequenzieller Code, der ausgeführt wird und über einen eigenen Stapel und manchmal auch andere Daten verfügt. In einem Betriebssystemkontext wird Prozess normalerweise als ein Thread mit eigenem Speicherbereich und Thread als ein Thread bezeichnet, der seinen Speicherbereich mit anderen Threads teilt. Ein Prozess kann einen oder mehrere Threads haben.
Einige Betriebssysteme, zum Beispiel ältere Unix-Systeme, bieten nur Prozesse an: Jeder Thread, den der Kernel verwaltet, verfügt über einen eigenen Speicherplatz. Andere Betriebssysteme, z. B. die meisten modernen Unix-Systeme, ermöglichen es Prozessen, mehrere Ausführungsthreads zu enthalten: Sie stellen eine Vorstellung von Threads auf Kernel-Ebene bereit.
Es ist auch möglich, dass ein Prozess sein eigenes Threading verwaltet. Beim kooperativen Multithreading enthält der Code jedes Threads Anweisungen zum Wechseln zu einem anderen Thread. Beim präemptiven Multithreading fordert der Prozess regelmäßig asynchrone Benachrichtigungen vom Kernel an und reagiert auf diese Benachrichtigungen, indem er zu einem anderen Thread wechselt. Auf diese Weise wird Multithreading ohne Zusammenarbeit mit dem Kernel auf Benutzerebene in einer Bibliothek implementiert.
Ein System kann sowohl Kernel- als auch Benutzerthreads anbieten. Dies wird als Hybrid-Threading bezeichnet .
Threads auf Benutzer- und Kernelebene haben ihre Vor- und Nachteile. Das Wechseln zwischen Threads auf Benutzerebene ist häufig schneller, da der Speicherschutz nicht zurückgesetzt werden muss, um zum kernelinternen Scheduler zu wechseln und erneut zum Prozess zurückzukehren. Dies ist hauptsächlich für Systeme von Bedeutung, die gleichzeitig eine große Anzahl von sehr kurzlebigen Threads verwenden, z. B. einige Hochsprachen ( insbesondere Erlang ) und deren grüne Threads . Threads auf Benutzerebene erfordern weniger Kernel-Unterstützung, wodurch der Kernel einfacher wird. Threads auf Kernel-Ebene ermöglichen die Ausführung eines Threads, während ein anderer Thread im selben Prozess in einem Systemaufruf blockiert wird; Prozesse mit Threads auf Benutzerebene müssen darauf achten, keine Systemaufrufe zu blockieren, da diese alle Threads des Prozesses blockieren. Threads auf Kernel-Ebene können gleichzeitig auf Multiprozessor-Computern ausgeführt werden, was Threads auf Benutzerebene nicht erreichen können.