Введение

Native POSIX Thread Library (NPTL) — это реализация спецификации POSIX Threads для операционной системы Linux.

История

До версии 2.6 ядра Linux процессы были планируемыми сущностями, и специальных средств для работы с потоками не существовало. Однако в нём был системный вызов, который создавал копию вызывающего процесса, разделяющую с ним адресное пространство. Проект LinuxThreads использовал этот системный вызов для обеспечения потоков на уровне ядра (большинство предыдущих реализаций потоков в Linux работали целиком в пользовательском пространстве). К сожалению, он лишь частично соответствовал стандарту POSIX, особенно в части обработки сигналов, планирования и примитивов межпроцессной синхронизации. Для улучшения LinuxThreads стало очевидно, что необходима поддержка ядра и новая библиотека потоков. Для решения этой задачи были запущены два конкурирующих проекта: NGPT (Next Generation POSIX Threads), разрабатываемый командой, включавшей разработчиков из IBM, и NPTL командой Red Hat. Команда NGPT тесно сотрудничала с командой NPTL и объединила лучшие возможности обеих реализаций в NPTL. Проект NGPT был впоследствии прекращён в середине 2003 года после переноса его лучших функций в NPTL. NPTL впервые был выпущен в Red Hat Linux 9. Старая система Linux POSIX известна проблемами с потоками, которые периодически отказываются уступать процессорное время системе, поскольку она не использует возможность их принудительной остановки, что в то время Windows делала лучше. Red Hat заявила, что NPTL устранила эту проблему в статье на веб-сайте Java, посвящённой Java в Red Hat Linux 9. NPTL входит в состав Red Hat Enterprise Linux с версии 3 и в ядро Linux с версии 2.6. Теперь это полностью интегрированная часть библиотеки GNU C. Существует инструмент трассировки NPTL, называемый POSIX Thread Trace Tool (PTT). Также был разработан Open POSIX Test Suite (OPTS) для тестирования библиотеки NPTL на соответствие стандарту POSIX.

Дизайн

Как и LinuxThreads, NPTL является библиотекой потоков 1:1. Потоки, создаваемые библиотекой (через pthread_create), соответствуют один к одному планируемым сущностям в ядре (процессам, в случае Linux). Это самая простая из трех моделей потоков (1:1, N:1 и M:N). Новые потоки создаются с помощью системного вызова clone, вызываемого через библиотеку NPTL. NPTL использует поддержку ядра для futexes для более эффективной реализации блокировок в пользовательском пространстве.