Подтвердить что ты не робот

Действительно ли библиотека Pthread представляет собой потоковое решение пользователя?

Название может быть недостаточно ясным, потому что я не знаю, как определить мои вопросы на самом деле.

Я понимаю, что Pthread - это библиотека потоков, отвечающая стандарту POSIX (о POSIX, см. wikipedia: http://en.wikipedia.org/wiki/Posix). Он доступен в Unix-подобной ОС.

О потоке, я читал, что есть три разные модели:

Нить пользовательского уровня: ядро ​​этого не знает. Пользователь сам создает/реализует/уничтожает потоки.

Уровень ядра: Ядро напрямую поддерживает несколько потоков управления в процессе.

Легкий процесс (LWP): запланирован ядром, но может быть ограничен пользовательскими потоками.

Вы видели мое замешательство? Когда я вызываю pthread_create() для создания потока, создал ли поток пользовательского уровня? Полагаю, что так. Могу ли я сказать, что Pthread предлагает решение для пользовательского уровня для потоков? Он не может манипулировать ядром/LWP?

4b9b3361

Ответ 1

Q: Я понимаю, что Pthread - это библиотека потоков, соответствующая стандарту POSIX

A: Да. На самом деле, "Pthreads" означает "Нити Posix": http://en.wikipedia.org/wiki/Pthreads

Q: Он доступен в Unix-подобных ОС.

A: На самом деле, он доступен для многих различных ОС... включая Windows, MacOS... и, конечно, Linux, BSD и Solaris.

Q: про нить я читал, что есть три разные модели

Теперь ты становишься нечетким. "Нити" - это очень общий термин. Есть много, много разных моделей. И много, много разных способов вы можете охарактеризовать и/или реализовать "потоки". Включая такие вещи, как модель потоков Java или модель потоков Ada.

Q: Когда я вызываю pthread_create() для создания потока, я создаю поток на уровне пользователя?

A: Да: почти все, что вы делаете в пользовательском пространстве, "защищено" в вашем собственном, "пользовательском пространстве".

Q: Поток пользовательского уровня: ядро этого не знает.

A: Нет. Ядро все знает :)

Q: Поток уровня ядра: ядро напрямую поддерживает несколько потоков управления процессом.

A: Да, есть такая вещь, как "потоки ядра".

И, как это бывает, Linux широко использует потоки ядра. Например, каждый отдельный процесс в системе Linux является "потоком ядра". И каждый созданный пользователем pthread ТАКЖЕ реализован как новый "поток ядра". Как и "рабочие потоки" (которые полностью невидимы для любого пользовательского процесса).

Но это сложная тема, которую вам НЕ нужно понимать, чтобы эффективно использовать pthreads. Вот отличная книга, в которой подробно обсуждалась эта и многие другие темы:

Разработка ядра Linux, Роберт Лав

Помните: "Pthreads" - это интерфейс. Как это реализовано, зависит от платформы. Linux использует потоки ядра; Windows использует потоки Win32 и т.д.

================================================== ========================= ADDENDUM:

Поскольку кажется, что люди все еще продолжают эту старую ветку, я подумал, что было бы полезно сослаться на этот пост:

fooobar.com/questions/192757/...

В Linux обычно используются две реализации pthreads: LinuxThreads и Native POSIX Thread Library (NPTL), хотя первая в значительной степени устарела. Ядро из 2.6 обеспечивает NPTL, который обеспечивает гораздо более тесную совместимость с SUSv3 и работает лучше, особенно при наличии большого количества потоков.

Вы можете запросить конкретную реализацию pthreads в shell, используя команду:

getconf GNU_LIBPTHREAD_VERSION

Вы также можете получить более подробную разницу в реализации в программном интерфейсе Linux.

"Pthreads" - это библиотека, основанная на стандарте Posix. Реализация библиотеки pthreads будет отличаться от платформы к платформе и от библиотеки к библиотеке.

Ответ 2

@paulsm4 Я сомневаюсь в вашем комментарии, что ядро ​​знает все. В этом конкретном контексте потоков пользовательского уровня ядро ​​не осознает тот факт, что такое происходит. Планирование потоков пользовательского уровня поддерживается самим пользователем (через интерфейс, предоставляемый библиотекой), и ядро ​​заканчивает выделение всего одного потока ядра для всего процесса. Ядро будет обрабатывать процесс как один поток, и любой блокирующий вызов одним из потоков приведет к блокировке всех потоков этого процесса. См. http://www.personal.kent.edu/~rmuhamma/OpSystems/Myos/threads.htm

Ответ 3

pthreads, по сути, на самом деле не является библиотекой потоков. pthreads - это интерфейс, который реализует конкретная библиотека потоков, используя ресурсы concurrency, доступные на этой платформе. Таким образом, существует реализация pthreads на linux, на bsd, на solaris и т.д., И хотя интерфейс (файлы заголовков и смысл вызовов) одинаковый, реализация каждого отличается.

То, что действительно делает pthread_create, с точки зрения объектов потока ядра, варьируется между ОС и реализациями библиотеки pthread. В первом приближении вам не нужно знать (тот материал, который абстракция pthread позволяет вам не знать об этом). В конце концов вам может потребоваться увидеть "за шторкой", но для большинства пользователей pthread, которые не нужны.

Если вы хотите знать, что делает реализация /specific/pthread, на конкретной ОС вам нужно будет уточнить свой вопрос. Например, что делает Solaris и Linux, очень разные.

Ответ 4

В Linux pthread реализован как легкий процесс. Ядро (v2.6 +) фактически реализовано с помощью NPTL. Позвольте мне процитировать содержимое вики:

NPTL представляет собой так называемую библиотеку потоков 1 × 1, в том, что потоки, созданные пользователем (через библиотечную функцию pthread_create()), имеют соответствие 1-1 с планируемыми сущностями в ядре (задачи в случае Linux). Это простейшая возможная реализация потоковой передачи.

Таким образом, pthread в ядре linux фактически реализуется как поток ядра.

Ответ 5

Pthreads - это стандартизированный интерфейс для библиотек потоков. Независимо от того, создан ли поток ОС или легкий поток, зависит от используемой библиотеки. Тем не менее, моим первым гостем было бы то, что ваши потоки являются "реальными" потоками уровня ОС.