Разве не факт, что Go и Java используют поток пользовательского пространства, означает, что вы не можете действительно использовать несколько ядер?

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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