Непонимание разницы между однопоточным и многопоточным программированием

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

Предположим, что существует 9 независимых задач, и я хочу выполнить их с помощью однопоточной программы и многопоточной программы. В основном это будет примерно так:

однопоточных:

- Execute task 1
- Execute task 2
- Execute task 3
- Execute task 4
- Execute task 5
- Execute task 6
- Execute task 7
- Execute task 8
- Execute task 9

Многопоточное:

Резьба1:

- Execute task 1
- Execute task 2
- Execute task 3

Резьба2:

- Execute task 4
- Execute task 5
- Execute task 6

Thread3:

- Execute task 7
- Execute task 8
- Execute task 9

Как я понимаю, только один поток будет выполняться за один раз (получить CPU), и как только квант закончен, планировщик потоков даст процессорному времени другому потоку.

Итак, какая программа будет закончена раньше? Это многопоточная программа (логически)? или это однопоточная программа (поскольку многопоточность имеет много контекстных переключений, которая занимает некоторое время)? и почему? Мне нужно хорошее объяснение, пожалуйста:)

Ответ 1

Это зависит.

Сколько cpus у вас есть? Сколько операций ввода-вывода задействовано в ваших задачах?

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

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

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

Ответ 2

Как я понимаю, только один поток будет выполняться за один раз

Это было бы так, если бы процессор имел только одно ядро. Современные процессоры имеют несколько ядер и могут параллельно запускать несколько потоков.

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

Ответ 3

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

Для скомпилированных языков и языков, поддерживающих истинную многопоточность, один процессор может иметь много ядер. Фактически, большинство настольных компьютеров теперь имеют 2 или 4 ядра. Таким образом, многопоточная программа, выполняющая действительно независимые задачи, может заканчиваться в 2-4 раза быстрее в зависимости от количества доступных ядер в CPU.

Ответ 4

Допустимый набор: одноядерный без гиперпоточности; задачи связаны с процессором; Каждое задание занимает 3 кванта времени; Каждое распределение планировщика ограничено 1 квантом времени; Планировщик FIFO Неприемлемый; Все потоки попадают в планировщик одновременно; Все переключения контекста требуют одинакового количества времени;

Процессы разграничены следующим образом:

  • Тест 1: один процесс, один поток (содержит все 9 задач)
  • Тест 2: один процесс, три потока (содержит 3 задачи каждый)
  • Тест 3: Три Процесса, каждый из которых с одним потоком (содержит 3 задачи каждый)
  • Тест 4: три процесса, каждый с тремя потоками (содержит по одному заданию каждый)

С учетом вышеизложенных допущений все они заканчиваются одновременно. Это связано с тем, что для ЦП запланировано одинаковое количество времени, переключатели контекста идентичны, обработки прерываний нет, и IO ничего не ждет.

Чтобы узнать больше о природе, пожалуйста, найдите эту книгу.

Ответ 5

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

Процесс - это исполняемая программа. Создание процесса является ресурсоемкой задачей. Следовательно, можно разделить процесс на несколько блоков, называемых потоками. Нить - это легкий процесс. Можно разделить один процесс на несколько потоков и назначить им задачи. Когда в процессе есть один поток, он называется однопоточным приложением. Когда в процессе есть несколько потоков, это называется многопоточным приложением.

Ответ 6

ruby vs python vs nodejs: производительность в веб-приложении, которая занимает много операций ввода-вывода, не блокирующихrest/dbQuery, сильно повлияет. и будучи единственным многопоточным из всех 3, nodejs является победителем с большим отрывом