В чем разница между потоками (и процессами) в режиме ядра и потоками в режиме пользователя? - PullRequest
2 голосов
/ 11 марта 2012

мой вопрос:

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

2) Почему коммутатор для потоков и процессов в режиме ядра стоит больше, чем коммутатор для потоков и процессов в пользовательском режиме?

3) сейчас я изучаю Linux, я хочу знать, как бы я создавал потоки и процессы в режиме ядра и в режиме пользователя соответственно в системе Linux?

4) В книге современная операционная система говорится, что возможно, что процесс будет в пользовательском режиме, но потоки, созданные в процессе пользовательского режима, могут находиться в режиме ядра. Как это возможно?

Ответы [ 2 ]

4 голосов
/ 11 марта 2012

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

«Поток» обычно относится к потоку управления внутри процесса и может (в данном случае означает) «задачу со своим собственным стеком, но разделяет доступ ко всему, что не находится в этом стеке, с другими потоками в один и тот же домен защиты ".

«Процесс» имеет тенденцию относиться к автономному «домену защиты», который может (и имеет в этом случае) возможность иметь несколько потоков внутри него. Учитывая два процесса P1 и P2 , единственный способ для P1 воздействовать на P2 (или наоборот) - через какое-то определенное определение " канал связи ", такой как файл, канал или сокет; через «межпроцессные» сигналы, такие как сигналы Unix / Linux; и т. д.

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

Все это не зависит от пользователя против ядра , с одним исключением: в «ядре» - отметим, что здесь есть неявное предположение, что существует только одно ядро ​​- у вас есть доступ ко всему состояние машины на все времена и полные права на что угодно. Следовательно, вы можете сознательно (или в некоторых случаях случайно) игнорировать или отключать аппаратную защиту и связываться с данными, «принадлежащими» кому-то другому.

Это в основном охватывает несколько возможных замешательств в первом квартале. Что касается Q2, ответ на заданный вопрос - «нет». В общем, поскольку потоки не включают (в такой степени) защиту, дешевле переключаться с одного потока на другой: вам не нужно сообщать аппаратному обеспечению (каким-либо образом), что он больше не должен разрешать различные виды доступа, поскольку потоки T1 и T2 имеют «одинаковый» доступ. Однако, переключаясь между процессами, как и в случае P1 и P2 , вы «пересекаете защитный барьер», что имеет некоторый штраф (фактический штраф сильно зависит от аппаратного обеспечения, и в некоторой степени навыки писателей ОС).

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

В Linux существует несколько способов для пользовательских процессов для создания того, какое количество потоков, включая как «POSIX threads» (pthreads), так и вызов clone (подробности для clone, который является чрезвычайно гибким, выходит за рамки этого ответа). Если вы хотите написать переносимый код, вам, вероятно, стоит придерживаться pthreads.

В ядре Linux потоки выполняются совершенно по-другому, и вам потребуется документация по ядру Linux.

Я не могу правильно ответить на вопрос 4, так как у меня нет книги и я не уверен, что они имеют в виду здесь. Я предполагаю, что они имеют в виду, что всякий раз, когда какой-либо пользовательский процесс или поток выполняет «системный вызов» (запрашивает некоторую службу у ОС), это пересекает этот барьер защиты пользователя / ядра, и затем ядро ​​проверяет, что код пользователя имеет соответствующие привилегии для этой операции, а затем для выполнения этой операции. Часть ядра, которая делает это, работает с защитой на уровне ядра и, следовательно, должна быть более осторожной.

Некоторое оборудование (в основном устаревшее в наши дни) имеет (или имело) более двух уровней аппаратной защиты.В этих системах «пользовательские процессы» имели наименьшую прямую привилегию, но выше тех, которые вы найдете «исполнительный режим», «системный режим» и (наиболее привилегированный) «режим ядра» или «ядро».Они были предназначены для снижения стоимости преодоления различных защитных барьеров.Код, запущенный в «экзекьютиве», не имел полного доступа ко всему на машине, поэтому он мог, например, просто предположить, что предоставленный пользователем адрес был действительным, и попытаться его использовать.Если этот адрес был на самом деле недействительным, исключение повысится до следующего более высокого уровня.Только с двумя уровнями - «пользователь», непривилегированный;и «ядро», полностью привилегированное - код ядра должен быть написан очень тщательно.Однако в наши дни можно предоставлять «виртуальные машины» по низкой цене, что в значительной степени устареет от необходимости использования нескольких уровней защиты оборудования.Один просто пишет настоящее ядро, а затем позволяет ему запускать другие вещи в том, что они «думают», это «режим ядра».Это то, что делают VMware и другие «гипервизорные» системы.

2 голосов
/ 11 марта 2012

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

Это означает, что ваш процесс получает определенное количество ресурсов от ЦП, и вы должны разделить его между всеми потоками пользовательского режима.

Простой случай, у вас есть два процесса, один с одним потоком и один с сотней потоков.

При упрощенной политике планирования ядра поток в однопоточном процессе получает 50% ЦП, а каждый поток в процессе с сотнями получает по 0,5%.

С потоками режима ядра, само ядро ​​управляет вашими потоками и планирует их независимо. Используя один и тот же упрощенный планировщик, каждый поток получит лишь прикосновение менее 1% нагрузки ЦП (101 поток, чтобы разделить 100% ЦП).

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

В Linux вы создаете потоки (и процессы) с помощью вызова clone, аналогично fork, но с гораздо более точным контролем над вещами.

Ваш последний пункт немного тупой. Я не могу быть уверен, но, вероятно, речь идет о режиме пользователя и ядра в том смысле, что один может выполнять пользовательский код, а другой может выполнять какой-то системный вызов в ядре (что требует переключения в режим ядра или супервизора).

Это не то же самое, что различие, когда речь идет о поддержке потоков (поддержка режима пользователя или режима ядра). Не имея при себе копии книги, я не могу сказать однозначно, но это было бы моим лучшим предположением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...