Может ли наличие нескольких потоков в одной базовой системе еще улучшить производительность?
Я только что изучил основы параллельной обработки в Java. Я прочитал этот вопрос: " Несколько потоков и производительность на одном процессоре", и мне стало интересно, нет ли другой причины, по которой несколько потоков могут работать быстрее, чем один поток в одноядерной системе. Я думал о том, что у каждого потока есть свой кусок памяти, который он использует. Представьте в Java, что FXML является частью основного потока. Это, вероятно, увеличит размер памяти основных потоков и, в свою очередь, может замедлить поток, потому что он должен загружать больше значений подкачки или, что еще хуже, должен делать больше обращений к памяти (я думаю, значения текущих потоков копируются в кэш).
Подводя итог, может ли создание нескольких потоков в одноядерной системе повысить производительность за счет разделенной памяти?
1 ответ
Наличие нескольких потоков на одном процессоре может повысить производительность в большинстве случаев, потому что в большинстве случаев поток не занят выполнением вычислений, он ожидает, что что-то произойдет.
Это включает в себя ввод-вывод, такой как ожидание завершения операции с диском, ожидание прибытия пакета из сети, ожидание пользовательского ввода и т. Д., И даже некоторые ситуации, не связанные с вводом-выводом, такие как ожидание другого потока сигнализировать о том, что произошло событие.
Таким образом, поскольку потоки проводят большую часть своего времени, не делая ничего, кроме ожидания, они конкурируют друг с другом за процессор гораздо реже, чем вы думаете.
Вот почему, если вы посмотрите на количество активных потоков в современном настольном компьютере, вы, вероятно, увидите сотни потоков, а если вы посмотрите на сервер, вы, вероятно, увидите тысячи потоков. Это явно намного больше, чем количество ядер, которые есть у компьютера, и, очевидно, этого не будет сделано, если от этого не будет никакой пользы.
Единственная ситуация, когда несколько потоков на одном ядре не улучшат производительность, - это когда потоки заняты непрерывными вычислениями. Это обычно происходит только в специализированных ситуациях, таких как научные вычисления, криптовалютный майнинг и т. Д.
Таким образом, несколько потоков в одноядерной системе обычно повышают производительность, но это очень мало связано с памятью, и в той степени, в которой это происходит, оно не имеет ничего общего с "разделенной" памятью.
На самом деле, запуск нескольких потоков (на одном и том же ядре или даже на разных ядрах на одном и том же чипе), которые в основном обращаются к разным областям памяти (и в большинстве случаев делают это), приводит к снижению производительности, поскольку каждый раз ЦП переключается с одного потока с другой стороны, он начинает получать доступ к другому набору ячеек памяти, которые вряд ли будут находиться в кеше ЦП, поэтому за каждым переключением контекста обычно следует шквал пропусков кеша, которые представляют служебную информацию. Но обычно оно того стоит.