нет преимуществ многопоточности с одним ядром - PullRequest
0 голосов
/ 30 мая 2019

Я новичок в параллельном программировании и многопоточности. Я могу понять преимущества многопоточности с многоядерными процессорами, но существуют ли эти преимущества на одноядерном процессоре,

Например, допустим, у нас есть многоядерный компьютер и программа для суммирования очень большого числа:

int sum = 0;
for (i=1, i<9999999999, i++)
{
   sum += i;
}

doOtherStuff();  // execute other function that is irrelevant to sum
...
...
//and then finally print the sum
Console.WriteLine(sum);

поэтому для задачи с длительной суммой мы можем создать второй поток для вычисления суммы, а основной поток продолжает выполнять другие функции.

Но если мы запустим эту программу на одноядерном компьютере, не будет никаких преимуществ для создания многопоточности, не так ли? еще хуже с многопоточностью из-за переключения контекста?

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Существует два основных преимущества многопоточности.

  1. Это позволяет выполнять непоследовательные вычисления одновременно, повышая скорость выполнения.

  2. Это также позволяет программе не останавливаться при ожидании блокирующих операций.

В вашем примере нет увеличения скорости выполнения,потому что процессор все еще должен выполнять каждую из команд в одном ядре.Однако, если вы ожидаете пользовательского ввода во время цикла (или выполняете другое блокирующее приложение), вы не сможете завершить doOtherStuff (), если он находится в том же потоке.Храня doOtherStuff () и его операции блокировки в отдельном потоке, вы не задерживаете выполнение операции суммирования.

Чтобы несколько приложений работали с одноядерным процессором, операционная система использует раундРобин исполнение.Он перемещается из одного потока / приложения в другой, выполняя несколько строк одновременно.Разделив ситуации блокировки на разные потоки, вы можете воспользоваться этим.Обычно это делается с помощью операций ввода-вывода.

Теперь, «это хуже?»

Если у вас ограниченная память, могут возникнуть проблемы, поскольку каждый поток несет свой собственный стек.Однако, поскольку операционная система уже переключает контекст между различными приложениями и операциями, недостаток времени выполнения путем добавления в циклический прием, вероятно, будет небольшим.

0 голосов
/ 30 мая 2019

В дополнение к ответу Джереми (все правильно) есть:

Многопоточные конструкции часто позволяют одному и тому же программному обеспечению использовать преимущества дополнительных ядер, если они доступны, без перекомпоновок.

Несколько потоков позволяют создавать независимые от выполнения подсистемы, которые можно добавлять в другие приложения с незначительным усилием или воздействием.

Многие проекты естественным образом поддаются нескольким потокам, альтернатива явным, конечным автоматам пользовательского уровня, является сложной и грязной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...