2013-02-09 2 views
2

Как потоки пользовательского уровня отображаются в потоки уровня ядра?Сопоставление потоков пользовательского уровня и потоков на уровне ядра

+0

Что-то не так с ответом на ваш другой вопрос? http://stackoverflow.com/questions/14791801/how-do-user-level-threads-ults-and-kernel-level-threads-klts-differ-with-reg?rq=1 –

+0

Потоки пользовательского уровня почти В любом случае, бесполезно. –

ответ

1

Это зависит от реализации. Три наиболее распространенные модели многопоточности являются:

  1. 1-к-1: Каждый поток пользовательского уровня имеет соответствующий объект, который планируется ядром.

  2. n-to-1: каждый процесс назначается ядром. Планирование потоков происходит полностью в пользовательском пространстве.

  3. n-to-m: Каждый процесс имеет пул сущностей, которые назначаются ядром. Они назначаются для запуска определенных потоков пользовательского уровня планировщиком пользовательского пространства, который является частью процесса.

Современные реализации почти все 1-к-1.

+0

ya, современные реализации почти 1-1, но я могу понять этот момент, когда я использую wither 'pthreate_create() - linux' или' CreateThread() - windows' или 'thr_create() - solaris'. Но неясно, как 'start()' api из класса «Thread» внутренне работает с платформами linux/windows/solaris согласно предоставленному jdk-коду (.. \ openjdk \ hotspot \ src \ os \) – overexchange

+0

В коде 'openjdk \ hotspot \ src \ os \ solaris \ vm \ os_solaris.cpp' это 'if (noofLWPS <(Threads :: number_of_threads() + 2)) { thr_setconcurrency (thr_getconcurrency() + 1); } ' – overexchange

0

Существует некоторая путаница в терминологии, используемой для обозначения ULT и KLT. Ниже приведены две разные интерпретации. Пожалуйста, поправьте меня, если я получил это неправильно:

  1. KLTs необходимы для достижения параллелизма в ядре (Обратите внимание на интерпретацию ядра как процесс или живое лицо). Это касается микроядерных ядер типа Symbian, где поток ядра отвечает за каждый аппаратный ресурс системы (например, файловый сервер, сервер местоположений, сервер календаря и т. Д.). Однако в ядре, таком как Linux, который в основном представляет собой библиотеку (а не процесс или живое существо сам по себе), для потоков ядра нет никакого смысла. В Linux каждый создаваемый поток обрабатывается ядром как процесс, а ядро ​​всегда выполняется либо в контексте процесса, либо в контексте прерывания.

  2. Вторая интерпретация основана на том, является ли Threading (или параллелизм) видимым для ядра или нет. Например, используя setjmp, longjmp, можно добиться параллелизма в пользовательском пространстве. Как уже обсуждалось, ядро ​​совершенно не осознает этого. Этот параллелизм можно назвать ULT. И поток, чье создание, о котором известно ядро ​​(один с использованием системного вызова Clone()), можно назвать KLT.