Потоки и процессы против MultiThreading и Multi-Core / MultiProcessor: как они отображаются? - PullRequest
43 голосов
/ 11 ноября 2009

Я был очень смущен, но следующая тема очистила мои сомнения:

Многопроцессорная обработка, многопоточность, гиперпоточность, многоядерность

Но он обращается к запросам с аппаратной точки зрения. Я хочу знать, как эти аппаратные функции связаны с программным обеспечением?

Одна вещь, которая очевидна, состоит в том, что нет никакой разницы между MultiProcessor (= Mutlicpu) и MultiCore, за исключением того, что в многоядерном процессоре все процессоры находятся на одном чипе (кристалле), где, как в мультипроцессоре, все процессоры находятся на своих собственных чипах и соединены вместе .

Итак, многоядерные / многопроцессорные системы способны выполнять несколько процессов (firefox, mediaplayer, googletalk) в одно и то же время (в отличие от переключения этих процессов в однопроцессорной системе по контексту). Правильно?

Если это правильно. Я до сих пор ясно. Но путаница возникает, когда многопоточность входит в картину.

  1. Многопоточность "предназначена для" параллельной обработки. право

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

  3. Когда люди говорят о переключении контекста потоков. Я действительно не понимаю. потому что если его контекстное переключение потоков, то это не параллельная обработка. потоки должны выполняться "строго одновременно". право?

    Мое понятие многопоточности таково: Рассматривая систему с одним процессором. когда процесс является контекстом, переключенным на Firefox. (предположим) каждая вкладка Firefox является потоком, и все потоки выполняются строго одновременно. Не то, чтобы один поток выполнялся какое-то время, тогда другой поток снова работал, пока не наступило время переключения контекста.

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

  5. Если все хорошо, то теперь вопрос, КАК МНОГО НИТЕЙ? Это должно быть ограничено аппаратным обеспечением, я полагаю? Если оборудование может поддерживать только 2 потока, и я запускаю 10 потоков в моем процессе. Как процессор справится с этим? За и против? С точки зрения разработки программного обеспечения, при разработке программного обеспечения, которое будет использоваться пользователями в самых разных системах, тогда как мне решить, стоит ли мне использовать многопоточность? если да, сколько потоков?

Ответы [ 7 ]

43 голосов
/ 11 ноября 2009

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

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

  2. Хорошо, многопоточность может означать аппаратная многопоточность (один из примеров - HyperThreading). Но я предполагаю, что вы просто говорите о многопоточности в программном обеспечении. В этом смысле ЦП должен поддерживать переключение контекста.

  3. Переключение контекста необходимо для реализации многозадачности даже в физически одном ядре с временным разделением.

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

  5. Количество потоков, которые могут физически работать одновременно, просто идентично # из логических процессоров . Вы задаете общую проблему планирования потоков в литературе по ОС, такую ​​как циклический перебор.

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

12 голосов
/ 11 ноября 2009

Потоки, работающие на одном и том же ядре, технически не параллельны. Похоже, что они выполняются только параллельно, поскольку процессор переключается между ними очень быстро (для нас, людей). Этот переключатель называется переключением контекста. Теперь потоки, выполняющиеся на разных ядрах, выполняются параллельно. Большинство современных процессоров имеют несколько ядер, однако большинство современных ОС (windows, linux и друзья) обычно выполняют гораздо большее количество потоков, что все еще вызывает переключение контекста. Даже если пользовательская программа не выполняется, сама ОС выполняет переключение контекста для обслуживания.
Это должно ответить 1-3.

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

5: количество потоков довольно велико и ограничено ОС. Обычно это выше, чем обычный программист может успешно справиться :) Количество потоков определяется вашей программой:

это связано с IO?

  • можно ли разделить задачу на несколько небольших задач?
  • насколько мала задача? задача может быть слишком маленькой, чтобы ее вообще стоило создавать потоки.
  • синхронизация: если требуется расширенная синхронизация, штраф может быть слишком большим, и вам следует уменьшить количество потоков.
3 голосов
/ 11 ноября 2009

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

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

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

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

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

Однако, если они в основном связаны с вводом / выводом, создайте столько потоков, сколько требует ваша архитектура. Трудно дать совет, не зная вашей конкретной задачи.

1 голос
/ 07 февраля 2014

Многопоточность - это выполнение нескольких потоков одновременно. Это может происходить как на одноядерных процессорах, так и на многоядерных процессорных системах. Для однопроцессорных систем это влияет на переключение контекста. Посмотрите! Переключение контекста в этой вычислительной среде относится к срезанию времени операционной системой. Поэтому не запутайтесь. Операционная система - это та, которая контролирует выполнение других программ. Позволяет одновременно выполнять одну программу в CPU. Но частота, с которой потоки включаются и выходят из процессора, определяет прозрачность параллелизма, демонстрируемого системой.

В многоядерной среде многопоточность возникает, когда каждое ядро ​​выполняет поток. Тем не менее, в многоядерной среде переключение контекста может происходить в отдельных ядрах.

1 голос
/ 11 ноября 2009

Главное, что нужно помнить, - это разделение между логическим / виртуальным параллелизмом и реальным / аппаратным параллелизмом. В вашей средней ОС выполняется системный вызов для создания нового потока. Что на самом деле происходит (независимо от того, сопоставлено ли оно с другим ядром, другим аппаратным потоком на том же ядре или помещено в пул программных потоков), зависит от ОС.

  1. В параллельной обработке используются все методы, а не только многопоточность.
  2. Вообще говоря, если вы хотите иметь реальную параллельную обработку, вам нужно выполнить ее аппаратно. Возьмите пример Niagara , он имеет до 8 ядер, каждое из которых способно выполнять 4 потока в аппаратном обеспечении.
  3. Переключение контекста необходимо, когда имеется больше потоков, чем может быть выполнено параллельно на аппаратном уровне. Даже тогда, когда они выполняются последовательно (переключение между потоками), они считаются параллельными, потому что нет никакой гарантии на порядок переключения. Таким образом, это может идти T0, T1, T2, T1, T3, T0, T2 и так далее. По сути, потоки параллельны.
  4. Время нарезки.
  5. Это было бы до ОС.
1 голос
/ 11 ноября 2009
  1. В общем, да, но "параллель" может означать разные вещи.

  2. Это зависит от того, какие задачи вы хотите запустить параллельно.

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

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

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

0 голосов
/ 21 октября 2015

Я думаю, что ответы до сих пор в значительной степени важны и дают вам хороший базовый контекст. По сути, скажем, у вас есть четырехъядерный процессор, но каждое ядро ​​способно выполнять 2 потока одновременно.

Обратите внимание, что увеличение скорости происходит незначительно (или вообще не наблюдается), если вы запускаете 2 потока одновременно на 1 ядре по сравнению с 1 потоком, а затем 2 потоком вертикально. Однако каждое физическое ядро ​​увеличивает скорость вашего общего рабочего процесса.

Теперь, скажем, у вас есть процесс, работающий в вашей ОС, который имеет несколько потоков (т.е. должен запускать несколько вещей "параллельно") и имеет некоторый стек задач в очереди (или некоторую другую систему с правилами приоритета) , Затем программное обеспечение отправляет задачи в очередь, и ваш процессор пытается выполнить их как можно быстрее. Теперь у вас есть 2 случая:

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

Я предлагаю прочитать страницу Википедии в теме. Самая первая картинка там уже дает вам хорошее представление. :)

...