Есть некоторые терминологические проблемы, связанные с исторической случайностью, а не с чем-либо еще здесь.
«Поток» обычно относится к потоку управления внутри процесса и может (в данном случае означает) «задачу со своим собственным стеком, но разделяет доступ ко всему, что не находится в этом стеке, с другими потоками в один и тот же домен защиты ".
«Процесс» имеет тенденцию относиться к автономному «домену защиты», который может (и имеет в этом случае) возможность иметь несколько потоков внутри него. Учитывая два процесса P1 и P2 , единственный способ для P1 воздействовать на P2 (или наоборот) - через какое-то определенное определение " канал связи ", такой как файл, канал или сокет; через «межпроцессные» сигналы, такие как сигналы Unix / Linux; и т. д.
Поскольку потоки не имеют такого рода барьера между собой, один поток может легко создавать помехи (искажать данные, используемые) другим потоком.
Все это не зависит от пользователя против ядра , с одним исключением: в «ядре» - отметим, что здесь есть неявное предположение, что существует только одно ядро - у вас есть доступ ко всему состояние машины на все времена и полные права на что угодно. Следовательно, вы можете сознательно (или в некоторых случаях случайно) игнорировать или отключать аппаратную защиту и связываться с данными, «принадлежащими» кому-то другому.
Это в основном охватывает несколько возможных замешательств в первом квартале. Что касается Q2, ответ на заданный вопрос - «нет». В общем, поскольку потоки не включают (в такой степени) защиту, дешевле переключаться с одного потока на другой: вам не нужно сообщать аппаратному обеспечению (каким-либо образом), что он больше не должен разрешать различные виды доступа, поскольку потоки T1 и T2 имеют «одинаковый» доступ. Однако, переключаясь между процессами, как и в случае P1 и P2 , вы «пересекаете защитный барьер», что имеет некоторый штраф (фактический штраф сильно зависит от аппаратного обеспечения, и в некоторой степени навыки писателей ОС).
Стоит также отметить, что переход из режима пользователя в режим ядра и наоборот также , пересекающий домен защиты, что опять-таки имеет определенную стоимость.
В Linux существует несколько способов для пользовательских процессов для создания того, какое количество потоков, включая как «POSIX threads» (pthreads), так и вызов clone
(подробности для clone
, который является чрезвычайно гибким, выходит за рамки этого ответа). Если вы хотите написать переносимый код, вам, вероятно, стоит придерживаться pthreads.
В ядре Linux потоки выполняются совершенно по-другому, и вам потребуется документация по ядру Linux.
Я не могу правильно ответить на вопрос 4, так как у меня нет книги и я не уверен, что они имеют в виду здесь. Я предполагаю, что они имеют в виду, что всякий раз, когда какой-либо пользовательский процесс или поток выполняет «системный вызов» (запрашивает некоторую службу у ОС), это пересекает этот барьер защиты пользователя / ядра, и затем ядро проверяет, что код пользователя имеет соответствующие привилегии для этой операции, а затем для выполнения этой операции. Часть ядра, которая делает это, работает с защитой на уровне ядра и, следовательно, должна быть более осторожной.
Некоторое оборудование (в основном устаревшее в наши дни) имеет (или имело) более двух уровней аппаратной защиты.В этих системах «пользовательские процессы» имели наименьшую прямую привилегию, но выше тех, которые вы найдете «исполнительный режим», «системный режим» и (наиболее привилегированный) «режим ядра» или «ядро».Они были предназначены для снижения стоимости преодоления различных защитных барьеров.Код, запущенный в «экзекьютиве», не имел полного доступа ко всему на машине, поэтому он мог, например, просто предположить, что предоставленный пользователем адрес был действительным, и попытаться его использовать.Если этот адрес был на самом деле недействительным, исключение повысится до следующего более высокого уровня.Только с двумя уровнями - «пользователь», непривилегированный;и «ядро», полностью привилегированное - код ядра должен быть написан очень тщательно.Однако в наши дни можно предоставлять «виртуальные машины» по низкой цене, что в значительной степени устареет от необходимости использования нескольких уровней защиты оборудования.Один просто пишет настоящее ядро, а затем позволяет ему запускать другие вещи в том, что они «думают», это «режим ядра».Это то, что делают VMware и другие «гипервизорные» системы.