Разница между потоками пользовательского уровня и поддерживаемыми ядром?


Я просматривал несколько заметок, основанных на этой теме, и хотя у меня есть понимание потоков в целом, я не совсем уверен в различия между потоками уровня пользователя и ядра.

Я знаю, что процессы в основном состоят из нескольких ниток или одной нити, но эти нити из двух упомянутых выше типов?

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

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

4 51

4 ответа:

Edit: вопрос был немного запутанным, поэтому я отвечаю на него двумя разными способами.

потоки уровня ОС против зеленых потоков

для ясности я обычно говорю "потоки уровня ОС" или "собственные потоки" вместо "потоков уровня ядра" (которые я перепутал с "потоками ядра" в моем первоначальном ответе ниже.) Потоки уровня ОС создаются и управляются ОС. Большинство языков имеют для них поддержку. (C, недавняя Java и т. д.) Они чрезвычайно сложны в использовании, потому что вы на 100% ответственны за предотвращение проблемы. В некоторых языках даже собственные структуры данных (такие как хэши или словари) будут ломаться без дополнительного кода блокировки.

противоположность OS-thread является зеленые нити это управляется вашим языком. Эти нити получили различные названия в зависимости от языка (сопрограммы в языке C, горутин в Go, волокна в Ruby, и т. п.). Эти потоки существуют только внутри вашего языка, а не в вашей ОС. Потому что язык выбирает контекстные переключатели (т. е. в конце инструкции), это предотвращает тонны тонких условий гонки (таких как просмотр частично скопированной структуры или необходимость блокировки большинства структур данных). Программист видит "блокировку" вызовов (т. е. data = file.read() ), но язык переводит его в асинхронные вызовы ОС. Язык тогда позволяет другое зеленые потоки для запуска во время ожидания результата.

зеленые потоки намного проще для программиста, но их производительность варьируется: если у вас много потоков, зеленые потоки могут быть лучше как для процессора, так и для оперативной памяти. С другой стороны, большинство языков green thread не могут использовать преимущества нескольких ядер. (Вы даже не можете купить одноядерный компьютер или телефон больше!). И плохая библиотека может остановить весь язык, выполнив блокировку вызова ОС.

лучшее из обоих миров-иметь один поток ОС на процессор и много зеленых потоков, которые волшебным образом перемещаются на потоки ОС. Такие языки, как Go и Erlang могут сделать это.

системные вызовы и другие виды использования недоступны для потоков пользовательского уровня

Это только половина правды. Да, вы можете легко вызвать проблемы, если вы сами вызываете ОС (т. е. делаете что-то, что блокирует.) Но язык обычно имеет замены, так что вы даже не заметите. Эти замены действительно вызывают ядро, просто немного иначе, чем вы думаете.

потоки ядра против потоков пользователя

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

пользовательские потоки и потоки ядра точно такие же. (Вы можете увидеть, посмотрев в /proc / и увидеть, что потоки ядра тоже есть.)

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

поток ядра-это поток, который выполняет только код ядра и не связан с процессом пользовательского пространства. Они похожи на" демоны UNIX", за исключением того, что они являются демонами только ядра. Так что можно сказать, что ядро-это многопоточная программа. Например, существует поток ядра для подкачки. Это заставляет все проблемы подкачки "сериализоваться" в один поток.

Если пользовательскому потоку что-то нужно, он вызовет ядро, которое помечает этот поток как спящий. Позже поток подкачки находит данные, поэтому он помечает пользовательский поток как выполняемый. Еще позже "пользовательский поток" возвращается из ядра обратно в userland, как будто ничего не произошло.

в самом деле все потоки начинаются в пространстве ядра, потому что операция clone() происходит в пространстве ядра. (И есть много учета ядра, чтобы сделать, прежде чем вы можете "вернуться" к новому процессу в пользовательском пространстве.)

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

два отдельных процесса не могут совместно использовать пространство памяти.

допустим, вы открываете текстовый редактор. Это независимый процесс, выполняющийся в памяти с отдельной адресацией месте. Вам понадобится много ресурсов в этот процесс, такие как вставка графики, проверку правописания и т. д. Невозможно создать отдельные процессы для каждой из этих функций и поддерживать их независимо в памяти. Чтобы избежать этого,

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

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

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

потоки широко классифицируются как потоки на уровне пользователя и потоки уровня ядра на основе их доменных исполнения. Бывают также случаи, когда один или несколько пользовательских потоков сопоставляются с одним или несколькими потоками ядра.

- Потоки Пользовательского Уровня

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

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

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

- ядра Уровень Потоков

эти потоки в основном не зависят от текущих процессов и выполняются операционной системой.

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

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

большинство потоков уровня ядра не могут быть вытеснены потоками уровня пользователя.

MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.

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

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

некоторые из видных сопоставления:

один на один

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

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

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

многие к одному

когда много пользовательских потоков сопоставляются с одним ядром нитка.

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

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

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

много Много

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

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

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

другая часть вашего вопроса:

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

Итак, потоки пользовательского уровня - это просто потоки, созданные программистом когда затем использовать поддерживаемые ядром потоки для выполнения операций, которые не может нормально выполняться из-за его государство?

частично правильно. Почти все потоки ядра имеют доступ к системным вызовам и другим критическим прерываниям, поскольку потоки ядра отвечают за выполнение процессов ОС. Пользовательский поток не будет иметь доступа к некоторым из этих важных функций. например, текстовый редактор никогда не может снимать поток, который имеет возможность изменить физический адрес процесса. Но при необходимости пользовательский поток может сопоставляться с потоком ядра и выдавать некоторые системные вызовы, которые он не мог сделать как независимый субъект. Затем поток ядра сопоставит этот системный вызов ядру и выполнит действия, если сочтет нужным.

некоторые среды разработки или языки добавят туда собственные потоки, такие как функция, которая написана, чтобы воспользоваться некоторыми знаниями об окружающей среде, например, среда GUI может реализовать некоторые функции потока, которые переключаются между пользовательскими потоками в каждом цикле событий. Библиотека игр может иметь некоторый поток, подобный поведению персонажей. Иногда поведение пользовательского потока может быть реализовано по-другому, например, я много работаю с какао, и у него есть таймер механизм, который выполняет ваш код каждые x секунд, использует долю секунды, и это как поток. Ruby имеет функцию выхода, которая похожа на кооперативные потоки. Преимущество пользовательских потоков заключается в том, что они могут переключаться в более предсказуемое время. С потоком ядра каждый раз, когда поток запускается снова, ему нужно загрузить любые данные, над которыми он работал, это может занять некоторое время, с пользовательскими потоками вы можете переключиться, когда закончите работу над некоторыми данными, поэтому его не нужно перезагружать. Я не пришел. через пользовательские потоки, которые выглядят так же, как потоки ядра, только такие механизмы, как таймер, хотя я читал о них в старых текстовых книгах, поэтому мне интересно, были ли они чем-то более популярным в прошлом, но с ростом истинных многопоточных ОС (современные Windows и Mac OS X) и более мощного оборудования мне интересно, вышли ли они из моды.

пользовательских потоков: 1. Библиотека обеспечивает поддержку для создания потоков, планирования и управления без поддержки со стороны ядра. 2. Ядро, не знающее о создании и планировании потоков на уровне пользователя, выполняется в пользовательском пространстве без вмешательства ядра. 3. Поток пользовательского уровня, как правило, быстро создавать и управлять они имеют недостатки, однако. 4. Если ядро является однопоточным, тогда любой поток пользовательского уровня, выполняющий системный вызов блокировки, вызовет весь процесс блокировать, даже если другие темы доступны для запуска в приложение. 5. Пользователь-нить библиотеки pthreads не входит в POSIX, Маха с-потоков, и Solaris 2 UI-threads.

потоки ядра : 1. Ядро выполняет создание потоков, планирование и управление ими в пространстве ядра. 2. потоки ядра обычно создаются и управляются медленнее, чем пользовательские потоки. 3. ядро управляет потоками, если поток выполняет системный вызов блокировки. 4. Многопроцессорная среда, ядро может планировать потоки на разные процессоры. 5.в том числе Windows NT, Windows 2000, Solaris 2, BeOS и Tru64 UNIX (formerlyDigital UN1X)-поддержка потоков ядра.