Потоки уровня пользователя и потоки уровня ядра, можете ли вы найти разницу?

Linux

Эта статья является дополнением к предыдущему блогу, целью которого является завершение «потоков на уровне пользователя и потоков на уровне ядра», которые не были четко объяснены. Я надеюсь, что читатели смогут лучше понять темы.

Xiaobai недавно изучает многопоточное программирование.

В Интернете есть много информации о многопоточности. Сяобай быстро поняла основные концепции потоков, но она не могла понять концепции «потоков уровня пользователя и потоков уровня ядра», поэтому ей пришлось закрепить фундамент операционной системы Сяо Мин попросил совета.

На вопрос Сяобая Сяомин всегда терпеливо ответит: «Эти два понятия в потоках действительно трудно понять. Позвольте мне сначала рассказать вам о потоках на уровне пользователя».

Поток уровня пользователя

«Поскольку вы сказали, что ознакомились с основными концепциями потоков, я просто пропущу эту часть.

Давным-давно появилось понятие потоков, но производители операционных систем не могут напрямую модифицировать ядро ​​операционной системы, потому что для нихстабильностьявляется самым важным. Что делать, если я опрометчиво добавляю в ядро ​​непроверенные вещи? Поэтому, если вы хотите проверить доступность потоков, вам нужно найти другой способ. "

«Я знаю, что знаю, эти исследователи написали библиотеку функций для потоков,Реализация потоков с библиотеками функций! «Белый гордо сказал:« Я только что видел онлайн. "

«Да, положилисоздать тему,убить нитьПодождите, пока функция будет помещена в этобиблиотека потоковВнутри пользователь может получить желаемую функцию, вызвав эти функции. «Сяо Мин нашел лист бумаги и написал несколько функций:pthread_creat,pthread_exit,pthread_join,pthread_yield, а затем сказал: «Это несколько важных функций. Вы должны быть в состоянии угадать функции этих функций, верно?»

"Эмммм, дай подумать,pthread_creatэто создать новый поток,pthread_exitэто конечная нить,pthread_joinНу, я думаю, он готов запустить один нить, а затем добавить его вГотовая очередь. Я не знаю о последней функции. "

«Не имеет значения, если вы не знаете, вы поймете через некоторое время, — продолжил Сяо Мин, — вы должны знать, что библиотека потоков, о которой мы только что упоминали, находится в пользовательском пространстве.Ядро ОС ничего не знает об этой библиотеке, так что с точки зрения ядра он по-прежнему управляется обычным образом. "

Сяо Бай спросил: «То естьОперационная система по-прежнему видит только процессыПривет? Тогда многопоточный процесс, который я писал с библиотекой потока, может использоваться только одновременноядро процессоразапускать на? "

Сяо Мин кивнул и сказал: «Вы правы, на самом деле это недостаток потоков пользовательского уровня, эти потоки могут занимать только одно ядро, поэтому это невозможно.Параллельное ускорение, и поскольку пользовательский потокпрозрачность,Операционная система не может активно переключать потоки, другими словами, если A и B являются двумя потоками одного и того же процесса, когда A выполняется, если поток B хочет работать, он может только ждать Aсдаваться добровольноЦП, то есть активно вызывающийpthread_yieldфункция. "

tobe Примечание. Для операционной системы потоки уровня пользователяневидимостьТакже известен какпрозрачность.

«Стоп, дай мне подумать об этом, — быстро подумал Сяобай о словах Сяо Мина, — разве это не означает, что даже если есть библиотека потоков, потоки пользовательского уровня не могут делать такие вещи, как процессы.По-круговой? "

«Очень правильно! Кажется, у вас есть очень четкое представление о процессе. Однако, хотя циклическое планирование невозможно, потоки на уровне пользователя также имеют свои преимущества — вы можетеПользовательский алгоритм планирования для вашего приложения, в конце концов, когда выйти из потока, зависит от вас. Просто сказал, потому что операционная система может видеть только существование процесса, то еслиТема заблокированаТеперь, как вы думаете, что произойдет? "

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

"Да, если он заблокирован потоками, это повлияет на эффективность процесса, так что в этом процессе есть альтернатива -jacket. Так называемая оболочка предназначена для преобразования блокирующего системного вызова в неблокирующий системный вызов. "

Сяобай удивленно спросил: «Как это можно сделать? Может ли вызов, который должен быть заблокирован, стать разблокированным?»

Сяо Мин ответил: «Позвольте мне привести пример: вместо прямого вызова системной процедуры ввода-вывода он вызывает процедуру оболочки ввода-вывода на уровне приложения. Код в этой процедуре оболочки проверяет и определяет процедуру ввода-вывода. занято ли устройство, и если да,Условие пользователязатем заблокируйте поток, а затем передайте управление другому потоку. Через некоторое время снова проверьте устройства ввода-вывода. Как вы сказали, блокирующий вызов все равно будет выполнен в конце, но использование куртки может сократить время блокировки. Однако в некоторых случаях можно не блокировать, в зависимости от конкретной реализации. "

Сяо Мин сделал небольшую паузу и сказал: «Существует очень много концепций потоков пользовательского уровня. Давайте поговорим о потоках уровня ядра».

потоки уровня ядра

«С предвосхищением потоков пользовательского уровня говорить о потоках уровня ядра стало намного проще. Теперь мы знаем, что многие операционные системы уже поддерживают потоки уровня ядра. Чтобы реализовать потоки, ядро ​​должно иметь потоки, которые записывают все потоки в системной таблице. Когда необходимо создать новый поток,системный вызов, затем поОперационная системаОбновите таблицу потоков. Конечно, есть еще традиционные таблицы процессов. Если подумать, какая польза, если операционная система "видит" поток? "

Сяобай уверенно ответил: «Если ядру операционной системы известно о существовании потоков, оно может запланировать эти потоки на несколько ядер ЦП точно так же, как планирование нескольких процессов, а затем фактическоепараллельно. "

"Ещё одно вы не сказали, если нить видна, тоЕсли поток A заблокирован, потоки, принадлежащие тому же процессу, что и он, не будут заблокированы.. Это абсолютное преимущество потоков уровня ядра. "

«Есть ли недостатки у потоков на уровне ядра?»

"Конечно, есть и недостатки. Если подумать, разрешение операционной системе выполнять планирование потоков означает, что каждый раз, когда вы переключаете потоки, вам нужно "впадать в” режиме ядра, в то время как операционная система запускается изПользовательский режим в режим ядраТрансформация дорогая, так сказатьПереключение потоков на уровне ядра обходится дороже, чем потоки на уровне пользователя..还有很重要的一点——线程表是存放在操作系统固定的табличное пространствоилипространство стекаПоэтому количество потоков на уровне ядра ограничено, а масштабируемость не так хороша, как у потоков на уровне пользователя. "

«Потоки на уровне ядра — это такая мелочь. В конце я оставлю вам картинку. Если вы можете ее понять, значит, вы понимаете сегодняшнюю концепцию».

两个线程模型

Сяобай с гордостью сказал: «Конечно, я понимаю, спасибо, Сяомин!»

Надеюсь, вы что-то поняли после прочтения моей статьи.

Спасибо за прочтение, мы договоримся о встрече позже!

Отказ от ответственности: Оригинальная статья, несанкционированное воспроизведение запрещено