Как потоки POSIX реализованы в Linux?

#linux #multithreading #pthreads

#linux #многопоточность #pthreads

Вопрос:

Мне было интересно, являются ли потоки, созданные с помощью библиотеки pthreads, на самом деле потоками уровня ядра или потоками пользовательского пространства, которые не имеют ничего общего с ядром? Я слышал взаимоисключающие мнения по этому поводу, поэтому я хочу знать правду.

Комментарии:

1. NPTL следует модели 1: 1, простой и эффективной 🙂

Ответ №1:

До Linux 2.6 они были, по сути, потоками пользовательского пространства, отдельными процессами, которые были склеены вместе, потому что ядро не имело реальной поддержки потоков. Редактировать: До версии 2.6 существовала некоторая ограниченная поддержка потоков уровня ядра (функция clone ()), но она не использовалась с потоками posix, только с альтернативной библиотекой потоков под названием linuxthreads. С момента появления NPTL (собственной библиотеки потоков Posix) потоки являются потоками ядра.

Комментарии:

1. Если вы имеете в виду LinuxThreads, они тоже на уровне ядра.

2. Просто упомянул об этом, когда вы комментировали 😉 Но я имел в виду потоки posix, как и просил OP, и в то время они не были на уровне ядра

3. LinuxThreads были на уровне ядра, каждый поток соответствовал объекту планирования на уровне ядра (task).

Ответ №2:

Потоки, созданные pthread_create() в Linux, всегда были потоками уровня ядра. LinuxThreads не полностью соответствовали POSIX (потоки в одном процессе имели разные pid, обработка сигналов отличалась от того, что требует POSIX, …), поэтому NPTL был создан для устранения этих проблем.

Существуют библиотеки, которые реализуют потоки пользовательского уровня (например: GNU pth, p для переносимости), но они не используют POSIX thread API.