Каковы отношения между процессами, потоками ядра, облегченными процессами и пользовательскими потоками в Unix? [закрыто]


12

Unix Internal от Vahalia содержит цифры, показывающие отношения между процессами, потоками ядра, облегченными процессами и пользовательскими потоками. В этой книге основное внимание уделяется SVR4.2, а также подробно рассматриваются 4.4BSD, Solaris 2.x, Mach и Digital UNIX. Обратите внимание, что я не спрашиваю о Linux.

  1. Для каждого процесса всегда ли один или несколько легких процессов лежат в основе процесса? Рисунок 3.4, кажется, говорит да.

    Почему на рис. 3.5 (а) показаны процессы непосредственно поверх процессоров, а между ними нет легких процессов?

  2. Для каждого легковесного процесса всегда ли точно один поток ядра лежит в основе легковесного процесса? Рисунок 3.4, кажется, говорит да.

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

  3. Являются ли потоки ядра единственными объектами, которые могут быть запланированы?

  4. Легкие процессы запланированы только косвенно через планирование основных потоков ядра?

  5. Запланированы ли процессы только косвенно через планирование базовых облегченных процессов?

Рисунок 3-4.  Легкие процессы

Рисунок 3-5.  Реализации пользовательских потоков


Обновить:

Я задал похожий вопрос для Linux. Легкий ли процесс присоединен к потоку ядра в Linux? Я догадался, что это может быть из-за того, что книга «Концепции операционной системы» вводит понятия, неявно использующие Unix, и Unix и Linux могут различаться, поэтому я читаю о ядре Unix.

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


Почему такой вопрос будет помечен как доска? На самом деле это хороший вопрос о концепции Linux. Документы, как правило, не достаточно подробны, объяснение будет отличным ответом
德里克 薯条 德里克

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

Ответы:


12

См .: Понимание ядра Linux , 3-е издание, Даниэль П. Бове, Марко Чезати

  • Издатель: О'Рейли
  • Дата публикации: ноябрь 2005
  • ISBN: 0-596-00565-2
  • Страницы: 942

В своем вступлении Даниэль П. Бове и Марко Чезати сказали:

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

В следующих параграфах я попытаюсь изложить ваши взгляды, основанные на моем понимании, на факты, представленные в «Понимании ядра Linux», которые в значительной степени похожи на те, что в Unix.

Что значит процесс? :

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

Цель процесса в ядре - действовать как сущность, которой выделяются системные ресурсы (время процессора, память и т. Д.). Когда процесс создан, он почти идентичен своему родителю. Он получает (логическую) копию адресного пространства родителя и выполняет тот же код, что и родитель, начиная со следующей инструкции, следующей за системным вызовом создания процесса. Хотя родитель и потомок могут совместно использовать страницы, содержащие программный код (текст), они имеют отдельные копии данных (стек и куча), так что изменения, вносимые потомком в область памяти, невидимы для родителя (и наоборот) ,

Как работают процессы?

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

Механика многопроцессорной системы включает в себя легкие и тяжелые процессы:

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

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

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

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

введите описание изображения здесь

Потоки против процессов

  1. Программа запускается как текстовый файл программного кода,
  2. Программа компилируется или интерпретируется в двоичном виде,
  3. Программа загружается в память,
  4. Программа становится одним или несколькими запущенными процессами.
  5. Процессы обычно не зависят друг от друга,
  6. В то время как потоки существуют как подмножество процесса.
  7. Потоки могут общаться друг с другом легче, чем процессы,
  8. Но потоки более уязвимы для проблем, вызванных другими потоками в том же процессе

Ссылки:

Понимание ядра Linux, 3-е издание

Больше 1 2 3 4 5

...............................................

Теперь давайте упростим все эти термины ( этот абзац с моей точки зрения ). Ядро - это интерфейс между программным и аппаратным обеспечением. Другими словами, ядро ​​действует как мозг. Он манипулирует отношениями между генетическим материалом (то есть кодами и его производным программным обеспечением) и системами организма (то есть аппаратными средствами или мышцами).

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

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

...............................................

В ответ на ваши вопросы:

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

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

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

  2. Всегда ли легкий процесс реализован на основе потока ядра? Рисунок 3.4, кажется, говорит да. Почему на рис. 3.5 (b) показаны легковесные процессы непосредственно поверх процессов?

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

  3. Являются ли потоки ядра единственными объектами, которые могут быть запланированы?

    Нет, потоки уровня ядра создаются самим ядром. Они отличаются от потоков уровня пользователя тем, что потоки уровня ядра не имеют ограниченного адресного пространства. Они живут исключительно в пространстве ядра, никогда не переключаясь на царство пользователей. Однако они являются полностью планируемыми и выгружаемыми объектами, как и обычные процессы (примечание: для важных действий ядра можно отключить почти все прерывания). Целью собственных потоков ядра является главным образом выполнение обязанностей по обслуживанию системы. Только ядро ​​может запустить или остановить поток ядра. С другой стороны, процесс пользовательского уровня может планировать сам, основываясь на собственной библиотеке, и в то же время он может планироваться ядром на основе двухуровневых моделей и моделей «многие ко многим» (упомянутых выше),

  4. Легкие процессы запланированы только косвенно через планирование основных потоков ядра?

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

  5. Запланированы ли процессы только косвенно через планирование базовых облегченных процессов?

    Это зависит от того, является ли это тяжелым или легким процессом. Тяжелые процессы, запланированные самим ядром. Легким процессом можно управлять на уровне ядра и на уровне пользователя.


Благодарю. (1) unix.stackexchange.com/questions/472354/… (2) Я специально спрашивал о Unix вместо LInux, хотя я ценю ваш ответ, особенно очень полезный для Linux, и надеюсь, что вы можете оставить его как есть.
Тим

1
«Цель собственных потоков ядра состоит в основном в выполнении обязанностей по обслуживанию системы», - можете ли вы разработать или предоставить ссылку, Goro
iruvar

@iruva Я считаю, что «обязанности по обслуживанию» - это не точный термин, например, управление питанием контролируется потоками ядра и не имеет ничего общего с обязанностями по обслуживанию. На самом деле, ссылки, предоставленные вместе с этим постом, содержат обширную информацию о потоках ядра. Если вы хотите, чтобы я уточнил, пожалуйста, напишите новый вопрос о потоках ядра и их функциях / типах / как они создаются ... и т.д., и я с удовольствием объясню. Этот ответ достаточно длинный и не может принять дополнительную информацию!

@Tim: О какой версии Unix вы спрашивали? В частности, древние системы, которые вы упомянули, как обсуждалось в книге? Включены ли современные BSD? Солярис 11 включен? MacOS X Leopard (сертифицированный UNIX) включен?
user1686

@ Grawity Я спросил о книге, так что, что бы книга ни использовала. Если вы знаете другие версии, это тоже полезно знать.
Тим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.