In the [[Linux]] operating system, theThe '''Native POSIX Thread Library''' ('''NPTL''') is aan softwareimplementation feature that enablesof the [[LinuxPOSIX kernelThreads]] tospecification runfor programs written to usethe [[POSIXLinux]]-style [[Threadoperating (computer science)|threads]] very efficientlysystem.
In tests, NPTL succeeded in running 100,000 threads simultaneously on a [[IA-32]] which were started in two [[second]]s. In comparison, this test under a kernel without NPTL would have taken around 15 minutes.
Before the 2.6 version of the [[Linux kernel]], processes were the schedulable entities, and there were no special facilities for [[Thread (computer science)|threads]].<ref>[https://web.archive.org/web/20210929083526/https://man7.org/linux/man-pages/man7/pthreads.7.html pthreads(7) — Linux manual page]</ref>
Before the 2.6 version of the linux kernel, processes were schedulable entities, and there was no real support for threads. However, it did supporthave a [[system call ]] -— {{mono|[[clone ( Linux system call) #Clone|clone]]}} -— which creates a copy of the calling process , where the copy shares the address space of the caller. The [[LinuxThreads]] project used this system call to simulateprovide kernel-level threads (most of the previous thread supportimplementations in Linux worked entirely in [[Userland (computing)|userland ]]). Unfortunately, it hadonly apartially number of issuescomplied with true POSIX compliance, particularly in the areas of signal handling, scheduling, and inter-process synchronization primitives. ▼
To improve upon LinuxThreads, it was clear that some kernel support and a re-writtennew threadsthreading library would be required. Two competing projects were started to address the requirement .: [[NGPT]] , or (Next Generation POSIX Threads ,) worked on by a team includingwhich included developers from [[IBM]], and of course NPTL by developers at [[Red Hat]]. The NGPT team collaborated closely with the NPTL team and combined the best features of both implementations into NPTL. The NGPT project was subsequently abandoned in mid- [[2003 ]] after merging its best features into NPTL. ▼
▲Before the 2.6 version of the linux kernel, processes were schedulable entities, and there was no real support for threads. However, it did support a system call - clone() - which creates a copy of the calling process, where the copy shares the address space of the caller. The [[LinuxThreads]] project used this system call to simulate thread support entirely in userland. Unfortunately, it had a number of issues with true POSIX compliance, particularly in the areas of signal handling, scheduling, and inter-process synchronization primitives.
NPTL was first released in Red Hat Linux 9 .0. Old-style Linux POSIX threading is known for having trouble with threads that refuse to yield to the system occasionally , because it does not take the opportunity to preemptively yieldpreempt them when it arises, something that Windows was known to do better at the time. Red Hat claimed that NPTL fixed this problem in an article on the [[Java (programming language )|Java]] website about Java on Red Hat Linux 9. <ref>[https://web.archive.org/web/20110604035631/http://java.sun.com/developer/technicalArticles/JavaTechandLinux/RedHat/ Red Hat Linux 9 and Java 2 Platform, Standard Edition 1.4.2: A Winning Combination]</ref>▼
▲To improve upon LinuxThreads, it was clear that some kernel support and a re-written threads library would be required. Two competing projects were started to address the requirement. [[NGPT]], or Next Generation POSIX Threads, worked on by a team including developers from [[IBM]], and of course NPTL by developers at [[Red Hat]]. NGPT was abandoned in mid-[[2003]].
NPTL has been part of [[Red Hat Enterprise Linux]] since version 3, and in the Linux kernel since version 2.6. It is now a fully integrated part of the [[GNU C Library]].<ref>[http://lists.gnu.org/archive/html/info-gnu/2004-08/msg00002.html GNU C Library version 2.3.3 release]</ref>
NPTL uses a similar approach to LinuxThreads, in that the primary abstraction known by the kernel is still a process, and new threads are created with the clone() [[system call]] (called from the NPTL library). However, NPTL requires specialised kernel support to implement (for example) the contended case of synchronisation primitives which might require threads to sleep and be re-awoken. The primitive used for this is known as a [[futex]].
There exists a tracing tool for NPTL, called [https://nptltracetool.sourceforge.net/ POSIX Thread Trace Tool] ([http://sourceforge.net/projects/nptltracetool/ PTT]). And an [http://posixtest.sourceforge.net/ Open POSIX Test Suite] ([https://sourceforge.net/projects/posixtest/ OPTS]) was written for testing the NPTL library against the POSIX standard.
NPTL is a so-called 1×1 threads library, in that threads created by the user (via the pthread_create() library function) are in 1-1 correspondence with schedulable entities in the kernel (processes, in the Linux case). This is the simplest possible threading implementation.
==Design==
An alternative to NPTL's 1×1 model is the m×n model where there are typically more userland threads than schedulable entities. In this implementation, the threading library is responsible for scheduling user threads on the available schedulable entities; this makes [[context_switch|context switching of threads]] very fast, as it avoids system calls. However, this increases complexity, and is liable to suboptimal scheduling without extensive (and expensive) coordination between the userland scheduler and the kernel scheduler, and the likelihood of [[priority inversion]].
Like LinuxThreads, NPTL is a 1:1 threads library. Threads created by the library (via ''pthread_create'') correspond one-to-one with schedulable entities in the kernel (''processes'', in the Linux case).<ref name="lsp-love">{{Cite book |title=Linux System Programming |author=Robert Love |edition=2nd |isbn=978-1449339531 |date=2013|publisher=O'Reilly Media, Incorporated }}</ref>{{rp|226}} This is the simplest of the three [[Thread (computing)#Threading models|threading models]] (1:1, N:1, and M:N).<ref name="lsp-love"></ref>{{rp|215–216}} New threads are created with the clone() [[system call]] called through the NPTL library. NPTL relies on kernel support for [[futex]]es to more efficiently implement user-space locks.<ref name="lsp-love"></ref>{{rp|182}}
▲NPTL was first released in Red Hat 9.0. Old-style POSIX threading is known for having trouble with threads that refuse to yield to the system occasionally because it does not take the opportunity to preemptively yield them when it arises, something that Windows was known to do better at the time. Red Hat claimed that NPTL fixed this problem in an article on the [[Java programming language|Java]] website about Java on Red Hat 9.
{{Portal|Free and open-source software}}
* [[LinuxThreads]]
NPTL has been part of [[Red Hat Enterprise Linux]] since version 3, and is now a fully integrated part of [[glibc]].
* [[Library (computer science)]]
* [[LinuxGreen threads]]
==References==
{{Reflist}}
==External links==
* [https://nptltracetool.sourceforge.net/ NPTL Trace Tool] OpenSource tool to trace and debug multithreaded applications using the NPTL.
* [http://people.redhat.com/drepper/nptl-design.pdf NPTL Design paper]
[[Category:POSIX standards]] ▼
{{Linux}}
[[de{{DEFAULTSORT:Native POSIXPosix Thread Library]]}}
[[Category:Linux kernel]]
▲[[Category: C POSIX standardslibrary]]
[[Category:Threads (computing)]]
|