многопоточность работает на разных процессах или же процесс? - PullRequest
2 голосов
/ 21 марта 2012

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

Я хочу задать еще два похожих вопроса

Когда я часто открываю диспетчер задач, я вижу около 800 потоков и 54 процессов и использование моего процессоратолько 5%, и мне сказали, что каждое ядро ​​выполняет только один поток за раз.мой процессор постоянно запускает эти 800 потоков, или только 800 потоков стоят в очереди, ожидая обработки процессором?если я хочу, чтобы моя многопоточная программа полностью использовала мой четырехъядерный процессор, могу ли я увеличить использование процессора, создавая больше потоков (кажется, что это противоречит принципу, согласно которому только один поток может быть одним ядром за раз)

Ответы [ 4 ]

1 голос
/ 21 марта 2012

Многопоточность означает несколько потоков в одном процессе.
Каждый поток может быть назначен на другое ядро.

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

Вы могли бы немного прочитать об этом, просто поищите в Google или Википедия - Многопоточность программного обеспечения

1 голос
/ 21 марта 2012

Один процесс может использовать несколько потоков;даже базовая консоль .NET «hello world» exe, вероятно, использует 4 или 5. Так что да, один процесс может потенциально использовать все ваши доступные ядра , если вы напишите это для этого .

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

Вы делаете , однако, обычно приходится писать другой код для поддержки нескольких потоков.Исключением является ситуация, когда инфраструктура делает это для вас . Например, ASP.NET или WCF могут принимать входящие запросы и передавать их разным рабочим потокам, что позволяет выполнять несколько параллельных операций, даже если вы явно не указаликод это так.Это означает, что в ASP.NET или WCF вам нужно быть осторожным с общим состоянием, именно по тем причинам, которые уже обсуждались.

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

0 голосов
/ 21 марта 2012

в моей многопоточной программе .net мне интересно все эти темы работает на одном и том же процессе или на разных процессах?

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

Threading

Если у вас одно ядро, это не значит, что оно не может запустить несколько потоков, это просто означает, что ядро ​​не может выполнить несколько потоков в в то же время. Если вы посмотрите на картинку выше, вы заметите, что:

  1. Поток # 1 выполняется в течение некоторого времени.
  2. Тема # 1 "останавливается".
  3. Поток # 2 выполняется в течение некоторого времени.
  4. Тема № 2 "останавливается".
  5. Поток # 1 снова выполняется в течение некоторого времени.

Это иллюстрирует, что происходит, когда ядро ​​запускает несколько потоков: ядро ​​выполняет только один поток за раз , но для запуска обоих потоков ядро ​​должно выполнить переключение контекста . Другими словами: ядро ​​запускает несколько команд из потока 1, переключается в поток 2 и запускает из него несколько команд, а затем переключается обратно в поток 1 для выполнения еще нескольких команд.

Жонглирование апельсинами:

Хорошая метафора - жонглирование апельсинами: технически у вас есть только две руки, и вы можете держать только один апельсин в каждой руке за раз, поэтому максимум, который вы можете держать, - это два апельсина. В этом случае налоговая часть содержит апельсины. Однако, если вы бросите апельсин в воздух, то вы можете удерживать третий апельсин, пока второй находится в воздухе. Чем выше вы бросаете апельсины, тем больше апельсинов вы можете жонглировать. Если быть более точным: чем дольше апельсин возвращается в вашу руку, тем больше апельсинов можно жонглировать. Конечно, вы не можете манипулировать огромным количеством апельсинов, потому что бросание апельсина требует больше энергии, чем просто его удержание.

По сути, ваш ЦП выполняет жонглирование потоков: чем дольше поток остается в стороне от выполнения кода на ЦП, тем больше потоков ЦП может «жонглировать». Если поток ожидает ввода-вывода (например, запрос к базе данных), тогда CPU может одновременно выполнить код другого потока. По этой же причине вы видите 54 процесса и 800 потоков в диспетчере задач: многие из этих потоков делают вещи, которые не связаны с процессором.

Sleep:

мой процессор все время работает с этими 800 потоками, или только 800 потоки стоят в очереди, ожидая обработки процессором?

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

Загрузка ЦП:

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

Становится сложно :). Представьте себе, что вместо апельсинов у вас есть шары для боулинга: это ОЧЕНЬ обременительно для ваших рук, поэтому даже если вы попробуете, вы, вероятно, не сможете держать более 2 шаров для боулинга, не говоря уже о том, чтобы жонглировать третьим. При максимальной нагрузке вы можете удерживать столько предметов, сколько у вас есть руки. То же самое относится и к процессору: при максимальной нагрузке процессор может выполнять столько потоков, сколько имеется ядер.

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

0 голосов
/ 21 марта 2012

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

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