Разве тот факт, что Go и Java используют поток пространства пользователя, не означает, что вы не можете использовать преимущества нескольких ядер? - PullRequest
14 голосов
/ 16 ноября 2009

В последнее время мы много говорили о потоках в классе моей операционной системы, и мне в голову пришел один вопрос.

Поскольку Go (и Java) использует поток пользовательского пространства вместо потоков ядра, это не значит, что вы не можете эффективно использовать преимущества нескольких ядер, поскольку ОС только выделяет процессорное время процессу, а не потокам сами?

Это, кажется, подтверждает тот факт, что вы не можете

Википедия тоже так думает

Ответы [ 3 ]

17 голосов
/ 16 ноября 2009

Что заставляет вас думать, что Go использует потоки из пространства пользователя?

Это не так. Он использует потоки ОС и может использовать преимущества нескольких ядер.

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

Если вы действительно хотите полностью разблокировать многоядерный процессор, просто используйте функцию GOMAXPROCS().

runtime.GOMAXPROCS(4); //somewhere in main

Теперь ваша программа будет использовать 4 ОС-потока (вместо 1) и сможет полностью использовать, например, 4-х ядерная система.

6 голосов
/ 16 ноября 2009

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

0 голосов
/ 09 ноября 2011

Я предполагаю, что под "потоками пользовательского пространства" вы подразумеваете (например) goroutines Go.

Это правда, что использование goroutines для параллелизма менее эффективно, чем разработка (вручную и с помощью научных расчетов) специального алгоритма для назначения рабочих единиц потокам ОС.

Однако: каждая программа Go находится в среде и предназначена для решения конкретной проблемы. Новая процедура может быть запущена для каждого запроса, который окружающая среда делает программе Go. Если среда делает параллельные запросы к программе Go, программа Go, использующая программы, может работать быстрее, чем последовательная программа, даже если программа Go использует только 1 поток ОС. Причина, по которой goroutines могут обрабатывать запросы с большей скоростью (даже при использовании только одного потока ОС), заключается в том, что программа Go автоматически переключится с goroutine A на goroutine B, когда часть среды, связанная с A, на мгновение не сможет ответить.

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

...