#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.