Native POSIX Thread Library
Die Diskussion über diesen Antrag findet auf der Löschkandidatenseite statt.
Hier der konkrete Grund, warum dieser Artikel nicht den Qualitätsanforderungen entsprechen soll:
Einen Artikel Geschichte von Linux gibt es bereits. Dieser Artikel geht zu sehr ins Detail. -- FriedhelmW 10:32, 2. Nov 2005 (CET)
Die Native POSIX Thread Library (NPTL) ist eine moderne Implementierung einer Threading-Bibliothek für Linux. Sie wird in Verbindung mit der GNU C Library (glibc) verwendet und erlaubt Linux-Programmen die Verwendung von POSIX-Threads.
Geschichte
Seit der Kernel-Version 2.0 existierte für Linux die Threading-Bibliothek LinuxThreads, deren grundlegende Design-Prinzipien unter Einfluss der 1996 vorhandenen Beschränkungen des Linux-Kernels und der libc5 zustande gekommen waren. Linux hatte keine echte Unterstützung für Threads im Kernel, kannte aber den clone()-Systemaufruf, der eine Kopie des aufrufenden Prozesses mit identischem Adressraum erzeugte. LinuxThreads benutzte diesen Systemaufruf, um Thread-Unterstützung so gut es ging im Userspace zu simulieren. Die Bibliothek wurde zwar kontinuierlich verbessert, war aber schon lange nicht mehr zeitgemäß, und konzeptionell bedingt auch nicht reparierbar. Mittel der Wahl war daher eine komplette Neuimplementierung der Threading-Bibliothek.
Folgende Probleme wurden mit der existierenden LinuxThreads-Implementation identifiziert:
- Sie benötigt einen Manager-Thread im Prozess, der weitere Threads erzeugt, wieder aufräumt und die Signalbehandlung kanalisiert.
- Sie ist nicht POSIX-konform, da es zum Beispiel nicht möglich ist, ein Signal an den ganzen Prozess zu senden, bzw. der Kernel dafür sorgen muss, dass Signale wie SIGSTOP und SIGCONT an alle Threads im Prozess durchgereicht werden.
- Unter Last wird die Performance schlecht, da das Signalsystem zum Zwecke der Synchronisierung missbraucht wird. Dies ist auch schlecht für die Stabilität.
- Jeder Thread führt fälschlicherweise eine eigene Prozess-ID.
- Auf der wichtigen IA-32-Architektur waren nur maximal 8192 Threads möglich.
Um die bestehenden Probleme zu lösen, wurde zusätzliche Infrastruktur im Kernel und eine neugeschriebene Threading-Bibliothek benötigt. Es wurden zwei konkurrierende Projekte gestartet: Next Generation POSIX Threads (NGPT) unter Leitung von IBM, und NPTL unter Federführung der bei RedHat angestellten Kernel- und glibc-Hacker Ingo Molnar und Ulrich Drepper. Nachdem sich abzeichnete, dass sich in der Praxis die NPTL durchsetzen würde, wurde das NGPT-Projekt Mitte 2003 eingestellt. Das NPTL-Team setzte sich folgende Ziele für ihre neue Bibliothek:
- POSIX-Konformität, um Userspace-Quellcode wieder besser portierbar zu machen
- effektive Verwendung von SMP und gute Skalierbarkeit, um auf Mehrprozessorsystemen die Performance zu steigern
- darauf aufbauend NUMA-Unterstützung
- niedrige Erzeugungskosten pro Thread
- Kompatibilität mit LinuxThreads, das heißt, alte Programme sollten ohne Neukompilierung mit der NPTL laufen
Unter diesen Voraussetzungen begann Mitte 2002 die Arbeit an der neuen Native POSIX Thread Library. Im August/September 2002 wurde der 2.5er Linux-Kernel für die NPTL fit gemacht. Dazu war es notwendig, einige neue Systemcalls einzuführen und vorhandene zu optimieren. In ersten Benchmarks konnten nun auf einem IA-32-System 100.000 parallele Threads aufgemacht werden, die in 2 Sekunden erzeugt werden konnten. Ohne NPTL dauerte allein die Erzeugung der Threads fast 15 Minuten. Trotz dieser bemerkenswerten Last blieb das System während dieser Tests annähernd mit normaler Geschwindigkeit benutzbar.
Red Hat Linux 9 war die erste Linux-Distribution, in der die NPTL in einem gepatchten 2.4er Kernel verwendet wurde (und deren Benutzer dadurch bisweilen zu unfreiwilligen Betatestern wurden). Inzwischen benutzen praktisch alle modernen Distributionen die NPTL, wenn ein Kernel der Version 2.6 oder höher verwendet wird.
Konzept
NPTL funktioniert ähnlich wie LinuxThreads. Der Kernel verwaltet immer noch Prozesse und keine Threads, und neue Threads werden mit einem von der NPTL aufgerufenen clone() erzeugt. Die NPTL benötigt allerdings spezielle Kernelunterstützung, und implementiert damit Synchronisationsmechanismen, bei denen Threads schlafengelegt und wieder aufgeweckt werden. Dazu werden Futexes verwendet.
Die NPTL ist eine so genannte 1×1-Threading-Bibliothek. Die vom Benutzer mit der pthread_create()-Funktion erzeugten Threads stehen dabei in einer 1-zu-1-Beziehung mit Prozessen in den Scheduler-Queues des Kernels. Dies ist die einfachste denkbare Threading-Implementation. Die Alternative wäre m×n. Dabei existieren typischerweise mehr Threads im Userspace als es Prozesse im Kernel gibt. Die Threading-Bibliothek wäre dann dafür verantwortlich, die Prozessorzeit auf die einzelnen Threads im Prozess zu verteilen. Mit diesem Konzept wären sehr schnelle Kontextumschaltungen möglich, da die Anzahl der notwendigen Systemaufrufe minimiert wird, andererseits würde aber die Komplexität erhöht werden, und es könnte leichter zu Prioritätsinversion kommen.