В чем разница между потоками уровня пользователя и потоками уровня ядра?

33

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

Особенно:

Потоки могут существовать как на уровне пользователя, так и на уровне ядра.

В чем разница между уровнем пользователя и уровнем ядра?

Шелдон
источник
1
Это действительно Comp Sci (теория) или просто программирование?
Мердад
6
@Mehrdad, Операционные системы является частью компьютерной науки.
Каве

Ответы:

28

Одной из ролей ядра многозадачной операционной системы является планирование : определение того, какой поток выполнения выполнять когда. Такое ядро ​​имеет некоторое представление о потоке или процессе . Поток - это последовательный фрагмент кода, который выполняется и имеет свой собственный стек, а иногда и другие данные. В контексте операционной системы люди обычно используют процесс для обозначения потока, который имеет собственное пространство памяти, и поток для обозначения потока, который совместно использует свое пространство памяти с другими потоками. Процесс может иметь один или несколько потоков.

Некоторые операционные системы, например старые системы Unix, предоставляют только процессы: каждый поток, которым управляет ядро, имеет свое собственное пространство памяти. Другие операционные системы, например большинство современных систем Unix, позволяют процессам содержать несколько потоков выполнения: они предоставляют понятие потоков на уровне ядра.

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

Система может предлагать потоки как на уровне ядра, так и на уровне пользователя; это известно как гибридная резьба .

Потоки уровня пользователя и ядра имеют свои преимущества и недостатки. Переключение между потоками пользовательского уровня часто происходит быстрее, поскольку не требуется переустанавливать защиту памяти, чтобы переключиться на планировщик в ядре и снова переключиться обратно на процесс. Это в основном имеет значение для систем с множеством параллельных соединений, в которых используется большое количество очень коротких потоков, таких как некоторые языки высокого уровня ( в частности, Erlang ) и их зеленые потоки . Потоки уровня пользователя требуют меньшей поддержки ядра, что может упростить ядро. Потоки уровня ядра позволяют потоку выполняться, в то время как другой поток в том же процессе блокируется системным вызовом.; процессы с потоками уровня пользователя должны позаботиться о том, чтобы не блокировать системные вызовы, поскольку они блокируют все потоки процесса. Потоки уровня ядра могут работать одновременно на многопроцессорных машинах, чего не могут достичь только потоки уровня пользователя.

Жиль "ТАК - перестань быть злым"
источник
В вашей последней строке говорится: «Потоки уровня ядра могут работать одновременно на многопроцессорных машинах, чего не могут достичь только потоки уровня пользователя». Но, согласно данной ссылке, ULT может работать одновременно stackoverflow.com/questions/14791801/… . Я что-то не так делаю?
Гаррик
Можете ли вы проверить мой комментарий выше?
Гаррик
1
@Garrick Несколько потоков уровня пользователя могут работать одновременно на разных ядрах, при условии, что они работают в разных потоках уровня ядра. Если у вас есть только ULT в качестве инструмента, вы ограничены одним процессором. Если KLT доступны, вы можете распределить потоки ядра по нескольким процессорам и распределить ваш ULT среди доступных потоков ядра.
Жиль "ТАК - перестань быть злым"
4

Подумайте о потоках уровня ядра как о « виртуальных процессорах », а потоки уровня пользователя - как о потоках (давайте назовем их таковыми сейчас). Теперь для выполнения потока он назначен процессору, верно? Таким образом, каждый поток назначается виртуальному процессору, чтобы его можно было выполнить.

Вот факты

  • Создание нового виртуального процессора немного дорого. (Ядро должно создать запись в блоке управления потоками , назначить стек и т. Д.)

  • Создать поток довольно просто по сравнению с созданием нового виртуального процессора. Разработчик приложения может создавать потоки, используя библиотеки потоков, предоставляемые языками программирования и управляемые в пространстве пользователя . И разные языки реализуют многопоточность по-разному.

модели

  • Если потоки сопоставляются с одним виртуальным процессором, то следует соблюдать осторожность, чтобы не сделать системный вызов блокировки ни в одном из потоков, поскольку другие потоки больше не могут работать одновременно.

  • Это ограничение можно преодолеть, если создать еще несколько виртуальных процессоров. Теперь потоки могут работать одновременно (параллельно, если присутствует несколько реальных процессоров). Поток не будет влиять на другие потоки, которые отображаются на других виртуальных процессорах.

  • В последней модели один или несколько потоков могут быть сопоставлены с виртуальными процессорами.

  • Вышеуказанные модели называются «Многие к одному», «Один к одному» и «Многие к многим» соответственно.

Referenes: концепции операционной системы от Galvin et al. Тему: Темы -> Многопоточные Модели

Азам
источник