Чтобы предположить улучшение скорости из-за любой формы мультикомпьютера, вы должны предположить, что или несколько задач на базе ЦП выполняются одновременно на нескольких вычислительных ресурсах (обычно процессорных ядрах), или что не все задачи зависят отодновременное использование одного и того же ресурса - то есть некоторые задачи могут зависеть от одного системного подкомпонента (скажем, дискового хранилища), в то время как некоторые задачи зависят от другого (получение данных от периферийного устройства), а для других может потребоваться использование ядер процессора.
Первый сценарий часто называют «параллельным» программированием.Второй сценарий часто называют «параллельным» или «асинхронным» программированием, хотя иногда «параллельное» также используется для ссылки на случай простого разрешения операционной системе чередовать выполнение нескольких задач независимо от того, должно ли выполняться такое выполнение.размещайте последовательно или если для достижения параллельного выполнения можно использовать несколько ресурсов.В этом последнем случае «одновременный» обычно относится к способу записи выполнения в программе, а не с точки зрения фактической одновременности выполнения задачи.
Об этом очень легко говорить с помощьюмолчаливые предположения.Например, некоторые быстро заявляют о себе, например: «Асинхронный ввод-вывод будет быстрее, чем многопоточный ввод-вывод».Это требование сомнительно по нескольким причинам.Во-первых, это может быть случай, когда некоторая заданная инфраструктура асинхронного ввода-вывода реализована именно с многопоточностью, и в этом случае они являются одним и тем же, и нет смысла говорить, что одно понятие «быстрее, чем» другое,
Во-вторых, даже в случае однопоточной реализации асинхронной структуры (такой как однопоточный цикл обработки событий) вы все равно должны сделать предположение о том, что делает этот цикл.Например, одна глупая вещь, которую вы можете сделать с однопоточным циклом событий - это запрос к нему асинхронно завершить две разные задачи, связанные только с процессором.Если бы вы делали это на машине с идеализированным однопроцессорным ядром (игнорируя современные аппаратные оптимизации), то выполнение этой задачи «асинхронно» на самом деле не работало бы иначе, чем при ее выполнении с двумя независимо управляемыми потоками или с одним единственным процессом -- разница может быть связана с переключением контекста потока или оптимизацией расписания операционной системы, но если обе задачи идут на ЦП, в обоих случаях это будет похоже.
Полезно представить много необычного илиглупые угловые случаи, с которыми вы можете столкнуться.
«Асинхронный» не обязательно должен быть параллельным, например, как указано выше: вы «асинхронно» выполняете две задачи с привязкой к ЦП на машине с ровно одним ядром процессора.
Многопоточное выполнение не должно быть параллельным: вы порождаете два потока на машине с одним ядром процессора или запрашиваете два потока для получения любого другого вида дефицитного ресурса (представьте, скажем, сетевую базу данныхэто может только установитьпо одному соединению за раз).Выполнение потоков может быть с чередованием , однако планировщик операционной системы сочтет нужным, но их общее время выполнения не может быть уменьшено (и будет увеличено за счет переключения контекста потока) на одном ядре (или, в более общем случае, если выпорождают больше потоков, чем имеется ядер для их запуска, или имеют больше потоков, запрашивающих ресурс, чем то, что ресурс может выдержать).То же самое относится и к многопроцессорной обработке.
Таким образом, ни асинхронный ввод-вывод, ни многопоточность не должны обеспечивать какой-либо прирост производительности с точки зрения времени выполнения.Они могут даже замедлить работу.
Однако, если вы определите конкретный вариант использования, например, определенную программу, которая одновременно выполняет сетевой вызов для извлечения данных из подключенного к сети ресурса, такого как удаленная база данных, а также выполняет некоторые действия.локальные вычисления с привязкой к процессору, после чего можно начать рассуждать о различиях в производительности между двумя методами, учитывая конкретное предположение об аппаратном обеспечении.
Вопросы, которые нужно задать: Сколько вычислительных шагов мне нужно выполнить и сколько существует независимых систем ресурсов для их выполнения? Существуют ли подмножества вычислительных этапов, которые требуют использования независимых системных подкомпонентов и могут извлечь выгоду из этого одновременно? Сколько у меня процессорных ядер и каковы издержки на использование нескольких процессоров или потоков для выполнения задач на отдельных ядрах?
Если ваши задачи в значительной степени основаны на независимых подсистемах, то асинхронное решение может быть хорошим. Если бы количество потоков, необходимых для его обработки, было бы большим, так что переключение контекста стало нетривиальным для операционной системы, тогда однопоточное асинхронное решение могло бы быть лучше.
Всякий раз, когда задачи связаны одним и тем же ресурсом (например, нескольким потребностям для одновременного доступа к одной и той же сети или локальному ресурсу), многопоточность, вероятно, приведет к неудовлетворительным издержкам, и в то время как однопоточная асинхронность может вводить меньше накладных расходов, в такой ситуации с ограниченными ресурсами это тоже не может привести к ускорению. В таком случае единственный вариант (если вы хотите ускорить) состоит в том, чтобы сделать доступными несколько копий этого ресурса (например, несколько ядер процессора, если дефицитным ресурсом является ЦП; лучшая база данных, которая поддерживает больше одновременных соединений, если дефицитный ресурс база данных с ограничением соединения и т. д.).
Еще один способ выразить это: позволить операционной системе чередовать использование одного ресурса для двух задач не может быть быстрее, чем просто позволить одной задаче использовать ресурс, пока другая ждет, а затем позволить Второе задание закончить поочередно. Кроме того, стоимость планировщика чередования означает, что в любой реальной ситуации это фактически создает замедление. Не имеет значения, происходит ли чередующееся использование ЦП, сетевого ресурса, ресурса памяти, периферийного устройства или любого другого системного ресурса.