НИТИ: потоки ядра против потоков, поддерживаемых ядром, против потоков уровня пользователя?

9

Кто-нибудь знает, в чем разница между ними?

Мне кажется, что потоки ядра соответствуют коду, который запускает ядро ​​(интуитивно), но я не уверен насчет двух других ...

Кроме того, будет ли стандарт pthreads рассматриваться на уровне пользователя и поддерживаться ядром, поскольку вы обращаетесь к библиотеке, пока ядро ​​выполняет планирование / переключение всех потоков?

Темный тамплиер
источник

Ответы:

14

Термин «потоки ядра» может использоваться для обозначения реальных потоков, которые полностью выполняются в пространстве ядра, или он может ссылаться на потоки пространства пользователя, запланированные ядром. Термин «поддерживаемые ядром» потоки означают последние, потоки, которые выполняются в пространстве пользователя, но облегчаются ядром, что обычно означает, что ядро ​​планирует их.

«Потоки уровня пользователя» обычно означают потоки, видимые в пространстве пользователя. То есть то, что вы создаете, когда вызываете функцию «создания потока» вашего стандарта потоков. Обычно термин «поток пользовательского уровня» используется для обозначения потока, созданного кодом приложения, независимо от того, как он реализован системой. Это может быть чистый поток пользовательского пространства, практически не поддерживающий ядро, или поток, запланированный ядром.

Стандарт pthreads может быть реализован как чистые потоки пользовательского пространства (где ядро ​​планирует процесс, а процесс планирует потоки), поддерживаемые ядром потоки (где ядро ​​планирует потоки напрямую) или гибридный подход (где ядро ​​планирует поток на уровне ядра, который затем в пользовательском пространстве планирует поток на уровне пользователя). Стандарт не требует каких-либо конкретных средств реализации. Наиболее распространенной реализацией является отображение 1-в-1, где каждый поток пользовательского уровня имеет соответствующий поток, который запланирован ядром.

Дэвид Шварц
источник
как выглядит реализация в Linux?
Яти Сагаде
3
Во всех современных Linux-системах (2.6 или более поздних), о которых я знаю, системная реализация потоков по умолчанию - 1-к-1, каждый поток пользовательского уровня имеет соответствующий KSE (объект планирования ядра - в основном, поток, запланированный Ядро Linux). Поток, который вы создаете с помощью 'pthread_create', будет запланирован непосредственно ядром. Современные системы обычно используют NPTL , более старые системы используют LinuxThreads - они оба один к одному.
Дэвид Шварц
«или гибридный подход (когда ядро ​​планирует поток на уровне ядра, который затем в пользовательском пространстве планирует поток на уровне пользователя)». Эй, Дэвид, не могли бы вы объяснить это еще раз? Я не уверен, что происходит ... Когда вы говорите, что сопоставление 1 к 1 имеет в виду блоки управления потоками, когда упоминается о ядрах уровня ядра?
Темный тамплиер
Под 1-к-1 я подразумеваю, что каждый раз, когда вы вызываете 'pthread_create', создается новый контекст, который запланирован ядром. В гибридном подходе число контекстов, запланированных ядром, меньше количества созданных потоков - ядро ​​планирует один из этих контекстов, а затем библиотека потоков планирует один из потоков, созданных приложением.
Дэвид Шварц