На какой операционной системе достаточно многопоточного программирования, чтобы использовать несколько ядер? - PullRequest
2 голосов
/ 03 февраля 2009

Я хотел бы использовать свои навыки многопоточного программирования (у меня есть навыки), но я понимаю, что этого недостаточно. Мои потоки могут по-прежнему конкурировать за одно и то же ядро, если операционная система не знает о потенциале. Какую комбинацию ОС / компилятора / библиотеки я могу использовать в архитектуре Intel Xeon для работы с ядрами?

Ответы [ 8 ]

7 голосов
/ 03 февраля 2009

Все современные ОС распределяют потоки по всем доступным ядрам; но есть несколько языков или библиотек, которые предотвращают это. Наиболее распространенные проблемы:

  • зеленые нити. Раньше у нее было преимущество в производительности, когда несколько процессоров были редкими, а операционные системы были недостаточно оптимизированы. было несколько виртуальных машин Java, которые хвалились этим как функцией, позже обратились к схеме M: N, и я думаю, что теперь это везде N: N.

  • GIL: глобальная блокировка интерпретатора. некоторые языки сценариев имеют много глобальных состояний глубоко в цикле интерпретатора, поэтому для обеспечения согласованности существует одна большая блокировка (мьютекс); но это мешает двум потокам одного и того же «пространства» работать одновременно. По крайней мере, Python и Lua имеют эту проблему. в этих случаях предпочтительнее использовать несколько процессов вместо нескольких потоков.

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

4 голосов
/ 03 февраля 2009

В каждой операционной системе. Это в значительной степени определение потока.

Если вы создаете приложение, запускающее два потока, то ОС может разместить их на двух отдельных ядрах. Это верно для Windows, OSX, Linux и любых других ОС, о которых вы только можете подумать.

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

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

Так что я собираюсь догадаться, что вы действительно спрашиваете, как связать ваши потоки с ядрами, чтобы они не конкурировали друг с другом. Это делается путем установки привязки процессора к потоку. Ниже приведены ссылки на статьи по этому вопросу для Windows и Linux. Я уверен, что есть и другие варианты Unix. Также отмечу, что в этом обычно нет необходимости, поскольку за исключением некоторых особых случаев ОС лучше знает, где планировать потоки, которые вы делаете. Помните, что современные операционные системы являются многопроцессорными, поэтому ваши потоки не просто конкурируют друг с другом, они конкурируют с потоками всех других процессов на коробке. В зависимости от нагрузки ограничение ваших потоков одним ядром может на самом деле сделать их быстрее.

http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/core/fnef_mul_dnpl.mspx?mfr=true

http://www.ibm.com/developerworks/linux/library/l-affinity.html

0 голосов
/ 04 февраля 2009

В другом посте я порекомендовал новую книгу. Если вы ищете глубокий ответ, я рекомендую вам прочитать первые две главы «Потоковое программирование на C # 2008 и 2005» Гастона С. Хиллара - Packt Publishing. Я не знал ответа на ваш вопрос до того, как купил книгу 5 дней назад. Теперь я могу наблюдать, как мой Core 2 Quad Q6700 достигает 98% использования ЦП в C #, используя 4 одновременных потока! Это проще, чем я думал. Если вы обладаете многопоточными знаниями, вам будет еще легче. Я впечатлен результатами, которых вы можете достичь, используя множество ядер одновременно. Я рекомендую книгу тем, кто заинтересован в начале многоядерного или многопоточного программирования с использованием C #. Я не программист C ++. По этой причине мне понадобилась книга для начинающих на C #, чтобы использовать многоядерные потоки.

0 голосов
/ 04 февраля 2009

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

Я прочитал несколько сообщений в Stackoverflow от пользователя, рассказывающего о новой книге из Packt Publishing, и нашел следующую статью на веб-странице Packt Publishing:

http://www.packtpub.com/article/simplifying-parallelism-complexity-c-sharp

Я прочитал книгу о параллельном программировании в Windows, книгу Джо Даффи. Теперь я жду "Потокового программирования C # 2008 и 2005", книга Хиллар - http://www.amazon.com/2008-2005-Threaded-Programming-Beginners/dp/1847197108/ref=pd_rhf_p_t_2

0 голосов
/ 03 февраля 2009

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

0 голосов
/ 03 февраля 2009

Давайте сделаем небольшое различие. Программное обеспечение с многопоточностью не обязательно будет работать на двух ядрах одновременно.

Вам необходимо написать код, поддерживающий одновременную многопоточность (SMT). Большинство ОС поддерживают это без проблем - единственная реальная разница в том, как ваше программное обеспечение справляется с блокировками и ресурсами. Если ваши потоки вообще зависят от одной и той же памяти или ресурсов, то возникнут конфликты и моменты времени, когда один или другой будет остановлен в ожидании ресурса, памяти или другой блокировки.

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

Информацию о том, как это сделать в Windows с помощью Visual Studio C ++, можно найти здесь:

http://msdn.microsoft.com/en-us/library/172d2hhw.aspx

Существует множество учебных пособий по этому вопросу, особенно для Windows (C #, C ++, VB и т. Д.) - их можно найти с помощью поиска:

http://www.google.com/search?q=simultaneous+multithreading+C%2B%2B

-Adam

0 голосов
/ 03 февраля 2009

Почти все современные ОС планируют потоки для нескольких ядер, AFAIK. Конечно, ни у одного варианта Unix, с которым я когда-либо играл, нет ни малейшей проблемы, и я совершенно уверен, что все Windowses справляются с этим хорошо. Компилятор не проблема, так как нативные потоки - это вещи уровня ОС, поэтому компилятор просто передает системный вызов вниз.

Есть несколько языков (таких как Ruby), которые не используют собственные потоки, а вместо этого используют свои собственные «зеленые» потоки, которые реализованы в интерпретаторе и, следовательно, выглядят как единый поток для ОС, но они скорее исключение, чем правило, и, как правило, в документах видно, что происходит.

...