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

Я нашел ответ на вопрос здесь. Но я не понимаю некоторые идеи в ответе. Например, легкий процесс, как говорят, разделяет свое логическое адресное пространство с другими процессами. Что это значит? Я могу понять ту же ситуацию с двумя потоками: они оба используют одно адресное пространство, поэтому они оба могут читать любые переменные из сегмента bss (например). Но у нас есть много разных процессов с разными разделами bss, и я не знаю, как поделиться ими всеми.

7 ответов

Решение

Из MSDN, потоки и процессы:

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

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

Существует разница между процессом - LWP (облегченный процесс) и пользовательским потоком. Я оставлю определение процесса в стороне, так как оно более или менее известно, и сосредоточусь на LWP vs user threads, LWP - это то, что по сути называют сегодняшними потоками. Изначально под пользовательским потоком подразумевался поток, которым управляет само приложение, и ядро ​​ничего о нем не знает. LWP, с другой стороны, является единицей планирования и выполнения ядром.

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

Вариант 1 У вас есть 2 пользовательских потока, использующих один LWP. Это означает, что с точки зрения ОС у вас есть ОДИН блок планирования. Всего работает 4 LWP (3 других + 1 ваш). Ваш LWP получает 1/4 от общего процессорного времени, и так как у вас есть 2 пользовательских потока, каждый из них получает 1/8 от общего процессорного времени (зависит от вашей реализации)

Вариант2. У вас есть 2 LWP. С точки зрения операционной системы, у вас есть два блока планирования. Всего работает 5 LWP. Ваш LWP получает 1/5 от общего процессорного времени КАЖДОГО, а ваше приложение - 2/5 процессорного времени.

Еще одно грубое отличие - у LWP есть pid (идентификатор процесса), а у пользовательских потоков - нет.

По какой-то причине именование стало немного запутанным, и мы называем LWP потоками.

Различий, безусловно, больше, но, пожалуйста, обратитесь к слайдам. http://www.cosc.brocku.ca/Offerings/4P13/slides/threads.ppt

РЕДАКТИРОВАТЬ:

После публикации я нашел хорошую статью, которая объясняет все более подробно и лучше на английском, чем я пишу. http://www.thegeekstuff.com/2013/11/linux-process-and-threads/

Основываясь на книге Таненбаума "Распределяет системы", легковесные процессы обычно относятся к гибридной форме нити уровня пользователя и нити уровня ядра. LWP выполняется в контексте одного процесса, и на процесс может быть несколько LWP. Кроме того, каждый LWP может запускать свой собственный (на уровне пользователя) поток. Многопоточные приложения создаются путем создания потоков (с пакетом библиотеки потоков) и последующего назначения каждого потока LWP.

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

Потоки работают внутри процессов.

Каждый процесс может содержать один или несколько потоков.

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

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

Наконец, есть решение, которое лежит где-то посередине; мы объединяем потоки в LWP. Каждая группа работает на разных процессорах, но потоки в группе не могут обрабатываться несколькими способами. Это потому, что ядро ​​в этой версии знает только о группах (которые являются многопроцессорными), но ничего о потоках, которые они содержат. Надеюсь, это достаточно ясно.

IMO, LWP - это привязка потоков ядра, которая может быть создана и выполнена в пользовательском контексте.

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

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

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

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

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

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

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

Другие вопросы по тегам