Подтвердить что ты не робот

Многопоточность имеет смысл для операций с привязкой к IO?

При выполнении многих операций с дисками многопоточная помощь, затруднение или не имеет значения?

Например, при копировании многих файлов из одной папки в другую.

Разъяснение. Я понимаю, что при выполнении других операций concurrency, очевидно, будет иметь значение. Если задача заключалась в том, чтобы открыть файл изображения, преобразовать в другой формат и затем сохранить, операции с дисками могут выполняться одновременно с манипуляцией с изображениями. Мой вопрос заключается в том, что единственными выполняемыми операциями являются операции с дисками, лучше ли выполняется очередность и реакция на операции с дисками.

4b9b3361

Ответ 1

Большинство ответов до сих пор имели отношение к планировщику ОС. Однако есть более важный фактор, который, я думаю, приведет к вашему ответу. Вы пишете на один физический диск или несколько физических дисков?

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

Однако, если вы пишете несколько потоков на несколько физических дисков, их одновременная обработка должна дать вам повышение производительности. Это особенно справедливо для управляемых дисков, таких как RAID-массивы, устройства SAN и т.д.

Я не думаю, что проблема имеет много общего с планировщиком ОС, поскольку она больше связана с физическими аспектами вашего (-ов) вашего диска.

Ответ 2

Это зависит от вашего определения "привязка ввода/вывода", но в целом многопоточность имеет два эффекта:

  • Одновременно используйте несколько процессоров (что не обязательно поможет, если узким местом является диск, а не процессор [s])

  • Используйте CPU (с другим потоком), даже если один поток заблокирован (например, ожидает завершения ввода/вывода)

Я не уверен, что ответ Konrad всегда прав, однако: как встречный пример, если "привязка ввода/вывода" означает "один поток проводит большую часть своего времени, ожидая завершения ввода-вывода, а не используя CPU", но не означает означает, что "мы достигли предела пропускной способности ввода-вывода системы", тогда IMO, имеющая несколько потоков (или асинхронный ввод-вывод), может повысить производительность (путем включения более одного одновременная операция ввода-вывода).

Ответ 3

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

В настоящее время я работаю над проектом, который имеет высокую степень линейности (чтение файлов от начала до конца). Мы используем NAS для хранения, и были обеспокоены тем, что произойдет, если мы запустим несколько потоков. Наша первоначальная мысль заключалась в том, что это замедлит нас, потому что это увеличит количество голов. Итак, мы провели несколько тестов и выяснили, что идеальное количество потоков такое же, как количество ядер в компьютере.

Но ваш пробег может отличаться.

Ответ 4

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

Это в основном помощь с четким программированием, а не с производительностью.

Ответ 5

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

Ответ 6

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

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

Ответ 7

Я думаю, что это может ухудшить производительность, потому что несколько потоков будут конкурировать за одни и те же ресурсы.

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