В какой операционной системе достаточно многопоточного программирования для использования нескольких ядер?

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


person dacracot    schedule 03.02.2009    source источник
comment
Любые, но Солярис особенно любит потоки.   -  person Brian Knoblauch    schedule 03.02.2009


Ответы (8)


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

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

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

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

person Javier    schedule 03.02.2009

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

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

person jalf    schedule 03.02.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

person Erik Engbrecht    schedule 07.02.2009

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

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

person womble    schedule 03.02.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

-Адам

person Adam Davis    schedule 03.02.2009

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

person rmeador    schedule 03.02.2009
comment
который включает MSDOS, Windows 3.1 и MacOS 9 в качестве ОС, которых следует избегать, если у вас есть несколько заплесневелых дискет на чердаке. - person Pete Kirkham; 03.02.2009

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

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

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

Я прочитал книгу Джо Даффи «Параллельное программирование в Windows». Теперь я жду "C# 2008 and 2005 Threaded Programming", книгу Хиллара - https://rads.stackoverflow.com/amzn/click/com/1847197108

person Community    schedule 04.02.2009

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

person Community    schedule 04.02.2009