Однопроцессорное программирование на одноядерном процессоре
Может кто-нибудь объяснить, действительно ли есть какое-то преимущество для написания многопоточной части кода, которая работает на одном процессоре с одним ядром? Например, способ, который обрабатывает страницы документа таким образом, чтобы страницы были взаимно исключающими /r/t вышеупомянутой частью кода.
На первый взгляд, похоже, что не было бы преимуществ, потому что истинная многопоточность невозможна. I.e., OS в любом случае придется переключать потоки. Мне интересно, может ли просто кодировать что-то однопоточным образом, может быть более эффективным.
Очевидно, что есть много случаев, когда писать многопоточный код имеет смысл, но опять же, мой вопрос выясняет, действительно ли это полезно, когда приложение работает на одноядерном процессоре.
EDIT: заметьте, что я не сказал "приложение", а скорее "кусок кода" - посмотри на мой пример выше. Ясно, что есть преимущества использования многопоточного приложения.
Ответы
Ответ 1
Есть еще преимущества, которые можно получить, но они немного ситуативны.
-
Во многих случаях предоставление нескольких потоков позволит ему требовать больше системных ресурсов от других процессов. Это сложно сбалансировать, и каждый поток, который вы вводите, добавляет немного накладных расходов, но это может быть причиной.
-
Если вы имеете дело с несколькими потенциально блокирующими ресурсами - такими как взаимодействие с файлами IO или GUI или еще что-то, то многопоточность может быть жизненно важной.
Ответ 2
Да, многопоточность полезна в одном ядре. Если один поток в приложении блокируется, ожидая чего-либо (скажем, данные с сетевой карты или жду, когда диск будет записывать данные), CPU может переключиться на другой поток, чтобы продолжить работу.
BeOS была написана с широко распространенным многопоточным анализом даже во времена одноядерных процессоров. Результатом стала очень отзывчивая ОС, хотя довольно сложная ОС для программирования.
Ответ 3
В одном ядерном процессоре приложение, использующее асинхронный (неблокирующий) ввод-вывод, будет несколько более эффективным, чем тот, который использует несколько потоков блокировки, поскольку он позволяет избежать накладных расходов на переключение контекста между потоками.
Кроме того, асинхронный ввод-вывод масштабируется лучше, чем блокирование ввода-вывода в потоках, поскольку накладные расходы на дополнительную операцию ввода-вывода минимальны по сравнению с накладными расходами на создание нового потока.
Сказав это, вы обычно не должны использовать однопоточный асинхронный ввод-вывод в новых приложениях, потому что почти все новые процессоры являются многоядерными. Вместо этого вы все равно должны использовать асинхронный ввод-вывод, но разделите работу между набором рабочих потоков, используя что-то вроде пула потоков. Ваша системная документация укажет вам идеальное количество рабочих потоков; обычно он равен количеству доступных процессорных ядер.